git diff 브랜치 비교하는 방법을 알아봅시다.

GIT 2022. 11. 4. 02:00

 이번 시간에는 git diff에서 브랜치를 어떻게 비교하는지 알아봅시다.

 


 먼저 master의 최신 브랜치에서 분기된 stage 브랜치가 있습니다. 여기에 commit된 변경 사항은 1.txt가 변경되었다는 것과, 파일 stage.txt가 추가되었다는 것입니다. change 내역을 보겠습니다.

 

 

 1.txt에는 5가 추가되었습니다.

 

 

 다음에 stage.txt에는 1, 2, 3, 4, 5가 추가되었음을 볼 수 있습니다.

 

 

 master의 상태를 보겠습니다. main의 최신 커밋에서 분기를 한 것이 stage인데요.

 

 

저는 이 main에다가 추가된 2.txt를 반영하려고 해요. 아직 2.txt가 추가된 것은 commit이 되지 않았습니다.

 

 main의 현재 상태는 main의 최신 버전에서, 2.txt라는 파일이 추가되었다는 변경 사항이 아직 commit이 되지 않았다 정도가 되겠습니다. 여기서 정리. main의 최신 커밋과 비교했을 때, cd8c1c54는 stage.txt가 추가되었고, 1.txt에 5가 추가되었어요. 그러면, stage의 최신 커밋인 cd8c1c54와 main의 최신 커밋과 비교하면, stage.txt가 제거되고, 1.txt에 5가 제거되는 것입니다.

 

 


 이제, git diff cd8c1c54를 입력해 보겠습니다. 어떻게 결과가 나오는지 봅시다. 그러면, 1.txt에서 5가 제거된다고 나옵니다.

 

 

 다음에 stage.txt가 제거된다고 나와요. 일단, 여기까지는 stage의 최신 커밋 대비 master의 최신 커밋이 어떻게 다른지 보여주는 것입니다. 그런데, 2.txt가 추가되었다는 것은 왜 나온 것일까요? 이는 cd8c 커밋과 비교해서 master의 최신 커밋에서 2.txt가 추가된 상태를 비교했기 때문입니다. 문서에서는 "the working tree not yet staged" 부분을 보시면 됩니다.

 

 실제로 아래와 같이 명령어를 입력해 보겠습니다.

 

 

 현재 HEAD가 가리키고 있는 부분과 비교했을 때, working tree에는 있지만, not yet staged인 2.txt가 추가되었다는 정보가 diff의 출력 결과에 보임을 확인할 수 있어요.

 

 

 현재 HEAD는 어디에 있나요? 확인해 보면 refs/heads/master에 있습니다. detached된 상태는 아니네요. master에 있으므로, 파일 .git/refs/heads/master의 내용을 출력해 보면, 5bf6d... 가 나오게 됩니다.

 

 

 해당 커밋은 5bf6d358인데요. 결국 git diff HEAD는 master 브랜치에 해당 커밋이 반영된 내용과, master에 반영하려고 하는 내용을 비교했을 때 어떤 것이 바뀌는지를 출력해 주게 됩니다. 문서에는 if you run git commit -a라고 언급된 부분을 보시면 됩니다.

 

 


 그런데 우리는 이런 작업을 생각보다 많이 하게 됩니다. 특정 브랜치의 최신 커밋과 현재 작업하고 있는 브랜치에 반영하려고 하는 상태를 비교한다. 어떻게 하면 될까요?

 

 

 stage의 최신 커밋에는 stage second라는 커밋이 또 쌓인 상태입니다. 이 커밋은 1.txt에 6이라는 내용이 추가된 것입니다.

 

 

 git diff BRANCH를 하시면 됩니다. 그러면 BRANCH의 최신과 비교했을 때, 현재 작업하고 있는 branch에 반영하려고 하는 내용을 비교했을 때, 어떤 것이 다른지를 출력해 주게 됩니다. 보면 1.txt를 비교했을 때에는 5, 6이 제거되고, 2.txt는 추가되고, stage.txt는 제거됨을 알려줍니다.

 

 만약에, stage 브랜치의 최신 상태와 현재 작업 브랜치의 최신 상태를 비교해야 한다면 어떻게 해야 할까요? 단, HEAD가 detached가 되지 않았다고 가정합시다.

 

 

 그 경우, git diff stage HEAD를 입력하시면 됩니다. HEAD가 detached 되지 않은 경우, 현재 작업하고 있는 브랜치의 최신 커밋을 가리킬 것이기 때문입니다. 그래서, git diff BRANCH HEAD는 BRANCH의 최신 커밋과 HEAD를 비교하게 됩니다. HEAD가 detach 되지 않았다면 현재 작업하고 있는 브랜치의 최신 커밋과 비교할 겁니다.

 

 

 이를 좀 더 응용하면 branch간 비교도 가능합니다. git diff BRANCH1 BRANCH2 이런 식으로요. 이것은 BRANCH1과 BRANCH2를 비교하게 됩니다.

 

 

 이럴 때도 제대로 동작할까요? HEAD가 stage 브랜치의 stage first를 가리키게 해 놓은 경우입니다.

 

 

 당연하게도, HEAD와 master를 비교하는 경우, stage의 최신 커밋과 master의 최신 커밋을 비교하지 않습니다. HEAD가 stage의 최신 커밋을 가리키고 있지 않기 때문입니다. 브랜치들을 비교해야 할 경우, git diff BRANCH1 BRANCH2 요래 입력해야 합니다.

 

 

 실제로, git diff stage master를 입력했을 때, stage의 최신 커밋 대비 master의 최신 커밋은 어떤 것이 바뀌었는지를 출력함을 볼 수 있습니다.

 

 

 master에서 stage가 분기되었다고 했습니다. 이 시점부터, 현재 master의 최신 커밋까지 변경 사항은 어떻게 볼까요? 일단, 위 그림에서는 2개가 stage가 분기된 시점부터의 변경 사항인데요. 1.txt에는 5가 추가되고 2.txt에 1, 2, 3이 추가되었습니다.

 

 

 이 때에는 ...을 이용하면 됩니다. git diff BRANCH2...BRANCH1 입니다. BRANCH1에서 BRANCH2가 분기되었다고 했을 때, 브랜치 1 기준에서 2가 분기된 시점이 있을 겁니다. 이 시점부터 브랜치 1의 최신 버전을 비교했을 때 변경 사항을 출력합니다. 위 예제에서는 git diff stage...master라고 되어 있는데요. master에서 stage가 분기된 시점부터, 현재 master의 최신 버전을 비교했을 떄 변경 사항을 출력합니다.