我想将所有文件手动与meld或任何其他差异工具合并,我该如何使用Git?
当我运行git mergetool
时
它说no files need merging
。所以我想我只有在遇到冲突时才能这样做。
答案 0 :(得分:94)
有更简单的方法:
git merge --no-commit merge_branch
正如男人所说:
使用
--no-commit
执行合并但假装合并失败并执行 不自动提交,让用户有机会检查并进一步调整 之前的合并结果 犯。
答案 1 :(得分:37)
我有一个场景:
git merge --no-commit merge_branch
刚刚造成快速前进。
如果发生这种情况,您可以使用:
git merge --no-commit --no-ff merge_branch
然后您就可以查看更改了
答案 2 :(得分:16)
类似的问题是How to prevent an automerge using git?
FractalSpace给出了一个我觉得有用的答案:
$ git checkout master
$ git difftool -t kdiff3 local-branch HEAD
这个想法是使用difftools而不是自动合并工具来手动选择你需要的东西并创建新文件。
答案 3 :(得分:6)
注意,如果您坚持手动合并(可能是某类文件),您仍然可以定义合并驱动程序。
你在“Git - how to force merge conflict and manual merge on selected file”中有一个具体的例子。
这样,您的合并驱动程序脚本可以调用您想要的任何合并工具。
答案 4 :(得分:5)
我发现其他答案不尽人意,因此沮丧地寻找答案。我终于在这里找到这个问题的解决方案:https://stackoverflow.com/a/11593308/1351182
如果运行这些命令,则将创建一个新的提交,该提交实质上需要使用basePath
的最新提交,并允许您在其之上应用补丁,我认为这就像在顶部进行一次额外的提交。
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
中。
答案 5 :(得分:2)
对于来到这里并且现在想知道使用git difftool
的@True答案和使用git merge
的其他答案之间的区别的人,请参见Git mergetool vs difftool。
简而言之,如果您已将git配置为使用现代的diff.tool
(例如kdiff3,meld或vimdiff),则可以使用diff工具本身手动合并不同的文件,并且命令行可以很简单:
git difftool other_branch
...这将使您可以在当前分支和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。有关如何配置git的示例,请参见https://stackoverflow.com/a/2235841/1264797。如果您使用git已经知道的一种工具,那么您根本不需要配置mergetool.*.cmd
条目。 (“合并”只能显示三个窗格,因此,如果将“ meld”使用默认设置,则不会看到$ BASE。)
可能有人会纠正我,但是除了N向合并功能以外,这两种方法似乎产生相同的结果。 difftool
和mergetool
都没有在新提交中将other_branch作为父项添加,因此在两种情况下,合并都不明显,例如gitk并且必须在提交消息中进行描述(并在以后进行注意)。
答案 6 :(得分:0)
我选择了策略我们的(在TortoiseGit中也作为选择),在进行了手动差异后,您手动引入了所需的更改。
发件人: https://git-scm.com/docs/merge-strategies
合并机制(git merge和git pull命令)允许使用-s选项选择后端“合并策略”。某些策略也可以采用自己的选项,可以通过为git merge和/或git pull提供-X参数来传递它们。
我们的
这可以解析任意数量的heads,但是合并后的结果树 始终是当前分支头的,有效地忽略了所有 从所有其他分支机构更改。它是用来取代 侧支的发展历史。请注意,这是不同的 从-Xours选项更改为“递归”合并策略。
然而,Bitbucket后来看到的东西对我来说还是个谜,它将提交识别为合并,但无法实际合并分支(不能解决请求请求)-也许Bitbucket专家可以解决这个问题,我什至不能因为我没有这种可见性,所以会给您任何日志/错误消息-git / TortoiseGit一点也不抱怨。