커밋을 병합하거나 추가하지 않고 분기 b에서 a로 변경 사항 적용


89

내 시나리오는 빌드 프로세스 (분기 A)를 크게 개선 한 분기가 있고 다른 분기에서는 관련없는 기능 (분기 B)을 작업하고 있다는 것입니다. 이제 B 지점을 해킹 할 때 더 빠르고 쉬운 빌드를 원하기 때문에 지점 A에서 작성한 내용을 가져오고 싶습니다. 그러나 나는 브랜치 B를 "오염"시키고 싶지 않고 브랜치 A의 변경 사항을 단계되지 않은 변경 사항에 추가하기 만하면됩니다.

내가 시도한 것 (branchB에 서있을 때) :

git merge --no-commit branchA

병합에 들어가기 때문에 작동하지 않습니다. 그렇지 않다면 완벽 할 것입니다.

git checkout branchA -- .

변경 사항 master..branchA가 아닌 branchA..branchB간에 변경 사항을 적용하므로 작동하지 않습니다.

다른 건 없나요?

편집 : 예, 분기 A의 변경 사항이 커밋됩니다. 이 예제에는 빌드 개선이있는 브랜치가 하나만 있지만 기능 브랜치에서 작업하는 동안 적용하려는 빌드 개선 사항이있는 브랜치가 최대 N 개까지있을 수 있습니다.


A의 변경 사항이 이미 커밋 되었습니까?
— Theolodis 2013

답변:


156

비슷한 작업을해야 --squash했고 merge 명령 에 추가 하여 수정할 수있었습니다.

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes

4
이것은 또한 그것의 기능에 대한 설명이 있어야합니다. 그것은 당신의 현재 지점에 branchA에서의 변경은 diff 스테이지
— KareemElashmawy

내가 branchA에서 master로 코드를 병합했지만 뭔가를 잊어 버렸고 git 히스토리에 다른 병합 커밋으로 표시되지 않고이 병합 커밋에 코드 / 변경 사항을 몇 개 더 추가하고 싶다고 가정 해 보겠습니다. 이 방법이 작동할까요?
— Sushmit Sagar 2018

@Sushmit 나는 당신이 할 수 있다고 생각 git commit —amend하고 그것은 마지막 커밋에 새로운 변경 사항을 추가 할 것이라고 생각합니다. 나는 그것이 병합 커밋에서 작동하는지 완전히 확신하지 못합니다
— guilffer

1
여기에 커밋이 필요하지 않다고 생각합니다. 기본값이어야합니다.
— Petter

11

cherry-pick -n 원하는대로해야하지만, 빌드 개선을 무단계 변경으로 원하는 이유를 잘 모르겠습니다. 이로 인해 몇 가지 작업이 더 어려워집니다 (예 : 수정 된 파일에 대한 다른 변경 사항 병합 또는 모든 항목 리베이스).

이 예제에는 빌드 개선이있는 브랜치가 하나만 있지만 기능 브랜치에서 작업하는 동안 적용하려는 빌드 개선 사항이있는 브랜치가 최대 N 개까지있을 수 있습니다.

이 경우 A와 B (및 빌드가 개선 된 다른 모든 분기)에서 병합하는 새 분기 C를 만듭니다. 기능 브랜치 B에서 변경 사항을 커밋 한 다음 이제 빌드 개선 사항과 기능 브랜치 변경 사항이 포함 된 C 브랜치에 병합하여 함께 테스트 할 수 있습니다. 더 많은 변경이 필요한 경우 C가 아닌 적절한 분기에서 수행 한 다음 C로 병합하십시오. 따라서 C 분기의 변경 사항은 절대로 변경하지 말고 다른 분기의 변경 사항을 통합하는 데 사용하십시오.

즉, 더티 트리에서 커밋되지 않은 변경 사항을 저글링하는 대신 분기 C에서 Git의 모든 기능을 사용할 수 있습니다.


UseCase for cherry-pick -n: 무작위 장소에 많은 것을 추가하여 코드의 작업 사본을 만들었습니다. 이제이 기능의 분기에 커밋하기 전에 코드를 정리하고 싶습니다. 그래서 임시 브랜치로 전환하고 모든 변경 사항을 커밋합니다. 기능 브랜치, cherry-pick그 커밋으로 돌아갑니다 . 이 작업을 수행하는 더 좋은 방법이 있습니까?
— Tejas Kale 2018

6

-n커밋을 바로 선택할 수 있어야합니다 ( 즉시 커밋하지 않도록).


-작동하지 않았습니다. cherry-pick 커밋이 실패한 경우 -m 옵션이 없다고 말합니다.
— Alejandro Sanz Díaz

5

100 % 확실하게 이해했는지는 모르겠지만 제 경우에는 분기간에 diff 패치를 만든 다음이 경로를 B 분기에 적용했습니다.

지점 A 내부 :

 git diff branchA..branchB > patch.diff
 git apply patch.diff

4

귀하의 요구 사항을 이해하고 있는지 잘 모르겠습니다.

병합을 실행 한 다음 git reset HEAD~1.


다음 순서는 모든 사이에 커밋 재생해야 master하고 branchA위에 branchB. 이미 적용된 커밋은 branchB건너 뜁니다.

# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip

# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB

# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip

내가 원하지 않는 git의 스테이징 영역에 파일을 추가합니다. 또한 모든 분기가 마스터 분기의 동일한 커밋에서 분기 될 때만 잘 작동하는 것 같습니다. 그렇지 않으면 master..branchA 범위에없는 diff가 도입됩니다.
— Björn Lindqvist 2013

@ BjörnLindqvist : --soft스테이지 영역에서 변경을 원하지 않으면 옵션을 제거하십시오 . 분기가 어떻게 설정되었는지 그래프를 그릴 수 있습니까?
— LeGEC 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.