커밋을 병합하거나 추가하지 않고 분기 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.