meld 또는 다른 diff 도구 를 사용하여 모든 파일을 수동으로 병합하고 싶습니다. Git으로 어떻게 할 수 있습니까?
내가 실행 git mergetool
하면 no files need merging
. 그래서 갈등이있을 때만 할 수 있다고 생각합니다.
meld 또는 다른 diff 도구 를 사용하여 모든 파일을 수동으로 병합하고 싶습니다. Git으로 어떻게 할 수 있습니까?
내가 실행 git mergetool
하면 no files need merging
. 그래서 갈등이있을 때만 할 수 있다고 생각합니다.
답변:
훨씬 더 간단한 방법이 있습니다.
git merge --no-commit merge_branch
남자가 말했듯이 :
함께
--no-commit
병합을 수행하지만, 척 실패 병합 및 자동 커밋하지 않는 사용자에게 검사 및 추가 커밋하기 전에 병합 결과를 조정할 수있는 기회를 제공합니다.
--no-ff
빠른 전달 을 추가 하면 충돌이없는 경우 발생합니다.
git mergetool
충돌이있는 경우 사용 하십시오.
다음과 같은 시나리오가 있습니다.
git merge --no-commit merge_branch
빨리 감기를 일으켰습니다.
이 경우 다음을 사용할 수 있습니다.
git merge --no-commit --no-ff merge_branch
그러면 변경 사항을 검토 할 수 있습니다.
pull
단지 조합 fetch
과 merge
첫 번째 호출 할 git fetch merge_branch
다음 후자 DOmerge
--no-commit --no-ff
것은 .gitattributes
루트 디렉토리에를 포함하는 파일을 갖는 것과 * -merge
같지만 사용 여부는 merge
선택에 따라
Automatic merge went well; stopped before committing as requested
실행합니다. 내가 실행하려고하면 git mergetool
그것은 말한다 No files need merging
.
비슷한 질문은 git을 사용하여 자동 병합을 방지하는 방법입니다.
FractalSpace는 내가 유용하다고 생각하는 답변을 제공했습니다.
$ git checkout master
$ git difftool -t kdiff3 local-branch HEAD
아이디어는 자동 병합 도구 대신 difftools를 사용하여 필요한 것을 수동으로 선택하고 새 파일을 만드는 것입니다.
git merge
이 페이지를 우연히 발견 한 다른 사람들을 위해 명확하게하기 위해이 답변을 답변과 비교하는 답변을 추가했습니다 .
수동으로 병합해야하는 경우 (아마도 특정 파일 클래스에 대해) 병합 드라이버를 정의 할 수 있습니다 .
" Git-선택한 파일에 병합 충돌 및 수동 병합을 강제하는 방법 에 대한 구체적인 예가 있습니다. 있습니다.
이렇게하면 병합 드라이버 스크립트가 원하는 병합 도구를 호출 할 수 있습니다.
여기에 와서 사용 git difftool
하는 @True 의 답변 과 사용 하는 다른 답변 의 차이점에 대해 궁금해하는 사람 git merge
은 Git mergetool과 difftool을 참조하십시오. .
간단히 말해, diff.tool
kdiff3, 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.*.cmd
git이 이미 알고있는 도구 중 하나를 사용하면 항목을 전혀 . (Meld는 3 개의 창만 표시 할 수 있으므로 기본 설정으로 meld를 사용하면 $ BASE가 표시되지 않습니다.)
누군가 나를 바로 잡기 위해 뛰어들 수도 있지만 N-way 병합 능력을 제외하고는 두 가지 방법이 동일한 결과를 생성하는 것처럼 보입니다. 어느 쪽 difftool
도 mergetool
새에 부모가 그렇게 두 경우 모두에서, 커밋 other_branch 추가, 병합은 예를 들어 gitk이 명령에서 명확하지 않습니다 및 설명 (나중에 발견)가이 메시지를 커밋되어야 할 것이다.
다른 답변이 불만족스러워 답을 찾기 위해 답답해졌습니다. 이 질문에 대한 해결책은 마침내 여기에서 찾았습니다 : 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
정식의 역사를 병합하기 위해 branchToMergeFrom
에 branchToMergeTo
.
나는 전략 선택 우리를 당신이 가져-에있는 수동으로 원하는 변경 수동 DIFF을 수행 한 후, (이 TortoiseGit의 선택으로도 존재한다).
출처 : https://git-scm.com/docs/merge-strategies
병합 메커니즘 (git merge 및 git pull 명령)을 사용하면 -s 옵션으로 백엔드 '병합 전략'을 선택할 수 있습니다. 일부 전략은 자체 옵션을 취할 수도 있으며, git merge 및 / 또는 git pull에 -X 인수를 제공하여 전달할 수 있습니다.
우리 것
이것은 수에 상관없이 헤드를 해결하지만 병합의 결과 트리는 항상 현재 분기 헤드의 트리이며 다른 모든 분기의 모든 변경 사항을 효과적으로 무시합니다. 사이드 브랜치의 오래된 개발 역사를 대체하는 데 사용됩니다. 이는 '재귀 적'병합 전략에 대한 -Xours 옵션과 다릅니다.
그러나 Bitbucket이 나중에 보는 것은 나에게 미스테리입니다. 커밋을 병합으로 인식하지만 실제로 분기를 병합하지 못합니다 (풀 요청을 해결하지 않음). 아마도 Bitbucket 전문가가이 문제에 대해 도움을 줄 수있을 것입니다. 그 가시성이 없기 때문에 로그 / 오류 메시지-git / TortoiseGit은 전혀 불평하지 않습니다.