Git에서 특정 커밋을 한 브랜치에서 다른 브랜치로 병합하는 방법은 무엇입니까?


159

나는 BranchA113 커밋보다 앞서 BranchB있습니다.

그러나 지난 10 개 정도의 커밋이에 BranchA병합 되기를 원합니다 BranchB.

이것을 할 수있는 방법이 있습니까?


답변:


233

git cherry-pick <commit>명령을 사용하면 분기에 관계없이 단일 커밋을 수행하고 기본적으로 작업 분기에서 리밋 할 수 있습니다.

Pro Git 책의 5 장 에서는 다이어그램과 함께 완성 할 수있는 것보다 더 잘 설명합니다 . ( 저음에 관한 장도 잘 읽습니다.)

마지막으로, 다른 SO 질문에서 체리 따기 대 병합 대 rebasing에 대한 좋은 의견 이 있습니다 .


1
질문 : 커밋 A이 분기 되었다고 말하고 master자식 커밋을 B통해 작업을 수행하십시오 E. E에서 한 줄만 추가했다고 가정 해 보겠습니다 D. 당신이 경우 git cherry-pick Emaster, 그것을 적용됩니까 모두 에서 변경을 A통해 Emaster지점, 또는 그것을 않습니다 에서 변경 사항을 적용 D하는 E, 즉, 그것은에 해당 한 줄을 추가 master? 사건이 전자 인 경우 후자를 어떻게 달성합니까? (수동으로 복사 및 붙여 넣기 제외)
chharvey

7
git cherry-pick -n <commit> 체리 픽을 자동 커밋하지 않으려면.
벤 플린

6

BranchA 원격으로 밀어되지 않은 경우에 당신은 사용하여 커밋 순서를 변경할 수 있습니다 rebase간단히하고 merge. 중복 커밋을 만들지 않기 때문에 가능 하면 mergeover 를 사용 하는 것이 좋습니다 rebase.

git checkout BranchA
git rebase -i HEAD~113
... reorder the commits so the 10 you want are first ...
git checkout BranchB
git merge [the 10th commit]

2

출처 : https://git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project#Integrating-Contributed-Work

도입 된 작품을 한 지점에서 다른 지점으로 옮기는 다른 방법은 체리 픽을하는 것입니다. Git의 체리 픽은 단일 커밋에 대한 리베이스와 같습니다. 커밋에 도입 된 패치를 가져 와서 현재있는 지점에 다시 적용하려고합니다. 토픽 브랜치에 많은 커밋이 있고 그 중 하나만 통합하려는 경우 또는 토픽 브랜치에 하나의 커밋 만 있고 리베이스를 실행하는 대신 체리 픽을 선호하는 경우에 유용합니다. 예를 들어, 다음과 같은 프로젝트가 있다고 가정하십시오.

여기에 이미지 설명을 입력하십시오

커밋 e43a6을 마스터 브랜치로 가져 오려면 다음을 실행하십시오.

$ git cherry-pick e43a6
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
 3 files changed, 17 insertions(+), 3 deletions(-)

이는 e43a6에 도입 된 것과 동일한 변경 사항을 가져 오지만 적용 날짜가 다르기 때문에 새로운 커밋 SHA-1 값을 얻게됩니다. 이제 당신의 역사는 다음과 같습니다 :

여기에 이미지 설명을 입력하십시오

이제 토픽 브랜치를 제거하고 원하지 않는 커밋을 제거 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.