我希望使用meld或其他差异工具手动合并所有文件,如何在Git中实现?
当我运行 git mergetool
时,
它显示 no files need merging
。所以我想只有在出现冲突的情况下才能这样做。
我希望使用meld或其他差异工具手动合并所有文件,如何在Git中实现?
当我运行 git mergetool
时,
它显示 no files need merging
。所以我想只有在出现冲突的情况下才能这样做。
有一个更简单的方法:
git merge --no-commit merge_branch
正如man所说:
--no-commit
选项执行合并操作,但假装合并失败,不自动提交,让用户有机会检查和进一步调整合并结果后再提交。
--no-ff
,将禁用快进合并(fast forwarding),除非存在冲突。 - Løitengit mergetool
。 - Pluto我有这样一个情况:
git merge --no-commit merge_branch
刚刚触发了快进。
如果出现这种情况,您可以使用:
git merge --no-commit --no-ff merge_branch
然后您将能够审查您的更改。
pull
只是 fetch
和 merge
的组合,所以首先调用 git fetch merge_branch
,然后再执行 merge
。 - Top-Master--no-commit --no-ff
的效果类似于在根目录下包含 *.gitattributes
文件,其中包含 -merge
,但每个合并的选择是使用它还是不使用。 - Top-Master类似的问题是如何使用git防止自动合并?
FractalSpace给出了一个我认为很有用的答案:
$ git checkout master
$ git difftool -t kdiff3 local-branch HEAD
这个想法是使用差异工具而不是自动合并工具手动选择需要的内容并创建新文件。
/tmp
中的临时文件中,并不会更改工作目录。但是我需要将更改存储到工作目录中。 - porton如果你只需要微调一个合并的话,请跳转到下面的混合部分。
如果你对@True使用 git difftool
与其他使用 git merge
的答案之间的区别感到困惑,请查看Git mergetool vs difftool。
以下是更多详细信息:
Difftool
如果你已经配置了git使用像kdiff3、meld或vimdiff这样的现代 diff.tool
,你就可以使用该diff工具手动合并,命令行可以很简单:
git difftool other_branch
这将让你在当前分支和其他分支之间进行双向手动合并(在man git-config
中被描述为$LOCAL和$REMOTE)。
合并工具
其他答案所述的“正确”方法是配置git使用kdiff3或vimdiff作为您的merge.tool
,并使用:
git merge --no-commit --no-ff other_branch
git mergetool
这个命令可以在$BASE、$LOCAL和$REMOTE之间执行N路手动合并,结果为$MERGED。请参见https://dev59.com/BHVC5IYBdhLWcg3w9GE9#2235841以获取有关如何配置git的示例。如果您使用git已知的工具之一,则可能根本不需要配置mergetool.*.cmd
条目。(Meld只能显示三个窗格,因此如果您使用默认设置的meld,则将无法看到$ BASE。)
difftool与mergetool对比
也许会有人纠正我,但上述difftool
和mergetool
技术之间的主要区别似乎是:
mergetool
可以进行N路合并(如果相应地进行配置)mergetool
将other_branch作为父项添加到新提交中,以便历史记录正确工作difftool
允许您手动查看和选择每个更改行,但您会失去用mergetool
获得的上述两个优点混合--融合最佳特点
一种结合合并和差异化的方法会像这样:
git merge --no-commit --no-ff other_branch
git mergetool
git difftool HEAD
git commit
...这将执行N路合并以解决冲突并使历史记录正确运作,然后显示完整的差异集,以便您在提交之前进行审查和调整。
/tmp
中的临时文件中,并不会更改工作目录。但是我需要将更改存储到工作目录中。 - porton我发现其他答案不太令人满意,因此在寻找答案时感到沮丧。我最终在这里找到了解决这个问题的方法:https://dev59.com/LGgv5IYBdhLWcg3wMN4U#11593308
如果你运行这些命令,你将创建一个新的提交,它基本上获取了branchToMergeFrom
的最新提交,并允许你在其上应用补丁,这类似于在其上进行了额外的提交。
git checkout branchToMergeTo
git checkout --patch branchToMergeFrom [file]
你将会被提示(逐个文件如果你没有指定file
),让你选择要合并的每个“块”。以这种方式引导你完成原本应该是自动合并过程的每一步,而是要求你在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)
。底部的提示让您可以使用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
选项将代码块分割成更小的块。
如果你想要手动合并,同时仍尽可能利用自动合并过程,我建议使用这个方法。区别在于,您可以查看每个合并的‘块’并按照自己的意愿进行编辑。希望这能帮助未来的读者。
在此过程之后,您可能需要运行 git checkout branchToMergeTo && git merge branchToMergeFrom
以正式将branchToMergeFrom
的历史记录合并到branchToMergeTo
中。
我选择策略ours(在TortoiseGit中也存在这个选项),在手动进行差异比较后,您可以手动引入所需更改。
From: https://git-scm.com/docs/merge-strategies
合并机制(git merge和git pull命令)允许选择后端“合并策略”使用-s选项。一些策略也可以采用自己的选项,可以通过给git merge和/或git pull传递-X参数来传递。