[Git] 7.2. CLI로 checkout하기

업데이트:

카테고리:

태그: , , , , , , ,

CLI를 이용한 브랜치 체크아웃 및 새 커밋 생성

앞 절에서 만든 [mybranch1] 브랜치로 체크아웃하고, 새로운 커밋을 생성한 뒤에 결과를 확인한다.

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git checkout mybranch1 # 브랜치 체크아웃
Switched to branch 'mybranch1'

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git branch # 현재 브랜치 확인
master

- mybranch1

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git log --oneline --all # HEAD 변경 확인
272deb9 (HEAD -> mybranch1, origin/master, master) 두 번째 커밋
b45b44d 첫 번째 커밋

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ cat file1.txt
hello git
second

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ echo "third - my branch" >> file1.txt

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ cat file1.txt
hello git
second
third - my branch

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git status
On branch mybranch1
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: file1.txt

no changes added to commit (use "git add" and/or "git commit -a")

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git add file1.txt
warning: LF will be replaced by CRLF in file1.txt.
The file will have its original line endings in your working directory

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git commit -m "mybranch1의 첫 번째 커밋"
[mybranch1 719c7a1] mybranch1의 첫 번째 커밋
1 file changed, 1 insertion(+)

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git log --oneline --all
719c7a1 (HEAD -> mybranch1) mybranch1의 첫 번째 커밋
272deb9 (origin/master, master) 두 번째 커밋
b45b44d 첫 번째 커밋

위의 코드를 git bash에서 실행한 결과이다.

image


CLI를 이용한 빨리 감기 병합

  1. [mybranch1] 브랜치에서 커밋을 추가로 한 번 더 한다.
  2. [master] 브랜치로 체크아웃한다.
  3. [master] 브랜치와 [mybranch1] 브랜치를 병합한다.
tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ echo "fourth - my branch" >> file1.txt # 파일에 내용 추가

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git status # 스테이지 상태 확인
On branch mybranch1
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: file1.txt

no changes added to commit (use "git add" and/or "git commit -a")

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git add file1.txt # 스테이지에 추가
warning: LF will be replaced by CRLF in file1.txt.
The file will have its original line endings in your working directory

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git commit -m "mybranch1 두 번째 커밋" # 신규 커밋 추가
[mybranch1 9e5110b] mybranch1 두 번째 커밋
1 file changed, 1 insertion(+)

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git log --oneline --all --graph # 커밋 로그 보기

- 9e5110b (HEAD -> mybranch1) mybranch1 두 번째 커밋
- 719c7a1 mybranch1의 첫 번째 커밋
- 272deb9 (origin/master, master) 두 번째 커밋
- b45b44d 첫 번째 커밋

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git checkout master # 마스터 브랜치 체크아웃
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ cat file1.txt
hello git
second

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git merge mybranch1 # 병합, Fast-forward
Updating 272deb9..9e5110b
Fast-forward
file1.txt | 2 ++
1 file changed, 2 insertions(+)

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git log --oneline --all --graph # 로그 확인

- 9e5110b (HEAD -> master, mybranch1) mybranch1 두 번째 커밋
- 719c7a1 mybranch1의 첫 번째 커밋
- 272deb9 (origin/master) 두 번째 커밋
- b45b44d 첫 번째 커밋

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ cat file1.txt # 파일 상태 재확인
hello git
second
third - my branch
fourth - my branch

위의 코드를 실행한 결과 다음과 같다.

image

image


reset –hard로 브랜치 되돌리기

reset은 현재 브랜치를 특정 커밋으로 되돌릴 때 사용한다. git reset --hard 명령은 현재 브랜치를 지정한 커밋으로 옮긴 후 해당 커밋의 내용을 작업 폴더에도 반영한다.

\*hard reset

$ git reset --hard <이동할 커밋 체크섬>
현재 브랜치를 지정한 커밋으로 옮긴다. 작업 폴더의 내용도 함께 변경


git reset –hard 명령을 사용하려몀 커밋 체크섬을 알아야한다. 커밋 체크섬은 git log를 통해 확인할 수 있지만 CLI에서 복잡한 커밋 체크섬을 타이핑하는 것은 번거로운 일이기 때문에 HEAD~ 또는 HEAD^ 로 시작하는 약칭을 사용할 수 있다.


HEAD~ 은 헤드의 부모 커밋, HEAD~2 는 HEAD의 할아버지 커밋을 말한다. 즉, HEAD~n은 HEAD로부터 n번째 위쪽 조상 이라는 뜻이다.


HEAD^<숫자>

HEAD^은 똑같이 부모 커밋이다. 반면 HEAD^2는 두 번째 부모를 가리킨다. 병합 커밋처럼 부모가 둘 이상인 커밋에서만 의미가 있다.


master를 두 커밋 이전으로 옮겨보자.

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git reset --hard HEAD~2 # 브랜치 되돌리기
HEAD is now at 272deb9 두 번째 커밋

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git log --oneline --all # 로그 확인
9e5110b (mybranch1) mybranch1 두 번째 커밋
719c7a1 mybranch1의 첫 번째 커밋
272deb9 (HEAD -> master, origin/master) 두 번째 커밋
b45b44d 첫 번째 커밋

실행결과는 다음과 같다.

image

log 명령을 통해서 HEAD -> master가 달라진 것을 확인할 수 있다.


빨리 감기 병합 상황에서 rebase하기

$ git rebase <대상 브랜치> 명령은 현재 브랜치에만 있는 새로운 커밋을 대상 브랜치 위로 재배치시킨다. 또한 빨리 감기 병합이 가능한 경우 rebase 명령을 수행하면 빨리 감기 병합을 실시한다. merge 명령 대신 rebase를 이용해 빨리 감기 병합을 하고 [mybranch1] 브랜치를 제거해보자.

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git checkout mybranch1
Switched to branch 'mybranch1' # 브랜치 변경

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git rebase master # rebase 시도
Current branch mybranch1 is up to date.

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git log --oneline --all # 로그 확인, 변한 게 없다.
9e5110b (HEAD -> mybranch1) mybranch1 두 번째 커밋
719c7a1 mybranch1의 첫 번째 커밋
272deb9 (origin/master, master) 두 번째 커밋
b45b44d 첫 번째 커밋

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (mybranch1)
$ git checkout master # master 브랜치 체크아웃
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git rebase mybranch1 # 반대 방향에서 rebase
Successfully rebased and updated refs/heads/master.

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git log --oneline --all # 로그 확인, 빨리감기 병합이 되었다.
9e5110b (HEAD -> master, mybranch1) mybranch1 두 번째 커밋
719c7a1 mybranch1의 첫 번째 커밋
272deb9 (origin/master) 두 번째 커밋
b45b44d 첫 번째 커밋

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git push
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 593 bytes | 593.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/Orchemi/hello-git-cli.git
272deb9..9e5110b master -> master

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git branch -d mybranch1 # 브랜치 삭제
Deleted branch mybranch1 (was 9e5110b).

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git log --oneline --all -n2
9e5110b (HEAD -> master, origin/master) mybranch1 두 번째 커밋
719c7a1 mybranch1의 첫 번째 커밋

위 코드의 실행결과는 다음과 같다.

image


배포 버전에 태깅하기

태그는 주석 있는 태그와 간단한 태그의 두 종류가 있다. 일반적으로 주석 있는 태그의 사용을 권장한다.

  • **git tag -a -m <간단한 메시지=""> <태그 이름=""> [브랜치 또는 체크섬]**
    -a 로 주석 있는(annotated) 태그를 생성한다. 메시지와 태그 이름은 필수이며 브랜치 이름을 생략하면 HEAD에 태그를 생성한다.


  • **git push <원격저장소 별명=""> <태그 이름="">**
    원격저장소에 태그를 업로드


tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git log --oneline
9e5110b (HEAD -> master, origin/master) mybranch1 두 번째 커밋
719c7a1 mybranch1의 첫 번째 커밋
272deb9 두 번째 커밋
b45b44d 첫 번째 커밋

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git tag -a -m "첫 번째 태그 생성" v0.1

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git log --oneline
9e5110b (HEAD -> master, tag: v0.1, origin/master) mybranch1 두 번째 커밋
719c7a1 mybranch1의 첫 번째 커밋
272deb9 두 번째 커밋
b45b44d 첫 번째 커밋

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git push origin v0.1
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 186 bytes | 186.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/Orchemi/hello-git-cli.git

- [new tag] v0.1 -> v0.1

위 코드의 실행결과이다.

image


  • 태그는 차후에 커밋을 식별할 수 있는 유용한 정보이므로 잘 활용하는 것이 좋다.
  • 태그를 사용하면 GitHub의 [Tags] 탭에서 확인할 수 있고, [Release] 탭에서 다운받을 수도 있다.


Reference

  • 팀 개발을 위한 Git GitHub 시작하기, 한빛미디어, 정호영,진유림

댓글남기기