본문 바로가기
개발/Git, GitHub

깃허브 데스크탑 - 체리픽으로 변경된 commit만 반영하기 (git cherry-pick --strategy=recursive -X thiers)

by 피로물든딸기 2022. 10. 5.
반응형

깃허브 데스크탑으로 프로젝트 관리하기 강의 오픈!! (인프런 바로가기)

 

Git / GitHub 전체 링크

 

git cherry-pick [commit hash]는 순서대로 commit을 불러오지 않으면 충돌이 발생한다.

하지만 원하는 commit 하나만 가지고 와서 해당 커밋의 내용만 반영하고 싶은 경우가 있다.

 

충돌이 발생하더라도 절히 처리해주는

git cherry-pick --strategy=recursive -X thiers [hash] 명령어에 대해 분석해보자. 

 

참고 : -X는 merge strategy 옵션이다.

    -X, --strategy-option <option>
                          option for merge strategy

 

다음과 같이 텍스트 파일을 4번 바꿨다고 하자.

각 Hash 코드는 AAA ~ DDD라고 가정한다.

 

Hash AAA - memo 2를 추가

Hash BBB - memo 13으로 변경

Hash CCC - memo 4를 추가

Hash DDD - memo 3 1줄 삭제, memo 45로 2줄 변경

 

실제 브랜치에도 아래와 같이 History에 정리되어 있다.

 

git log --oneline으로 진짜 해시 코드를 확인해보자.

$ git log --oneline
ebb553f Hash DDD
90cb396 Hash CCC
b36558f Hash BBB
e337160 Hash AAA
e5f05ec Hash Start

 

이제 AAA ~ DDD까지 commit을 reset하자.

$ git reset e5f05ec

 

리셋 후 Changes에 있는 파일은 Discard 한다.


git cherry-pick --strategy=recursive -X theirs [Hash AAA]

 

AAA는 바로 앞의 commit이므로 두 명령어는 완전히 같다.

$ git cherry-pick e337160
=
$ git cherry-pick --strategy=recursive -X theirs e337160

 

명령어를 실행해보자.

$ git cherry-pick --strategy=recursive -X theirs e337160
[test_branch 441e60f] Hash AAA
 Date: Mon Oct 3 22:20:55 2022 +0900
 1 file changed, 3 insertions(+)

 

History에 Hash AAA가 추가되었다.

 

그림으로 그려보면 다음과 같다.

현재 상태와 Hash AAA 사이에 아무 commit이 없다.

따라서 memo 1에서 memo 2가 추가된 commit이 그대로 반영되었다.

 

다시 reset하고 Changes에 있는 파일은 Discard 한다.

$ git reset e5f05ec

git cherry-pick --strategy=recursive -X theirs [Hash BBB]

실제 커밋 해시코드인 b36558f로 명령어를 실행해보자.

$ git cherry-pick --strategy=recursive -X theirs b36558f
Auto-merging recursive.txt
[test_branch 6a6c024] Hash BBB
 Date: Mon Oct 3 22:40:09 2022 +0900
 1 file changed, 3 insertions(+), 3 deletions(-)

 

Hash AAA + Hash BBB라면 memo 2가 추가되고, memo 13으로 바뀌어야 했다.

하지만 --strategy=recursive -X theirs 옵션으로 memo 3으로 바뀌기만 하였다.

 

그림으로 그려보면 다음과 같다.

Hash AAA Hash BBB의 commit이 memo 1memo 3으로 바꾼 것이므로, 해당 commit만 반영되었다.

즉, b36558f commit은 memo 2를 변경시키지 않았으므로 memo 2는 반영되지 않는다.

 

다시 reset하고 Changes에 있는 파일은 Discard 한다.

$ git reset e5f05ec

git cherry-pick --strategy=recursive -X theirs [Hash CCC]

 

실제 코드 90cb396로 명령어를 실행하자.

$ git cherry-pick --strategy=recursive -X theirs 90cb396
Auto-merging recursive.txt
[test_branch a3b9dc5] Hash CCC
 Date: Mon Oct 3 22:43:11 2022 +0900
 1 file changed, 7 insertions(+)

 

Hash AAA + Hash BBB + Hash CCCmemo 1 3으로 바뀌고, memo 2memo 4가 추가되어야 한다.

하지만 --strategy=recursive -X theirs 옵션으로 memo 4만 반영된다.

 

그림으로 그려보면 다음과 같다.

Hash BBB Hash CCC의 commit이 memo 4추가하여서 반영되었고,

memo 2의 추가(AAA) memo 1 → memo 3(BBB)은 해당 commit 내용이 아니므로 반영되지 않는다.

 

다시 reset하고 Changes에 있는 파일은 Discard 한다.

$ git reset e5f05ec

git cherry-pick --strategy=recursive -X theirs [Hash DDD]

 

마지막으로 Hash DDD의 실제 hash = ebb553f를 실행하자.

$ git cherry-pick --strategy=recursive -X theirs ebb553f
Auto-merging recursive.txt
[test_branch deeeef8] Hash DDD
 Date: Mon Oct 3 23:18:46 2022 +0900
 1 file changed, 10 insertions(+), 3 deletions(-)

 

Hash AAA + Hash BBB + Hash CCC + Hash DDD라면 memo 333 / memo 222 / memo 545 가 되어야 한다.

하지만 Hash DDD의 commit만 반영되었다.

이때, Hash DDDmemo 3을 한 줄 지우고, memo 4 5로 바꾼 내용인데,

memo 1만 있는 commit에서는 이 내용이 불가능하므로 충돌이 그대로 반영된다.

 

따라서 Hash DDD의 변경이 불가능한 내용은 Hash DDD결과가 그대로 반영된다.

memo 2 Hash DDD의 내용이 아니므로 반영되지 않고 빈 칸으로 남는다.


결론

 

git cherry-pick --strategy=recursive -X thiers [hash]로 해당 commit의 내용만 적절히 반영시킬 수 있다.

충돌이 발생하지 않은 곳commit으로 해결하고, 충돌이 발생하는 곳은 결과가 그대로 반영된다.

반응형

댓글