-
[Git Branch] (7) 브랜치 관리하기Git&GitHub/Git Branch 2022. 5. 18. 15:25728x90
[브랜치 관리하기]
여기서는 깃과 브랜치를 더 편하게 관리하기 위한 몇가지 명령을 살펴볼 것입니다. 하지만 아직 깃과 브랜치에 익숙하지 않다면 이해가 어려울 수 있습니다. 지금 이해하기 어렵다면 일단 이런 기능이 있다는 것만 살펴보시고, 다시 공부하실 때 보시면 그때는 더 쉽게 이해할 수 있을 겁니다.
<브랜치에서 checkout과 reset의 작동원리>
우리는 이미 checkout 명령과 reset 명령을 공부했습니다. 하지만 브랜치와 함께라면 더 다양하게 사용할 수 있습니다. 먼저 HEAD와 브랜치의 개념부터 간단하게 알아보겠습니다. 그래야 checkout과 reset 명령을 더 잘 이해할 수 있습니다.
1. 홈 디렉터리로 이동한 후 test라는 깃 저장소를 만들고 test 디렉터리로 이동합니다.
$ cd ~
$ git init test
$ cd test
2. 빔에서 c1.txt 파일을 만들고 숫자 '1'을 입력하고 저장합니다. 그리고 방금 만든 c1.txt를 스테이지에 올리고 커밋합니다.
커밋 메시지는 'c1'이라고 하겠습니다.
$ vi c1.txt
$ git add c1.txt
$ git commit -m "c1"
3. git log 명령을 실행해보세요 커밋 로그 첫번째 줄에 (HEAD -> master)표시가 있습니다. 여기에서 HEAD는 현재 작업트리가 어떤 버전을 기반으로 작업중인지를 가리키는 포인터입니다. HEAD는 기본적으로 master 브랜치를 가리킵니다. 그리고 브랜치는 기본적으로 브랜치에 담긴 커밋 중에서 가장 최근의 커밋을 가리킵니다. 예를 들어 저장소에 c1 커밋을 만들면 HEAD는 master브랜치를 가리키고 master 브랜치는 c1 커밋을 가리킵니다.
$ git log --oneline
4. 이제는 sub라는 브랜치를 만들겠습니다. sub 브랜치 또한 c1 커밋을 가리킵니다.
$ git branch sub
5. 다시 한번 빔에서 c2.txt 파일을 만들고 숫자 '2'를 입력후 저장합니다. 그리고 방금 만든 c2.txt를 스테이지에 올리고 'c2'라는 메시지와 함께 커밋합니다. 이제 master는 c2커밋을 가리키게 됩니다. HEAD는 그대로 master 브랜치를 가리키고 있습니다.
6. 이제 sub 브랜치에 커밋을 만들어 보겠습니다. master 브랜치에서 sub 브랜치로 이동하려면 git checkout 명령을 사용합니다. 앞에서도 자주 사용했던 git checkout 명령은 HEAD가 가리키는 것을 제어할 수 있습니다. 그래서 아래 명령을 실행하면 HEAD가 sub 브랜치를 가리키게 됩니다.
$ git checkout sub
7. sub브랜치에서 빔을 사용해 s1.txt문서를 만들고 내용은 's1'이라고 입력하고 저장합니다. s1.txt 문서를 스테이지에 올리고 's1'이라는 메시지와 함께 커밋하세요. 이제 HEAD는 sub 브랜치를 가리키고 sub는 s1 커밋을 가리키고 있습니다.
8. 브랜치가 여러 개일 때 reset 명령은 어떻게 사용할 수 있을까요? 앞에서 reset 명령으로 master 브랜치에 있던 여러 커밋 중 하나를 골라서 되돌아갔습니다. 브랜치가 여러개일 때는 현재 브랜치가 아닌 다른 브랜치에 있는 커밋을 골라서 최신 커밋으로 지정할 수 있습니다. 예를 들어 sub 브랜치에 있는 상태에서 master 브랜치에 있는 c2 커밋을 sub 브랜치의 최신 커밋으로 지정할 수 있습니다. 먼저 git log 명령을 사용해서 c2 커밋의 커밋해시를 확인합니다.
$ git log --oneline --branches
9. git reset 명령 다음에 c2 커밋의 커밋 해시를 입력합니다. 각자 확인한 커밋해시를 입력하면 됩니다.
$ git reset 각자의 c2커밋해시
10. 결과는 어떻게 되었을까요? git log 명령을 사용해 확인해 보겠습니다.
$ git log --oneline --branches --graph
11. sub브랜치의 최신 커밋이 master 브랜치의 최신 커밋인 c2로 바뀌었습니다. 그리고 HEAD는 그대로 sub 브랜치를 가리키고 있습니다. 이렇게 git reset 명령을 사용하면 현재 브랜치가 가리키는 커밋을 여러 브랜치 사이를 넘나들면서 제어할 수 있습니다. 이제 sub 브랜치는 c2 커밋을 가리키고 있기 때문에 원래 가리키고 있던 s1 커밋은 연결이 끊기면서 삭제됩니다.
정리해보죠. git checkout 명령을 사용하면 HEAD를 제어해서 브랜치를 이동할 수 있습니다. git reset 명령을 사용하면 HEAD가 가리키고 있는 브랜치의 최신 커밋을 원하는 커밋으로 지정할 수 있습니다. 이 때 어떤 브랜치에 있는 커밋이든 지정할 수 있으며, 명령을 수행한 뒤 브랜치와 연결이 끊긴 커밋은 삭제됩니다.
<수정 중인 파일 감추기 및 되돌리기 - git stash>
브랜치에서 파일을 수정하고 커밋하지 않는 상태에서 급하게 다른 파일을 커밋해야할 경우가 있습니다. 아직 커밋하지 않은 파일들을 그냥 두어도 상관없지만 계속 커밋하라는 메시지가 나타나기 때문에 번거롭습니다. 실수로 다른 파일과 함께 커밋이 될 수도 있고요. 이럴 때 아직 커밋하지 않고 작업중인 파일들을 잠시 감춰둘 수 있습니다. 그리고 당장 필요한 작업들을 끝낸 후 다시 감춰둔 파일들을 꺼내오면 됩니다. 이 방법에 대해 알아보겠습니다.
1. 홈 디렉터리로 이동한 후 st라는 저장소를 만들고 st 디렉터리로 이동합니다.
$ cd ~
$ git init st
$ cd st
2.git stash 명령을 사용하려면 파일이 tracked 상태여야합니다. 즉 한 번은 커밋한 상태여야하죠. 먼저 빔을 사용해 f1.txt 파일을 작성합니다. 아무 내용이나 간단히 입력하고 스테이지에 올린 후 'f1'이라는 메시지와 함께 커밋합니다.
3. f2.txt파일도 만들고 내용을 입력한 후 저장합니다. f2.txt 파일도 스테이지에 올린 후 'f2'라는 메시지와 함께 커밋합니다.
4. 빔에서 f1.txt 파일을 연 후 내용을 아무렇게나 수정하고 저장합니다. f2.txt 파일도 수정하고 저장합니다.
$ vi f1.txt <- 수정하고 저장
$ vi f2.txt <- 수정하고 저장
5. git status 명령을 실행해보면 현재 브랜치에서 f1.txt, f2.txt가 수정되었다고 나타납니다.
$ git status
6. 이제 f1.txt 파일과 f2.txt 파일을 커밋하기 전에 다른 파일을 수정해야 한다고 가정해봅시다. 커밋하지 않은 수정내용을 어딘가에 보관하려면 git stash 명령을 사용합니다. git stash save 또는 간단히 git stash라고만 해도 됩니다.
$ git stash
7. 다시 한번 git status 명령을 실행해 보세요. 조금전에 나타나던 modified 메시지가 사라졌습니다.
8. 같은 방법으로 여러 파일을 수정한 후 따로 보관할 수 있으며, 이렇게 감춘 파일들은 stash 목록에서 확인할 수 있습니다. 가장 먼저 감춘 것은 stash@{0}에 들어있는데, 앞으로 다른 파일이 추가되면 기존 파일은 stash@{1}로 옮겨지고 새로 추가된 파일은 stash@{0}에 담깁니다. 즉, 가장 최근에 보관한 것이 stash@{0}에 담깁니다. 먼저 감춘 것을 아래에, 가장 최근에 감춘 것을 위에 쌓기 때문에 stash 스택(stack)이라고도 표현합니다.
9. 급한 작업을 모두 마쳤다면 감춰둔 파일을 꺼내와 계속 수정하거나 커밋할 수 있습니다. git stash 명령 뒤에 pop를 추가하면 stash 목록에서 가장 최근 항목을 되돌립니다. 여기에서는 f1.txt와 f2.txt가 수정된 상태로 되돌아갑니다.
$ git stash pop
** stash apply와 stash pop**
stash 목록에서 저장된 수정 내용을 나중에 또 사용할지도 모른다면 git stash apply 명령을 사용합니다. stash 목록에서 가장 최근 항목을 되돌리지만 저장했떤 내용은 그대로 남겨둡니다.
git stash drop 명령은 stash 목록에서 가장 최근 항목을 삭제합니다.
728x90'Git&GitHub > Git Branch' 카테고리의 다른 글
[Git Branch] (6) 브랜치 병합하기 (0) 2022.05.18 [Git Branch] (5) 브랜치 사이의 차이점 알아보기 (0) 2022.05.18 [Git Branch] (4) Git Branch 정보 확인하기 (0) 2022.05.18 [Git Branch] (3) Git Branch 브랜치 사이 이동하기 - git checkout (0) 2022.05.18 [Git Branch] (2) Git Branch 만들기 (0) 2022.05.18