답변:
Git 1.7.2는 다양한 커밋을 체리로 선택하는 기능을 도입했습니다. 로부터 릴리스 노트 :
git cherry-pick
커밋 범위를 선택하는 법을 배웠습니다 (예 :cherry-pick A..B
및cherry-pick --stdin
)git revert
. 그러나 이것들은 더 나은 시퀀싱 컨트롤rebase [-i]
이 지원하지 않습니다 .
커밋에서 A
커밋 B
( ) A
보다 오래된 커밋 을 모두 선택하려면 B
다음을 실행하십시오.
git cherry-pick A^..B
A 자체 를 무시 하려면 다음을 실행하십시오.
git cherry-pick A..B
(신용은 damian, JB Rainsberger 및 sschaef에게 간다)
git cherry-pick A^..B
git cherry-pick f~3
다음 git cherry-pick f~2
에 등까지 git cherry-pick f
내가 빨리 수와 실행 이전 명령 변경할 수 있습니다됩니다 있도록 위쪽 화살표를 눌러 ( 대부분의 콘솔에서 비슷해야합니다).
git cherry-pick master..somebranch
마스터 이후 이미 분기에 대한 모든 커밋을 선택하고 (이미 마스터에 기반한다고 가정) 현재 분기에 적용합니다.
가장 간단한 방법은 onto
옵션을 사용하는 것 rebase
입니다. 가정에서 분기되는 현재 완료가 a
mybranch로라고하며이 이동할하는 지점입니다 c
- f
에.
# checkout mybranch
git checkout mybranch
# reset it to f (currently includes a)
git reset --hard f
# rebase every commit after b and transplant it onto a
git rebase --onto a b
git checkout secondbranch && git rebase mybranch
전체 답변을 추가
rebase
의 대화식 모드도 사용할 수 있습니다 . 감사합니다, @Charles!
--interactive
은 시퀀스에서 커밋을 제거하거나 "체리 픽"이전에 다시 커밋 하는 데 사용할 수 있다는 것 입니다. +1
b
하지만, 이것은 나를 위해 일했습니다.
또는 요청 한 원 라이너 :
git rebase --onto a b f
당신의 직렬 조합을 사용할 수 있습니다 git rebase
및 git branch
다른 지점에 커밋의 그룹을 적용 할 수 있습니다. wolfc 가 이미 게시 한 것처럼 첫 번째 명령은 실제로 커밋을 복사합니다. 그러나 그룹의 최상위 커밋에 분기 이름을 추가 할 때까지 변경 내용이 표시되지 않습니다.
새 탭에서 사진을여십시오.
명령을 텍스트 형태로 요약하려면 :
gitk --all &
.git rebase --onto a b f
.HEAD
표시가 없습니다 .git branch selection
이것은 것들을 명확히해야합니다 :
a
은 그룹의 새로운 루트 대상입니다.b
은 그룹의 첫 번째 커밋 이전의 커밋입니다 (제외).f
은 그룹의 마지막 커밋입니다 (포함).그런 다음 분기 에서 git checkout feature && git reset --hard b
커밋을 삭제할 c
때까지 사용할 수 있습니다 .f
feature
이 답변 외에도 필자는 일반적으로 사용하는 데 도움이되는 다른 시나리오의 명령을 설명 하는 블로그 게시물 을 작성 했습니다.
git rebase --onto a b mybranch
과 같이 단순화 할 수 있습니다.
JB Rainsberger 및 sschaef의 의견을 적용하여 질문에 구체적으로 대답하려면 ...이 예에서 체리 픽 범위를 사용하려면 :
git checkout a
git cherry-pick b..f
또는
git checkout a
git cherry-pick c^..f
git 2.7.0.windows.1
커밋의 체리 선택 범위를 시도 할 때 모든 것이 정상이지만 git은 git cherry-pick --continue | --abort | --quit
커밋 / 체리 선택을 다시 시도하기 전에 수행 해야 할 곳을 알려주지 않는다는 것을 알았 습니다. 따라서 커밋 범위를 선택 git cherry-pick --continue
하면 주어진 범위에서 커밋 할 준비가 될 때마다 (충돌 해결 등) 실행해야합니다 .
^
후의 C 실제로이 경우 B이다의 "C는 이전 커밋"를 의미한다. 이것이와 c^..f
동의어 b..f
입니다. 일을 시도 git log c^..f
당신이 한 것과 정확히 같은, 당신은 f를 통해 커밋 C를 참조한다git log b..f
A, B, C, D, E, F, G, H, I, J 커밋에서 A, C, F, J와 같이 병합 할 선택적 개정이있는 경우 아래 명령을 사용하십시오.
자식 체리 픽 ACFJ
git rev-list --reverse b..f | xargs -n 1 git cherry-pick
git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...
커밋 ID에서 지점 끝까지 체리를 선택하려면 다음을 사용할 수 있습니다.
git cherry-pick commit_id^..branch_name
언급 할 가치가있는 또 다른 변형 n
은 분기에서 마지막 커밋 을 원하면 ~
구문이 유용 할 수 있다는 것입니다.
git cherry-pick some-branch~4..some-branch
이 경우 위 명령은 분기에서 마지막 4 개의 커밋을 선택합니다 some-branch
(분기 이름 대신 커밋 해시를 사용할 수도 있음)
실제로 가장 간단한 방법은 다음과 같습니다.
MERGE_BASE=$(git merge-base branch-a branch-b)
1 단계의 병합 기반에서 시작하여 결과 분기를 자체에 리베이스하고 원하지 않는 커밋을 수동으로 제거하십시오.
git rebase ${SAVED_MERGE_BASE} -i
또는 몇 가지 새로운 커밋이있는 경우 1 단계를 건너 뛰고 간단히
git rebase HEAD^^^^^^^ -i
첫 번째 단계에서는 ^
병합 기반을 지나갈 만큼 충분히 사용 합니다.
대화식 리베이스에서 다음과 같은 것을 볼 수 있습니다.
pick 3139276 commit a
pick c1b421d commit b
pick 7204ee5 commit c
pick 6ae9419 commit d
pick 0152077 commit e
pick 2656623 commit f
그런 다음 줄 b와 원하는 다른 줄을 제거하십시오.
git format-patch --full-index --binary --stdout range... | git am -3
다음은 체리 선택에 대한 소스 및 대상 분기와 커밋 수를 스크립트에 알려 주기만하면 여러 커밋을 연속적으로 체리 픽 선택하는 스크립트입니다.
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
브랜치에서 마스터로 체리 픽을 선택하려면 (현재 브랜치를 소스로 사용) :
./gcpl.sh -m
6.19.x 브랜치에서 마스터로 최신 5 개의 커밋을 선택하십시오.
./gcpl.sh -c 5 -s 6.19.x -t master
b
기초 하고 싶을 수도f
있지만, 체리 따기와는 아무런 관련이 없습니다.)