실제로 병합하지 않고 병합을 테스트하는 방법


166

git merge현재 작업중인 지점과 마스터 인 두 지점 사이 를 시뮬레이션 할 수있는 방법이 있습니까?

내가해야 할 때 종종 갈등이 발생합니다 git merge. 병합을 먼저 시뮬레이션하는 방법이 있습니까?



답변:


132

병합을 시도 할 때까지 어떻게 될지 시뮬레이션하는 방법이 없다고 생각합니다. 그러나 git status병합을 수행하기 전에 출력 이 비어 있는지 확인한 후에 시도해 보는 것이 안전합니다. 갈등이 발생하면 즉시 이전 상태로 돌아갈 수 있습니다.

git reset --merge

git 1.7.4부터 다음을 수행하여 병합을 중단 할 수도 있습니다.

git merge --abort

( 해당 옵션을 추가 한 커밋 메시지에 설명되어 있듯이 이는 일관성 등을 위해 추가되었습니다 git rebase --abort.)


4
@ Amber의 대답은 '병합을 시뮬레이션하는 방법'이라는 질문에 정확히 대답합니다. --no-commit내 의견으로는 사용하기 가 훨씬 쉽다
samirahmed

14
@ samirahmed : @ Amber --no-commit는 여전히 질문과 대답을 바꾸지 않고 인덱스와 작업 트리를 변경하고 있지만 질문에 더 문자 그대로 대답했습니다. :) 사람들이 이런 종류의 질문을 할 때 질문 : 일반적으로 병합이 어떻게되는지 볼 수있는 가장 좋은 방법은 병합을 시도하는 것임을 알지 못하기 때문입니다. 종종 이전 상태로 얼마나 쉽게 돌아갈 수 있는지 알지 못하기 때문에 종종 병합 문제가있는 경우
Mark Longair

2
이것이 최신 버전의 git에 추가되었는지는 모르지만 문서 (1.8.4)에서 " 현재가 존재 git merge --abort하는 git reset --merge경우 와 동일합니다 MERGE_HEAD"라고 표시되어 있으므로 기억하기 쉬운 것이 무엇이든 :)
Samuel Meacham

@SamuelMeacham : 지적 해 주셔서 감사합니다-1.7.4에 도입되었습니다. 나는 그 대답을 업데이트했습니다. 감사!
Mark Longair

이 제안은 자식 1.9.4에서 나를 위해 아무것도하지 않았습니다.
djangofan

137

git merge --no-commit병합이 실제로 커밋되지 않도록하는 데 사용할 수 있으며 , 병합 방식이 마음에 들지 않으면 원래 헤드로 재설정하십시오.

병합이 빨리 진행되고 있어도 정의에 따라 충돌이없는 경우에도 병합을 완료하지 않으려는 경우에도 추가 할 수 있습니다 --no-ff.


나는 그것이 git merge --abort존재 하지 않는다고 생각 합니다-아마도 당신은 의미 git reset --merge합니까?
Mark Longair

아냐, 나는 rebase--abort대한 것과는 다른 것을 잊었다 git merge.
Amber

7
나도 던질거야 --no-ff. ff 병합이 발생하지 않도록합니다.
Andy

1
@ Andy 's --no-ff--no-commit여기서 빨리 변경 사항을 멈추지 않기 때문에 거의 필수 입니다.
jackr

1
@Anant Anand Gupta-이것은 좋은 트릭이지만 git config --global alias.tm "병합 --no-commit --no-ff"
pasx

109

주제 분기의 변경 사항을 마스터와 비교하려면 다음을 수행하는 것이 가장 쉽고 안전합니다.

git checkout master
git checkout -b trial_merge
git merge topic_branch

병합을 완료하면 마스터에서 통합 된 변경 사항을 쉽게 확인할 수 있습니다.

git diff master

완료되면 간단히 trial_merge 분기를 삭제하십시오.

git checkout master
git branch -D trial_merge

이런 식으로 마스터 브랜치는 변하지 않습니다.


4
원하는 것을 수행 git checkout --detach하고 테스트 할 수도 있습니다 . 나중에 변경 사항을 유지하려면을 수행하십시오 git checkout -b new_branch. 변경 사항을 버리고 싶다면 원하는 지점 ( git checkout master)을 체크 아웃하십시오 .
Shayan Toqraee

topic_branch거대 하면 (처음 에이 질문에있는 diff master경우와 마찬가지로) 병합이 충돌을 일으킬 경우 출력이 너무 커서 안구를 만들 수 없습니다.
초승달 신선한

나는 이것을 안전하고 간단하게 좋아합니다.
leo

4

나는 사용한다 :

git merge --ff-only

설명서 에 따르면 :

현재 HEAD가 이미 최신 상태이거나 병합을 빨리 진행할 수있는 경우가 아니면 0이 아닌 상태로 병합 및 종료를 거부하십시오.

두 브랜치 사이에 충돌이없는 경우 빨리 병합되기 때문에 실제로는 시뮬레이션이 아닙니다. 그러나 갈등이 발생하면 통보를 받고 아무 일도 일어나지 않습니다.


4

git merge --abort최근에을 사용할 수있었습니다 . 그러나 병합 충돌이있는 경우에만 사용할 수 있습니다. 커밋하지 않으려면 위에서 언급 한 다른 방법을 사용하십시오.


1
위에서 언급 한 다른 방법은 무엇입니까? 그들 모두는 언급한다 git merge --abort. 답을 작성한 사람을 지정하여 나중에 답을 증명해야합니다.
Michael Fulton

3

왜 버리기 분기 (git checkout -b)를 만들고 테스트 병합을 수행하지 않습니까?


1
당신이 제안하는 것은 실제로 Ian의 대답은 정말
간절히

0

나는 그것이 당신의 경우인지 정확히 알지 못하지만 귀하의 질문은 때로는 기능을 시작하고 며칠 동안 커밋하고 개발을 여러 번 병합한다는 것을 기억합니다.

이 시점에서 내가 변경 한 정확한 파일에 대한 제어 권한을 잃어 버렸고 기능이 닫히고 코드가 개발 될 때만 알 수 있습니다.

이 경우 소스 트리를 사용하여 어떤 수정 작업을 수행했는지 알 수있는 좋은 방법입니다 (병합이 아닌 다른 방법).

기본 분기에서 오른쪽 버튼을 클릭하고 다음을 선택해야합니다 Diff Against Current.

두 가지의 차이점을 아는 Sourcetree의 기능

그러면 소스 트리는 브랜치를 기본 브랜치로 병합하면 병합 될 모든 수정 사항을 표시합니다.

결과

물론 충돌을 보여주지는 않지만 병합에 유용한 도구입니다.

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