깃허브 데스크탑으로 프로젝트 관리하기 강의 오픈!! (인프런 바로가기)
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 1을 3으로 변경
Hash CCC - memo 4를 추가
Hash DDD - memo 3 1줄 삭제, memo 4를 5로 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 1이 3으로 바뀌어야 했다.
하지만 --strategy=recursive -X theirs 옵션으로 memo 3으로 바뀌기만 하였다.
그림으로 그려보면 다음과 같다.
Hash AAA → Hash BBB의 commit이 memo 1을 memo 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 CCC면 memo 1이 3으로 바뀌고, memo 2와 memo 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 DDD는 memo 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으로 해결하고, 충돌이 발생하는 곳은 결과가 그대로 반영된다.
'개발 > Git, GitHub' 카테고리의 다른 글
깃허브 데스크탑 - 태그를 달아서 릴리즈하기 (Create Release Tag) (0) | 2022.10.22 |
---|---|
깃허브, Git Bash - 커밋 히스토리 그래프 확인하기 (Check Commit History Graph) (0) | 2022.10.21 |
깃허브 데스크탑 - 체리픽으로 원하는 commit 가져오기 (git cherry-pick) (1) | 2022.10.03 |
깃허브 - 코드 충돌 후 웹 에디터에서 직접 편집하기 (0) | 2022.09.21 |
깃허브 데스크탑 - 중복 로그인 에러 해결하기 (Permission denied returned error 403) (0) | 2022.09.09 |
댓글