Git에서 모든 파일을 수동으로 병합하는 방법은 무엇입니까?


78

meld 또는 다른 diff 도구 를 사용하여 모든 파일을 수동으로 병합하고 싶습니다. Git으로 어떻게 할 수 있습니까?
내가 실행 git mergetool 하면 no files need merging. 그래서 갈등이있을 때만 할 수 있다고 생각합니다.


우리에게 어떤 상황주십시오 무엇을 병합 할을하고 이 자동으로 수행하지 않습니다.
Johnsyweb

3
텍스트 파일을 병합하고 싶습니다. :) 저는 mercurial의 수동 병합을 사용했고 동시에 3 개의 파일을보고 싶었습니다. 문제가 발생하면 언제든지 모든 파일을 직접 편집 할 수 있습니다
gennad

8
예, 어떤 경우에는 수동으로 병합하고 싶습니다. 그러한 상황에서는 모든 것이 앱이 결정한대로가 아니라 원하는대로 진행된다는 것을 알고 있기 때문에
gennad

1
자동으로 병합하고 문제가 발생하면 수정하는 것은 어떻습니까?
Tomasz Wysocki

1
@TomaszWysocki "인간에 의해 문제가되는 문제"가 발생했는지 알 수있는 방법이 없기 때문입니다. "git에 의해 문제가되는 것으로 간주되는 문제"가 발생했는지 알 수있는 방법이 있습니다. Git은 파일을 자동으로 병합하고 git의 자동 의사 결정 결과를 모두 확인 표시하지 않습니다. 내가 좋아하지 않는 특정 변경을 결정할 수 있습니다. 모든 변경 사항을 적용하기 전에 승인하고 싶습니다.
케이크

답변:


107

훨씬 더 간단한 방법이 있습니다.

git merge --no-commit merge_branch

남자가 말했듯이 :

함께 --no-commit병합을 수행하지만, 척 실패 병합 및 자동 커밋하지 않는 사용자에게 검사 및 추가 커밋하기 전에 병합 결과를 조정할 수있는 기회를 제공합니다.


7
감사합니다. mergetool / meld를 사용하여 멋진 3 방향 인터페이스로 변경 사항을 부분적으로 검토하고 병합하는 방법이 있습니까?
James

18
--no-ff빠른 전달 을 추가 하면 충돌이없는 경우 발생합니다.
Løiten

물론 git mergetool충돌이있는 경우 사용 하십시오.
명왕성

8
이것은 여전히 ​​자동 병합이므로 원본 질문에 대답하지 않습니다.
ThomasMcLeod

61

다음과 같은 시나리오가 있습니다.

git merge --no-commit merge_branch 

빨리 감기를 일으켰습니다.

이 경우 다음을 사용할 수 있습니다.

git merge --no-commit --no-ff merge_branch

그러면 변경 사항을 검토 할 수 있습니다.


1
같은 방법으로 당길 수 있습니까? 빨리 감기가 불가능한 경우 모든 충돌을 수동으로 확인해야합니다.
Maxim

1
더를 @Maxim 없지만 이후는 pull단지 조합 fetchmerge첫 번째 호출 할 git fetch merge_branch다음 후자 DOmerge
최고 마스터

둘 다 사용하는 --no-commit --no-ff것은 .gitattributes루트 디렉토리에를 포함하는 파일을 갖는 것과 * -merge같지만 사용 여부는 merge선택에 따라
Top-Master

나는 그것을 Automatic merge went well; stopped before committing as requested실행합니다. 내가 실행하려고하면 git mergetool그것은 말한다 No files need merging.
Unknow0059

23

비슷한 질문은 git을 사용하여 자동 병합을 방지하는 방법입니다.

FractalSpace는 내가 유용하다고 생각하는 답변을 제공했습니다.

$ git checkout master
$ git difftool -t kdiff3 local-branch HEAD

아이디어는 자동 병합 도구 대신 difftools를 사용하여 필요한 것을 수동으로 선택하고 새 파일을 만드는 것입니다.


나는 git merge이 페이지를 우연히 발견 한 다른 사람들을 위해 명확하게하기 위해이 답변을 답변과 비교하는 답변을 추가했습니다 .
stevegt 2019


7

여기에 와서 사용 git difftool하는 @True 의 답변 과 사용 하는 다른 답변 의 차이점에 대해 궁금해하는 사람 git mergeGit mergetool과 difftool을 참조하십시오. .

간단히 말해, diff.toolkdiff3, meld 또는 vimdiff와 같은 최신 버전을 사용하도록 git을 구성한 경우 해당 diff 도구를 사용하여 수동으로 병합 할 수 있으며 명령 줄은 간단 할 수 있습니다.

git difftool other_branch

... 이렇게하면 현재 브랜치와 other_branch (에서 $ LOCAL 및 $ REMOTE로 설명 됨)간에 양방향 수동 병합을 수행 할 수 있습니다 man git-config.

다른 답변이 논의하는 "올바른"방법은 대신 kdiff3 또는 vimdiff를 사용하도록 git을 구성 merge.tool하고 다음을 사용하는 것입니다.

git merge --no-commit --no-ff other_branch
git mergetool

...이 명령은 $ BASE, $ LOCAL 및 $ REMOTE간에 $ MERGED로 N-way 수동 병합을 수행 할 수 있습니다. git 구성 방법에 대한 한 가지 예는 https://stackoverflow.com/a/2235841/1264797 을 참조 하십시오 . 많은 사람들이 구성 할 필요가 없습니다.mergetool.*.cmdgit이 이미 알고있는 도구 중 하나를 사용하면 항목을 전혀 . (Meld는 3 개의 창만 표시 할 수 있으므로 기본 설정으로 meld를 사용하면 $ BASE가 표시되지 않습니다.)

누군가 나를 바로 잡기 위해 뛰어들 수도 있지만 N-way 병합 능력을 제외하고는 두 가지 방법이 동일한 결과를 생성하는 것처럼 보입니다. 어느 쪽 difftoolmergetool새에 부모가 그렇게 두 경우 모두에서, 커밋 other_branch 추가, 병합은 예를 들어 gitk이 명령에서 명확하지 않습니다 및 설명 (나중에 발견)가이 메시지를 커밋되어야 할 것이다.


5

다른 답변이 불만족스러워 답을 찾기 위해 답답해졌습니다. 이 질문에 대한 해결책은 마침내 여기에서 찾았습니다 : https://stackoverflow.com/a/11593308/1351182

이 명령을 실행하면 기본적으로 최신 커밋을 가져와 그 branchToMergeFrom위에 패치를 적용 할 수있는 새 커밋을 만들 수 있습니다. 이것은 맨 위에 추가 커밋과 비슷하다고 생각합니다.

git checkout branchToMergeTo
git checkout --patch branchToMergeFrom [file]

그런 다음 file병합하려는 'hunk'를 정확히 지정하라는 메시지가 표시됩니다 (지정하지 않은 경우 파일별로 ). 이런 식 으로 자동 병합 프로세스 의 각 부분을 안내 하고 대신 mergefrom브랜치 에서 수락하려는 비트와 조각에 대한 수동 중재를 요청합니다 . 다음은 내 프로젝트에서 어떻게 생겼는지에 대한 예입니다.

@@ -249,7 +251,8 @@ def draw_everything():
  
     draw_bg()
     draw_balls(ax)
-    plt.show(block=False)
+    if show:
+        plt.show(block=False)
 
 def advance(ms, accel_fun, collision_matrix_fun):
     global balls
(3/6) Apply this hunk to index and worktree [y,n,q,a,d,K,j,J,g,/,e,?]?

y및을 입력 한 후 해당 파일에 대한 <Enter>다음 덩어리가 표시되었습니다 (4/6). 맨 아래에있는이 프롬프트를 사용하면 단순히 'hunk'를와 병합 하거나 y거부 n하거나 들어가서 수동으로 편집 할 수도 있습니다. 옵션은 다음과 같습니다.

y - apply this hunk to index and worktree
n - do not apply this hunk to index and worktree
q - quit; do not apply this hunk or any of the remaining ones
a - apply this hunk and all later hunks in the file
d - do not apply this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

나는 들어가서 하나의 덩어리를 수동으로 편집하고 싶었습니다. 병합을 정확히 수락하거나 거부하고 싶지 않았기 때문입니다. 그래서 저는 e편집 할 파일을 선택 하고 받았습니다. 맨 아래에 덩어리를 제대로 편집하는 방법에 대한 지침조차 있다는 것을 알았을 때 기뻤습니다. 덩이를 작은 조각으로 나눌 수도 있습니다.s위 옵션을 .

원하는 것이 자동 프로세스를 최대한 활용하는 수동 병합 인 경우이 프로세스를 권장 합니다. 차이점은 모든 병합 'hunk'를 감독하고 원하는대로 편집 할 수 있다는 것입니다. 나는 이것이 미래의 독자들에게 도움이되기를 바랍니다.

이 과정 후, 당신은 아마 실행하려면 git checkout branchToMergeTo && git merge branchToMergeFrom정식의 역사를 병합하기 위해 branchToMergeFrombranchToMergeTo.


1

나는 전략 선택 우리를 당신이 가져-에있는 수동으로 원하는 변경 수동 DIFF을 수행 한 후, (이 TortoiseGit의 선택으로도 존재한다).

출처 : https://git-scm.com/docs/merge-strategies

병합 메커니즘 (git merge 및 git pull 명령)을 사용하면 -s 옵션으로 백엔드 '병합 전략'을 선택할 수 있습니다. 일부 전략은 자체 옵션을 취할 수도 있으며, git merge 및 / 또는 git pull에 -X 인수를 제공하여 전달할 수 있습니다.

우리 것

이것은 수에 상관없이 헤드를 해결하지만 병합의 결과 트리는 항상 현재 분기 헤드의 트리이며 다른 모든 분기의 모든 변경 사항을 효과적으로 무시합니다. 사이드 브랜치의 오래된 개발 역사를 대체하는 데 사용됩니다. 이는 '재귀 적'병합 전략에 대한 -Xours 옵션과 다릅니다.

그러나 Bitbucket이 나중에 보는 것은 나에게 미스테리입니다. 커밋을 병합으로 인식하지만 실제로 분기를 병합하지 못합니다 (풀 요청을 해결하지 않음). 아마도 Bitbucket 전문가가이 문제에 대해 도움을 줄 수있을 것입니다. 그 가시성이 없기 때문에 로그 / 오류 메시지-git / TortoiseGit은 전혀 불평하지 않습니다.

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