생활코딩의 [Git CLI - 버전관리] 강의를 듣고 정리하는 글.
Command Line에서 Git을 실행하는 법을 알아보자.
Git-CLI의 장점
- 일단 익숙해지면 복잡한 GUI 없이 간단하게 Git을 다룰 수 있다.
- 명령어의 특성상 처리해야 할 일을 한번에 명령해서 자동화를 할 수 있다.
- GUI로 제어할 수 없는 서버 환경에서도 사용할 수 있는 유일한 방법이다.
저장소를 만드는 방법
git init
초기화. 현 디렉토리를 git에게 버전관리 시키는 것.
해당 명령어를 실행하면 .git 폴더가 생긴다. 이것이 git repository(저장소)다.
버전을 생성하는 방법
Working Tree : 파일을 수정하는 곳. 개발, 작업을 하는 곳
Staging Area : 버전을 만들 파일을 두는 곳
Repository : 만들어진 버전을 저장하는 곳
git status
해당 명령어를 입력하면 현재 상태를 알 수 있다. 다음과 같은 상태가 있다.
No commits yet // 아직 버전이 없음
Untracked files: // 추적되지 않고 있음
Changes to be committed: // 해당 파일이 Staging Area에 올림
nothing to commit, working tree clean // commit 할 파일이 없음, 버전이 될 수정사항이 없음
Changes not staged for commit: // 수정사항이 Staging Area에 있지 않다.
git은 명시적으로 해당 파일을 버전 관리할 것임을 한 번 알려줘야 한다. 그 명령어가 add다.
git add <file>
그러면 해당 파일이 Staging Area에 올라가게 된다. git status에 대한 상태도 Changes to be committed: 으로 바뀐다.
git commit
git commit -m <version>
이 상태에서 위 명령어를 입력하면 버전이 생성된다. (git status : nothing to commit, working tree clean)
파일을 수정하면 git status가 Changes not staged for commit: 이렇게 되고, 다시 git add를 한뒤에 git commit을 해주면 된다.
+
git log
를 입력하면 버전에 대한 기록이 뜬다. 버전 이름과 올린 사람, 그리고 날짜.
Author: Lai-khan <40736969+Lai-khan@users.noreply.github.com>
Date: Tue Jun 2 23:41:37 2020 +0900
Message 1
여러개의 파일을 버전으로 만들 때
기존 파일은 수정하고, 새로운 파일을 하나 만들었을 때, git status의 결과는 다음과 같다.
// 기존 파일 수정
Changes not staged for commit:
// 새로운 파일 생성
Untracked files:
여기서 기존 파일을 한 번 이상 버전 관리를 했기 때문에 기존 파일은 기억을 하고 있다. 그러나 새로운 파일은 한 번도 버전 관리를 한 적이 없기 때문에 없는 파일로 친다. 어쨌건 Staging Area에 올릴때는 둘다 git add 명령어를 쓴다.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: hello1.txt
new file: hello2.txt
둘 다 add 하면 status가 다음과 같이 된다. 기존 파일은 modeified:로, 새로운 파일은 new file:로
+git log 명령어에 --stat 옵션을 붙이면 좀 더 자세히 로그를 볼 수 있다.
버전 간의 차이 비교
기존 파일에서 일부분을 지우고 새로운 내용을 넣은 뒤 저장해보자. 그런 뒤 git status를 쳐보면 modified라고 뜬다.
이때 무엇이 바뀌었는지 구체적으로 볼 수 있는 명령어가 있다.
git diff
그러면 무엇이 바뀌었는지 이렇게 표시해준다.
diff --git a/hello1.txt b/hello1.txt
index 01e79c3..b6bebeb 100644
--- a/hello1.txt
+++ b/hello1.txt
@@ -1,3 +1,3 @@
1
2
-3
+four
이때 바꾼 내용이 맘에 안들어 되돌리고 싶다면 다음 명령어를 쓰면 된다.
git reset --hard
그러면 수정한 파일이 수정하기 전의 상태로 되돌아가 있을 것이다.
git log -p
log 뒤에 -p를 붙이면 마지막 버전 이후에 어떤 변화가 있었는지를 보여준다.
checkout
git log를 쳐보면 지금까지의 기록이 보이는데 제일 위를 보면 commit 끝에 이런 표시가 있을 것이다.
commit 4e1a3511b995cf765fe51715060a1ca40f9ee42a (HEAD -> master)
현재 상태가 master의 마지막 버전을 가리키고 있다는 것이다.
그럼 그 아래의 다른 버전으로 가려면 어떻게 해야할까? 그런 역할을 하는 명령어가 바로 이것이다.
git checkout <commit ID>
그러면 파일 상태가 이 commit ID가 가리키는 버전을 만든 시점으로 돌아간다.
commit 2b0aa80f35b9405d2bb9afba8e45e99d999c18df (HEAD)
git log를 쳐보면 HEAD가 checkout한 commit을 가리키고 있다.
다시 최신상태로 돌아가고 싶다면 이렇게 입력하면 된다.
git checkout master
++보충
● git add를 매번 하지 않는 방법
git add .
git add 명령어 뒤에 .을 찍으면 현재 디렉토리에 밑에 있는 모든 파일을 add 해준다.
git commit -am <commit Message>
또는 git commit할 때 뒤에 -am 옵션을 붙여주면 add와 commit이 한번에 된다.
다만 이제 Untracked 된 파일이 있는 상태에서 위 명령어를 사용할 경우 에러가 뜬다. 이 경우는 자동으로 add가 되지 않는다. 최초 한번은 add를 해줘서 tracked 상태가 되어야지만 그 파일을 자동으로 추가해준다.
● commit 메시지를 작성할 때 실행되는 기본 에디터를 변경하는 방법
-m 옵션은 commit line에서 직접 commit Message를 적을 때 쓴다.
-m을 안쓰도 그냥 commit을 하면 기본 에디터가 뜬다. 이 상태에선 좀더 자세한 여러줄의 커밋 메시지를 쓸 수 있다.
하지만 이 에디터는 익숙하지 않은 에디터다. 선호하는 에디터로 바꾸려면 어떻게 해야할까?
vim 에디터를 쓴다고 하면,
git config --global core.editor "vim"
config는 설정을 바꾸는 것이다. global, 이 컴퓨터 전체의 에디터를 vim으로 바꾼다.
버전 삭제
버전이 commit한 순서대로 Message1 - Message2 - Message3이 있고, 현재 HEAD가 가리키는 버전은 Message3이다. 이 상태에서 Message3을 지우고 Message2로 돌아가고 싶다면 reset 명령어를 쓸 수 있다.
git reset --hard <commit ID>
checkout과는 다르게 특정 버전을 가리키고 마는 것이 아니라 아예 그 버전이 되는 것이다. (=해당 버전으로 리셋하겠다.)
reset에는 여러 모드가 있다.
--soft
--mixed
--hard
--merge
hard는 이전 버전 뿐만 아니라 수정하고 있던 것까지도 지워버리는 모드다. 가장 강력하다.
버전만 지우고, 수정하고 있던 것은 살리고 싶다면 soft나 mixed 버전을 사용해야 한다.
버전 되돌리기
버전 되돌리기는 버전 삭제와 비슷하면서도 다르다.
git revert <commit ID>
명령어는 다음과 같다.
다음과 같이 버전이 있다.
commit 4e1a3511b995cf765fe51715060a1ca40f9ee42a (HEAD -> master)
Message3
commit 2b0aa80f35b9405d2bb9afba8e45e99d999c18df
Message2
commit 2206e5a3eb100c77b156c10e2528f412caa57538
Message 1
Message3에서 Message2의 상태로 돌아가고 싶을 때 쓰는 것이 revert다.
reset은 아예 그 버전이 되는 것이지만 revert는 다르다. 커밋을 유지하면서 상태만 되는 것이다. 그래서 Message3의 commit ID가 필요하다.
그리고 revert를 하면 새로운 버전이 생긴다.
commit dbc88e93292ee2d2ce64ac1081edb12605965dd7 (HEAD -> master)
Revert "R4"
commit 4e1a3511b995cf765fe51715060a1ca40f9ee42a
Message3
commit 2b0aa80f35b9405d2bb9afba8e45e99d999c18df
Message2
commit 2206e5a3eb100c77b156c10e2528f412caa57538
Message 1
이전 commit은 사라지지 않았다. 그러나 상태는 Message3와 같다.
즉 현 commit ID에서의 변화를 취소하는 것이다. (=Message3가 되는 것)
그렇다면 Message1 상태로 돌아가고 싶다면 어떻게 해야할까?
Message2를 바로 revert하면 충돌이 일어난다.
위 상태에서 R4를 revert하고, Message3을 revert하고, Message2를 revert하면 비로서 Message1 상태로 돌아갈 수 있다.
반드시 역순으로 revert해야 한다.
Git 명령어 정리
// initialize repository
git init
// working tree status
git status
// add to staging area
git add <file>
// create version
git commit
git commit -m <version>
// show version
git log
git log --stat
git log -p
// show changes
git diff
// version change
git checkout
// version reset
git reset --hard
// revert
git revert
'공부 > 기타' 카테고리의 다른 글
GitHub Action을 사용해 PR 올릴 때 자동으로 build 하기 (0) | 2022.06.11 |
---|---|
[Deno] 신생 JS & TS 런타임 데노(Deno) (0) | 2020.06.02 |