안녕하세요. 이번 시간에는 기준을 재지정 할 때 쓰일 수 있는 git rebase에 대해 간단하게 알아보겠습니다.

 


 먼저 test branch에는 227fdfa3과 185dfc5c 이 두 브랜치가 쌓여 있습니다.

 

 227fd..는 1.txt에 1, 2, 3이 추가된 것입니다.

 

 185df...는 2.txt에 1, 2, 3이 추가된 것입니다.

 

 다음에 master 브랜치에 있는 d2bc7e9a는 1, 3이 3.txt에 추가된 것입니다.

 

 git rebase test를 입력해 보겠습니다.

 

 그랬더니, 요래 바뀌어 버렸습니다. 어떻게 수행된 것일까요? master인 상태에서 git rebase test를 입력하였습니다. 문서를 보면, 현재 branch가 topic인 경우, git rebase master와 git rebase master topic이 동일하게 수행된다고 되어 있습니다.  지금 제 current branch는 master였고, 저는 git rebase test를 했습니다. 따라서, 현재 branch가 master였던 제 상황에서 git rebase test와 git rebase test master는 동일한 일을 수행합니다.

 

 어떻게 수행되는가? 위 그림을 보면, test의 head에 3.txt add라는 커밋이 쌓인 것에다가 master의 3.txt add 커밋이 다시 쌓였음을 알 수 있습니다.

 

 

 그림으로 그리자면 원래는 이런 상황이였습니다. 중간에 튀어 나온 3.txt add가 있습니다. master에만 적용된 것입니다. 이 상황이였는데, 아래와 같은 상황이 되어버린 셈입니다.

 

 

 master의 3.txt add가 붙는 기준점이 2.txt add 커밋으로 변경되었습니다. test의 HEAD과 같습니다. 즉 test의 HEAD 다음에 3.txt add가 붙어버렸습니다. 기준점이 2.txt add이기 때문입니다. 그 다음에 3.txt add 커밋이 붙고 해당 커밋을 master가 가르킵니다.

 


 다시 이 상황으로 돌아옵시다. 위 그림과 같은 상황에서, git rebase master test 명령을 입력했다면 어떻게 되었을까요?

 

 한 번 입력해 봅시다. 그러면 updated refs/heads/test 메세지가 뜹니다. 이 경우, master의 head가 기준점이 되고, 그 기준점으로부터 1.txt add와 2.txt add가 붙습니다. 그 다음에, 마지막 커밋인 2.txt add에 test가 붙습니다.

 

 

그림으로 그리면 이런 상황이 되겠습니다. 정말 그렇게 변했는지 커밋 그래프를 확인해 보겠습니다.

 

 master는 3.txt add까지 반영되어 있고, 다음 1.txt add와 2.txt add는 test에서 추가로 쌓인 커밋들이네요. git checkout test를 실행해서 3.txt가 잘 있나 보겠습니다.

 

 1, 3이 적혀있는 3.txt가 잘 있음을 확인할 수 있습니다. 이는 test의 기준점이 main commit이 아니라, master의 3.txt add였기 때문이 가능합니다. 해당 커밋이 1, 3이 적혀져 있는 3.txt가 추가되는 것이기 때문입니다. 다음 시간에 -onto 옵션을 알아보도록 하겠습니다.