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

깃허브 데스크탑 - 체리픽으로 원하는 commit 가져오기 (git cherry-pick)

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

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

 

Git / GitHub 전체 링크

 

commit 한 줄로 보기

$ git log --oneline

 

하나의 commit만 가져오기

$ git cherry-pick 67680fc

 

여러 개의 커밋 가져오기

$ git cherry-pick 67680fc 1a9b03d 23d4cb8

 

연속으로 커밋 가져오기, 앞 부분 hash는 제외

$ git cherry-pick 47cd480..23d4cb8

 

연속으로 커밋 가져오기, 앞 부분 hash도 포함

$ git cherry-pick 67680fc^..23d4cb8

 

충돌 처리 후 cherry-pick 계속하기

git cherry-pick --continue

 

변경된 commit만 반영하기

git cherry-pick --strategy=recursive -X thiers [hash]

Reset

 

체리픽을 이용해 원하는 commit을 가져와보자.

아래와 같이 여러 commit이 있다.

git log --oneline으로 현재 커밋과 hash code를 확인해보자.

 

커밋 해시코드는 깃허브에서도 확인할 수 있다.

 

브랜치를 새로 만들고 branch 2 ~ 5 commit을 reset해서 과거로 돌려보자.

$ git reset 47cd480

 

히스토리를 보면 47cd480 위의 모든 commit이 제거되었다.

 

reset에 의해 변경된  file은 Discard한다.


Cherry Pick - 최신 commit 1개 가져오기 

 

reset 전에 git log --oneline로 출력한 commit은 다음과 같다.

현재 reset에 의해 47cd480까지 브랜치가 가지고 있다.

dca8fdd (origin/branch, branch) branch 5
23d4cb8 branch 4
1a9b03d branch 3
67680fc branch 2
47cd480 Merge pull request #1 from bloodstrawberry/branch << 현재 상태
fb90560 branch 1
35c9daf 5 submit

 

git cherry-pick [해시코드]를 이용해 다음 commit인 67680fc를 가져오자.

$ git cherry-pick 67680fc
[reset_branch 02ae818] branch 2
 Date: Mon Oct 3 16:13:15 2022 +0900
 1 file changed, 3 insertions(+), 3 deletions(-)

 

branch 2 commit이 들어온 것을 알 수 있다.

히스토리가 갱신되지 않으면 깃허브 데스크탑을 껐다 켜자.

 

file1이 branch2에 돌아왔고, Commit 버튼 아래에 Undo가 생긴다.

 

Undo를 누르면 file1.txt가 생기게 된다.


Cherry Pick - 연속된 최신 commit 여러 개 가져오기 

 

다시 file1.txt를 Discard하고 이번에는 원하는 커밋을 연속으로 들고와보자.

git cherry-pick에 해시를 순서대로 여러개 쓰면 된다.

$ git cherry-pick 67680fc 1a9b03d 23d4cb8
[reset_branch c0c8ae6] branch 2
 Date: Mon Oct 3 16:13:15 2022 +0900
 1 file changed, 3 insertions(+), 3 deletions(-)
[reset_branch bf60533] branch 3
 Date: Mon Oct 3 16:13:49 2022 +0900
 1 file changed, 3 insertions(+), 3 deletions(-)
[reset_branch a5fc741] branch 4
 Date: Mon Oct 3 16:15:00 2022 +0900
 1 file changed, 3 insertions(+), 3 deletions(-)

 

하지만 이 경우에는 연속으로 커밋을 들고오므로 .. 을 이용하면 편하다.

이때 첫 커밋은 포함되지 않으므로 67680fc 이전 커밋47cd480를 사용한다.

$ git cherry-pick 47cd480..23d4cb8
[reset_branch ce7006a] branch 2
 Date: Mon Oct 3 16:13:15 2022 +0900
 1 file changed, 3 insertions(+), 3 deletions(-)
[reset_branch c24673d] branch 3
 Date: Mon Oct 3 16:13:49 2022 +0900
 1 file changed, 3 insertions(+), 3 deletions(-)
[reset_branch 3eb273e] branch 4
 Date: Mon Oct 3 16:15:00 2022 +0900
 1 file changed, 3 insertions(+), 3 deletions(-)

 

만약 첫 커밋을 포함하고 싶다면 ^..을 사용하면 된다.

$ git cherry-pick 67680fc^..23d4cb8

 

세 가지 명령어 중 어떤 명령어를 쓰더라도 아래와 같이 히스토리가 변하게 된다.

 

실제 file도 branch 4 내용까지 반영되었다.


Cherry Pick 취소하기

 

연속된 commit도 Undo로 취소할 수 있다.

 

만약 file을 Discard하지 않으면 아래의 경고창이 나오게 된다. Continue를 누르면 된다.

 

연속으로 merge된 commit을 모두 되돌리고 file1.txt까지 Discard 하자.


Cherry Pick - 충돌 처리

 

같은 파일을 순서대로 commit하지 않으면 충돌(conflict)이 발생하게 된다.

 

67680fc (br 2)

1a9b03d (br 3)

23d4cb8 (b4 4)

 

먼저 branch 2 ~ 4 중, branch 2 만 먼저 cherry-pick 해보자.

$ git cherry-pick 67680fc
[reset_branch 02ae818] branch 2
 Date: Mon Oct 3 16:13:15 2022 +0900
 1 file changed, 3 insertions(+), 3 deletions(-)

 

그리고 branch 3 = 3번째 커밋을 건너뛰고 4번째를 cherry-pick하면 CONFLICT 경고가 나타나게 된다.

$ git cherry-pick 23d4cb8
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
error: could not apply 23d4cb8... branch 4
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

 

GitHub Desktop에도 경고창이 나타나게 된다.

 

Open in Visual Studio Code를 눌러서 충돌을 처리하면 된다.

Git Bash라면 로그에 제시한 것처럼 git add, git rm 등으로 처리할 수 있다.

 

편집기에서 충돌을 처리하고 저장하자.

 

그러면 Continue cherry-pick이 활성화되고 아래와 같이 팝업이 변한다.

 

Git Bash에서는 git cherry-pick --continue체리픽을 진행할 수 있다.

git cherry-pick --continue

 

이제 히스토리에는 branch 3이 없이 2와 4만 남게 된다.

herry-

반응형

댓글