[깃] 원격저장소와 동기화

Kyu·2021년 2월 13일
1

Git 공부기록

목록 보기
3/4

git remote, git fetch, git rebase, Detached HEAD, git switch -c

step1이 리뷰어로부터 approved, merged 되었기 때문에, 베이스 저장소에서는 step1에 관한 건 아예 끝났고, 로컬 저장소에서도 더 이상 건들일 일이 없기때문에 삭제해도 무방하다. 다음과 같은 명령어로 삭제했다.

$ git checkout [로컬_메인_브랜치_이름]
$ git branch -D [step1]

git remote

내 메인 브랜치는 로컬에서는 작업하지 않는다. 메인 브랜치는 베이스 저장소에 있는 최종 결과물을 업데이트하기로 한다. 그래서 베이스 저장소에서 merged 된 최종 결과물을 가져오려고 한다. 동기화 작업을 해야한다. 먼저, 베이스 저장소를 다음과 같은 명령어로 가져온다.

$ git remote add -v [가져올_베이스_저장소의_브랜치의_이름] [로컬에서_지정할_이름] [베이스_저장소_url]

그러면 git remote -v를 통해 가져온 베이스 저장소를 확인할 수 있다. 방금 가져온 베이스 저장소를 동기화 할 수 있다.

git fetch

$ 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/step2git 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 rebase 를 통해 커밋들을 한 줄기로 깔끔하게 정리하는 것이었다. git fetch 이후에 git rebase [가져온_베이스_저장소_이름] [가져온 베이스_저장소의_브랜치] 를 입력하면 내 메인 브랜치가 바뀐 모습을 볼 수 있다. (가져온 베이스 저장소의 브랜치와 내 메인 브랜치 이름이 같을 때)

Detached HEAD, git switch -c [new-branch-name]

브랜치라는 것이 단순히 커밋들을 참조하는 것이라는 것을 이해하면 여러 상황에서 당황하지 않을 수 있다

이번에 나 같은 경우엔, step이 베이스 저장소에 merged 되지 않은 상태에서 git branch -D를 통해서 로컬 저장소에 있는 step을 삭제해버려 main만 남은 상태였다.

근데 브랜치는 단순히 커밋을 참조하는 것이고 브랜치와 함께 커밋이나 데이터가 삭제되지 않았다는 것을 이미 알고 있었기 때문에, 천천히 생각해서 해결할 수 있었다.

먼저 커밋들은 아직 살아남은 상태이기 때문에 HEAD를 이전에 브랜치가 가리키던 커밋으로 옮겨서 새 브랜치를 만들어주기만 하면 되었다.

profile
TIL 남기는 공간입니다

0개의 댓글