如何在Git中手动合并所有文件?

How to merge all files manually in Git?

我想用meld或任何其他diff工具手动合并所有文件,我如何用git来完成这项工作?< BR>当我运行git mergetool时上面写着no files need merging。所以我想只有在我有冲突的时候我才能做到。


有更简单的方法:

git merge --no-commit merge_branch

正如人们所说:

With --no-commit perform the merge but pretend the merge failed and do
not autocommit, to give the user a chance to inspect and further tweak
the merge result before
committing.


我曾经有过这样一个场景:

1
git merge --no-commit merge_branch

刚刚导致了一个快速前进。

如果发生这种情况,您可以使用:

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

然后您就可以查看您的更改了


一个类似的问题是如何防止使用git的自动合并?

分形空间给出了一个我认为有用的答案:

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

其想法是使用difftools而不是自动合并工具来手动选择所需内容并创建新文件。


注意,如果您坚持手动合并(可能对于某类文件),您仍然可以定义合并驱动程序。在"Git-如何强制合并冲突和手动合并所选文件"中有一个具体的例子。

这样,合并驱动程序脚本就可以调用所需的任何合并工具。


如果有人来这里想知道@true使用git difftool的答案与使用git merge的其他答案之间的区别,请参阅git mergetool vs difftool。

简而言之,如果Git配置为使用现代diff.tool,如kdiff3、meld或vimdiff,则可以使用diff工具本身手动合并不同的文件,并且命令行可以很简单:

1
git difftool other_branch

…这将允许您在当前分支和其他分支之间进行双向手动合并(在man git-config中称为$local和$remote)。

其他答案讨论的"正确"方式是将git配置为使用,例如kdiff3或vimdiff作为您的merge.tool,并使用:

1
2
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只能显示三个窗格,因此如果将meld与默认设置一起使用,将看不到$base。)

有人可能会跳进来纠正我,但除了N向合并能力,这两种方法似乎产生了相同的结果。difftoolmergetool都没有在新提交时添加其他分支作为父级,因此在这两种情况下,合并在例如gitk中并不明显,必须在提交消息中描述(稍后注意)。


我选择了我们的策略(它也存在于tortoisegit中),在进行了手动差异之后,您已经引入了您想要的手动更改。

来自:https://git-scm.com/docs/merge-strategies网站

The merge mechanism (git merge and git pull commands) allows the backend 'merge strategies' to be chosen with -s option. Some strategies can also take their own options, which can be passed by giving -X arguments to git merge and/or git pull.

ours

This resolves any number of heads, but the resulting tree of the merge
is always that of the current branch head, effectively ignoring all
changes from all other branches. It is meant to be used to supersede
old development history of side branches. Note that this is different
from the -Xours option to the 'recursive' merge strategy.

但是BitBucket后来看到的对我来说是个谜,它承认提交是合并,但是实际上合并分支失败(不能解决拉请求)——也许BitBucket专家可以帮助解决这个问题,我甚至不能给你任何日志/错误消息,因为我没有这个可见性——Git/TortoisGit一点也不抱怨。