특정 커밋을 git의 다른 브랜치를 기반으로 옮기는 방법은 무엇입니까?


381

그 상황:

  • 마스터는 X에있다
  • quickfix1은 X + 2 커밋에 있습니다

그런 :

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)

그런 다음 quickfix2 작업을 시작했지만 실수로 quickfix1을 마스터가 아닌 복사 할 소스 분기로 사용했습니다. 이제 quickfix2는 X + 2 커밋 + 2 관련 커밋에 있습니다.

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

이제 quickfix2가있는 분기를 원하지만 quickfix1에 속하는 2 개의 커밋이 없습니다.

      q2a'--q2b' (quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

quickfix2의 특정 버전에서 패치를 만들려고했지만 패치가 커밋 기록을 유지하지 않습니다. 커밋 히스토리를 저장하는 방법이 있지만 quickfix1을 변경하지 않고 분기가 있습니까?



8
그 질문은 또 다른 하나 개의 지점에서 커밋 이동에 대해 묻는 @Kevin,이 하나의 추가 요구 사항이 없습니다 에 커밋을 포함하여 quickfix1. (답변의 차이에 주목하십시오.)
Scott Weldon

답변:


372

이것은 고전적인 경우입니다 rebase --onto.

 # let's go to current master (X, where quickfix2 should begin)
 git checkout master

 # replay every commit *after* quickfix1 up to quickfix2 HEAD.
 git rebase --onto master quickfix1 quickfix2 

그래서 당신은에서 가야합니다

o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

에:

      q2a'--q2b' (new quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)

이것은 깨끗한 작업 트리에서 가장 잘 수행됩니다. 특히 Git 2.10 이후를
참조하십시오git config --global rebase.autostash true .


24
이 단계는 quickfix2의 히스토리를 수정하므로 브랜치를 이미 공유 한 경우 대신 체리 따기를 사용하십시오 (다음 답변 참조).
Max Chernyak

그냥 기록을 위해 : SmartGit의 로그 바로 드래그와 q2a위에 X선택 Rebase 현재 2 커밋 발생 대화 상자의 옵션에서합니다.
Thomas S.

1
@ThomasS. 흥미 롭군 의 멋진 GUI 구현입니다 git rebase --onto.
VonC

1
인정해야합니다. 실제로 잘못된 지점에 더 자주 커밋하는 것과 같은 바보 같은 일을합니다 .SmartGit 로그보기 GUI는 같은 상황에서 너무 많은 시간을 절약했습니다.
WORMSS

1
@ 코사인 합의. rebase.autostash구성 에 대한 참조를 추가하기 위해 답변을 편집했습니다 . 리베이스를 수행 할 때 작업 트리에서 진행중인 작업 손실을 피할 수 있습니다.
VonC

155

git cherry-pick복사하려는 커밋을 선택하는 데 사용할 수 있습니다 .

아마도 가장 좋은 방법은 마스터에서 분기를 만든 다음 해당 분기 git cherry-pick에서 원하는 quickfix2의 커밋을 사용하는 것입니다.


하나의 커밋 만 이동하려는 경우에도 가장 좋은 옵션입니다. 감사.
Alex

142

당신이 할 수있는 가장 간단한 것은 체리 따기 범위입니다. 그것은 동일 rebase --onto하지만 눈에는 더 쉽습니다 :)

git cherry-pick quickfix1..quickfix2

6
또한, 그것은 원래 커밋 인 IIUC를 잃지 않으므로 나와 같은 "play-it-safes"보다 선호되는 것 같습니다.) 또는 rebase --onto원래 변경 사항을 유지합니까?
akavel

6
모두 rebasecherry-pick당신에게 새로운 SHA 키를 제공합니다. 각 커밋은 리포지토리 의 고유 한 스냅 샷 이기 때문 입니다.
Christoph

6
@akavel의 의미는 cherry-pick이 원래 커밋을 자신의 브랜치에 유지한다는 것입니다.
Mr_and_Mrs_D

4
그만한 가치가 cherry-pick있더라도이 답변과 같은 범위를 시도했지만 내 저장소가 혼란 스러웠습니다. cherry-pick각 커밋마다 개별 작업을 수행해야했습니다 . (그리고 아무 말도하지 않을 수도 있지만, 누군가 어려움을 겪고있는 경우, cherry-pick커밋이 적용되는 시간 순서대로해야합니다.)
카르마 니즘

3
git checkout여기서 중요합니다. 당신의 머리는 무엇입니까 :)?
Sławomir Lenart

28

나는 그것이 믿는다 :

git checkout master
git checkout -b good_quickfix2
git cherry-pick quickfix2^
git cherry-pick quickfix2

3
cherry-pick커밋 해시와 함께 작동하므로 커밋을 어딘가에서 가져 와서 어딘가에 넣으려면이 방법이 필요합니다. 그냥 확인 당신은 할 수 있도록 checkout <branch>먼저 정확한 지점을.
John Leidegren

-1
// on your branch that holds the commit you want to pass
$ git log
// copy the commit hash found
$ git checkout [branch that will copy the commit]
$ git reset --hard [hash of the commit you want to copy from the other branch]
// remove the [brackets]

설명과 함께 더 유용한 다른 명령들 : Git Guide

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