如何使用Git阻止automerge?

时间:2011-03-08 16:04:58

标签: git

我正在尝试将本地分支合并到主分支而不让Git进行自动注册。我想“亲自挑选”我想要合并为主人的东西。

当我使用Git的difftool命令时,我能够区分并选择我想要添加到主分支中的内容。但是当我合并时,我会失去我之前选择的东西,因为Git会做一个automerge。我可以在合并之前将更改提交到master中,但这样做似乎不自然。

Git的mergetool仅在合并发生冲突时才可用。但是如果Git做了automerge,那么通常没有冲突,所以我无法运行mergetool命令。

更新

我开始认为我想要完成的是不好的做法,或者这是不可能的。也就是说,合并一个主题分支,只让它合并我需要的差异。此外,还有这一点反映在历史上。无论如何,我在试验Git时发布了一个问题。

5 个答案:

答案 0 :(得分:74)

您试图绕过Git参与合并过程并手动选择要合并的每个修改文件的每一行。这与git cherry-pick不同。 git merge --no-commit等都不会有帮助。你需要做:

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

KDiff3窗口中,左侧(A)是您的本地分支,右侧(B)是您的< em>当前分支(主)。

从菜单中选择Merge | Merge Current File(或按下带有相同标题的彩色菱形图标)。

然后,您将看到每个文件的差异和冲突(如果有)。您可以选择左侧或右侧(AB)或两者,和/或手动调整合并文件。

另一方面,有些事情告诉我你的工作流程存在一些更大的问题。

答案 1 :(得分:17)

git merge --no-commit --no-ff <local-branch>

做到了。

执行时,local-branch的更改已应用,但尚未暂存。

然后,您可以查看要应用的更改 - 如果您想要全部使用它们 - 请将它们应用于

git commit -a 

否则,选择要采用的文件,使用git add进行暂存,最后使用git commit进行提交。然后使用git checkout -- filename恢复不需要的文件。

答案 2 :(得分:5)

如果您不信任自动合并,我可以看到您可能希望这样做,因为文件中不同位置的两次编辑(在不同分支上完成)可能不会导致自动合并引发冲突但可能实际上并没有一起工作。

您可能希望查看使用自定义合并驱动程序。本页介绍了如何进行此操作。

here

另一种方法是在执行合并之前首先找到分支之间不同的文件,然后将文件签出到相应的分支中,以确保获得包含其中一个或另一个的干净合并和功能代码。两次编辑。

git diff --name-only <branch1> <branch2> 
git checkout <branch1> -- <paths>

答案 3 :(得分:0)

对于vim和vim逃犯用户:

将以下内容添加到〜/ .gitconfig

[difftool "fugitive"]
  cmd = vimdiff $LOCAL $MERGED $REMOTE
  trustExitCode = false
  keepBackup = false

现在使用“逃犯”进行三向差异

$ git checkout master
$ git difftool -t fugitive somebranch HEAD

关于$ LOCAL,$ MERGED,$ REMOTE的注释:

$ LOCAL您要合并的分支上的文件;显示给您的合并过程未触及

$ MERGED部分合并的文件,有冲突;这是合并过程中涉及的唯一文件,实际上,它从未在合并中显示给您

$ REMOTE您要合并的分支上的文件;显示给您的合并过程未触及

答案 4 :(得分:-1)

我认为您希望挑选个别更改:

git checkout master
git log --reverse --oneline topic ^master

然后为您希望在主分支中进行的每次提交调用git cherry-pick

如果应保留主题分支中的其余更改,您可能还想在新主服务器之上重新定义此分支:

git rebase master topic