git에서 cherry pick 명령어가 있습니다. 요약하면, 다른 브랜치에 있는 커밋을 선택적으로 선택해서 내 브랜치에 적용하려고 할 때 쓸 수 있는 명령어입니다. 예를 들어, 내가 커밋 1을 cho라는 브랜치에 했고, 커밋 2를 cho라는 브랜치에 또 했다고 했습니다. 그런데, 커밋 1이  버그가 너무 많아, 커밋 2만 반영해야 한다고 해 봅시다. 이럴 때 쓸 수 있습니다.

 

 간단하게 실습을 해 보도록 하겠습니다.

 


 먼저 test1 브랜치에는 7cf2e113, 317e0554 순으로 커밋이 올라왔다고 하겠습니다.

 

 7cf2e..는 1.txt에 Hi라는 것이 추가되었습니다.

 

 다음에, 317e0..에는 2.txt에 Yabaeii라는 것이 추가되었습니다. 이제 우리는 test2라는 브랜치에, 반영되지 말아야 할 커밋인 7cf2e..은 반영하지 않고, 317e0..만 반영하려고 해요. 이럴 때, test2로 checkout을 먼저 합니다.

 

 다음에 git cherry-pick 317e0554를 입력해 줍니다. 그러면, 317e0554 커밋만 딱 뽑아서 반영시켜 줍니다.

 

깃 그래프를 봅시다. test2 브랜치에 2.txt add라는 커밋 8458b627가 추가되었음을 볼 수 있습니다. 변경 내역을 보겠습니다.

 

 2.txt에 Yabaeii가 추가되었군요. 변동 내역을 체크하는 것은 좋은 습관이니 들이시는 게 좋겠습니다.

 


 git diff로 변경 내역을 확인해 볼게요. 먼저, test1에서 7cf2e113, 317e0554 순으로 커밋이 쌓였습니다. 그리고 2.txt add가 된 쪽이 317e0554였습니다. test2쪽에서는 Revert "5 line add"가 7b20ffa7이였고, 그 이후에 2.txt add 라는 커밋이 쌓인 게 8458b627이였습니다. 8458b627은, 317e0554를 cherry-pick한 것이였습니다.

 

 고로, 변경 내역을 확인하면 됩니다. git diff 7b20ffa7 8458b627로 test2 브랜치쪽의 변경 사항을 확인하겠습니다.

 

 다음에, test1쪽의 2.txt에 무언가가 추가된 커밋의 변동 내역을 확인해 보겠습니다. 7cf2e113과 317e0554의 다른 점을 확인하면 됩니다. 둘 다 같으니 문제가 없군요. 따라서 그대로 반영시키면 됩니다.

 


 만약에 충돌이 난 경우에는 어떻게 해야 할까요? test2에 1 and 2 add라는 커밋이 들어왔었다고 해 보겠습니다.

 

 bc3d108d의 변동 내역 중 2.txt의 변경 사항을 보도록 하겠습니다.

 

 ORI라는 것이 추가되었군요. 이 위에 test1의 317e0554를 cherry-pick해서 가져온 커밋을 쌓았습니다.

 

 그랬더니 이런 화면이 떴습니다. Incoming change는 제가 cherry pick으로 test1에서 가져온 커밋의 변동 내역을 의미합니다. 우리는, test1에서 가져온 변동 사항을 적용해야 하니, ORI와 Yabaeii 둘 다 accept 하도록 하겠습니다. 6, 8, 10번째 줄을 지운 다음에, git add .을 하면 merge conflict가 해결됩니다.

 

 다음에, commit을 하나 해야 할 텐데요. 그 전에 현재 상태와 bc3d108d와 비교를 해 봅시다. bc3d108d는 test2에서 1과 2에 무언가가 추가된 커밋입니다. cherry-pick을 쌓기 전의 커밋입니다.

 

 보니까, 2.txt에 Yabaeii만 들어왔음을 볼 수 있습니다. 의도대로 되었으니 반영하면 되겠습니다.