step1이 리뷰어로부터 approved, merged 되었기 때문에, 베이스 저장소에서는 step1에 관한 건 아예 끝났고, 로컬 저장소에서도 더 이상 건들일 일이 없기때문에 삭제해도 무방하다. 다음과 같은 명령어로 삭제했다.
$ git checkout [로컬_메인_브랜치_이름]
$ git branch -D [step1]
내 메인 브랜치는 로컬에서는 작업하지 않는다. 메인 브랜치는 베이스 저장소에 있는 최종 결과물을 업데이트하기로 한다. 그래서 베이스 저장소에서 merged 된 최종 결과물을 가져오려고 한다. 동기화 작업을 해야한다. 먼저, 베이스 저장소를 다음과 같은 명령어로 가져온다.
$ git remote add -v [가져올_베이스_저장소의_브랜치의_이름] [로컬에서_지정할_이름] [베이스_저장소_url]
그러면 git remote -v
를 통해 가져온 베이스 저장소를 확인할 수 있다. 방금 가져온 베이스 저장소를 동기화 할 수 있다.
$ git fetch [로컬에서_지정한_베이스_저장소_이름] [로컬_메인_브랜치_이름]
git fetch
는 리모트 저장소에는 있지만 로컬에는 없는 커밋들을 다운받는다. 그리고 리모트 브랜치가 가리키는 곳을 업데이트한다. 방금과 같은 경우에는 베이스 저장소에서 가져온 브랜치가 가리키는 곳을 업데이트한다.
$ git branch
fetch
뒤에 git branch
명령어를 확인해보면 [가져온_베이스_저장소의_브랜치의_이름]
라고 나온다. 예를 들면, kyu-kim-kr/step1
과 같이 뜬다. /
로 구분되어진 것은, 베이스 저장소에 있는 kyu-kim-kr
에서 step1
이 merged 되었기 때문에 이름이 kyu-kim-kr/step1
처럼 나온 것이다. step2
가 merged 되면 kyu-kim-kr
브랜치에서 step2
가 업데이트 되면서 kyu-kim-kr/step2
를 git fetch
를 통해 가져올 수 있을 것이다.
그런데 동기화를 하기위해 git fetch
명령어를 입력했지만 실제로는 로컬 상태를 전혀 바꾸지 않는다. 실제로 git fetch
하고 코드 상태를 확인해보면 그대로이다. 이때는 그냥 커밋들을 다운로드했다고 정도로 이해하면 된다.
git fetch 했을 때 다운로드 완료된 상태
실제로 git fetch 하면 내 로컬의 상태가 바뀌는 게 아니라 commit들이 그 아래로 다운로드 되었을 뿐이다.
git fetch
로 다운로드한 커밋들을 내 작업에 반영하기 위한 명령어는 여러개가 존재한다.
git cherry-pick
git rebase
git merge
등등
사실 git fetch 후 merge 하는 일이 드문일이라 이 일을 동시에 하는 명령어가 존재하는데 그게 바로 자주 보고 들었던 git pull
이다.
내게 주어진 미션은 git rebase
를 통해 커밋들을 한 줄기로 깔끔하게 정리하는 것이었다. git fetch
이후에 git rebase [가져온_베이스_저장소_이름] [가져온 베이스_저장소의_브랜치]
를 입력하면 내 메인 브랜치가 바뀐 모습을 볼 수 있다. (가져온 베이스 저장소의 브랜치와 내 메인 브랜치 이름이 같을 때)
브랜치라는 것이 단순히 커밋들을 참조하는 것이라는 것을 이해하면 여러 상황에서 당황하지 않을 수 있다
이번에 나 같은 경우엔, step이 베이스 저장소에 merged 되지 않은 상태에서 git branch -D
를 통해서 로컬 저장소에 있는 step을 삭제해버려 main
만 남은 상태였다.
근데 브랜치는 단순히 커밋을 참조하는 것이고 브랜치와 함께 커밋이나 데이터가 삭제되지 않았다는 것을 이미 알고 있었기 때문에, 천천히 생각해서 해결할 수 있었다.
먼저 커밋들은 아직 살아남은 상태이기 때문에 HEAD를 이전에 브랜치가 가리키던 커밋으로 옮겨서 새 브랜치를 만들어주기만 하면 되었다.