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

时间:2011-01-11 11:16:01

标签: git merge git-merge

我想将所有文件手动与meld或任何其他差异工具合并,我该如何使用Git?
当我运行git mergetool时 它说no files need merging。所以我想我只有在遇到冲突时才能这样做。

7 个答案:

答案 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向合并功能以外,这两种方法似乎产生相同的结果。 difftoolmergetool都没有在新提交中将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一点也不抱怨。