如何使用Git防止自动合并?

如何使用Git防止自动合并?,git,Git,我正在尝试将本地分支合并到主分支中,而无需Git进行自动合并。我想“手工挑选”我想合并成大师的东西 当我使用Git的difftool命令时,我能够diff并选择要添加到主分支中的内容。但当我进行合并时,我将丢失之前选择的内容,因为Git将进行自动合并。我可以在合并之前将更改提交到master,但这样做似乎不自然 Git的合并工具只有在合并发生冲突时才可用。但是如果Git执行自动合并,那么通常不会发生冲突,因此我无法运行mergetool命令 更新: 我开始认为我试图完成的是糟糕的实践,或者根本不

我正在尝试将本地分支合并到主分支中,而无需Git进行自动合并。我想“手工挑选”我想合并成大师的东西

当我使用Git的difftool命令时,我能够diff并选择要添加到主分支中的内容。但当我进行合并时,我将丢失之前选择的内容,因为Git将进行自动合并。我可以在合并之前将更改提交到master,但这样做似乎不自然

Git的合并工具只有在合并发生冲突时才可用。但是如果Git执行自动合并,那么通常不会发生冲突,因此我无法运行mergetool命令

更新:

我开始认为我试图完成的是糟糕的实践,或者根本不可能。也就是说,合并一个主题分支,只让它合并我需要的diffing。此外,这也反映在历史上。无论如何,我在试验Git时提出的问题浮出水面

git merge --no-commit --no-ff <local-branch>
否则,选择要获取的文件,使用
git add
暂存它们,最后使用
git commit
提交它们。还原不需要的文件,然后使用git checkout--filename

我想您需要选择单独的更改:

git checkout master
git log --reverse --oneline topic ^master
然后为希望在主分支中进行的每个提交调用
git cherry pick

如果应保留主题分支中的其余更改,则您可能还希望在新主节点上重新设置此分支的基础:

git rebase master topic

您试图绕过Git而不参与合并过程,并手动选择要合并的每个修改文件的每一行。这与git cherry pick不同。也不会合并git--no commit,等等。帮助。您需要执行以下操作:

$ git checkout master
$ git difftool -t kdiff3 local-branch HEAD
在窗口中,左侧(
A
)是本地分支,右侧(
B
)是当前分支(主分支)

从菜单中选择
Merge |合并当前文件
(或按标题相同的彩色菱形图标)

然后会显示每个文件的差异和冲突(如果有)。您将能够选择左侧或右侧(
A
B
),或两者,和/或手动调整合并文件


另一方面,有人告诉我,您的工作流存在一些更大的问题。

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

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

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

git diff --name-only <branch1> <branch2> 
git checkout <branch1> -- <paths>
git diff——仅限名称
git签出--
对于vim和vim逃犯用户: 将以下内容添加到~/.gitconfig

[difftool "fugitive"]
  cmd = vimdiff $LOCAL $MERGED $REMOTE
  trustExitCode = false
  keepBackup = false
现在使用逃犯进行3路差异

$git签出主机
$git difftool-t逃犯分支机构负责人
关于$LOCAL、$MERGED、$REMOTE的说明:

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

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


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

您“选择优先”的更改来自何处?在进行合并之前,它们是工作树中的本地修改?你是否试图合并一个分支并只保留其中的一些更改?Jefromi,回答你的第一个问题,这些更改来自于主题分支的扩展。这就是我在第二段第一句中提到的。第二个问题的答案,是的,它们是本地修改的。这就是为什么如果我进行合并(没有先提交),我将丢失这些差异。回答你的第三个问题,是的。我正在尝试合并一个分支,并通过使用diff工具(例如KDiff3)选择我想要的内容,从而仅保留其中的一些更改。关于您的更新:如果您打算合并该分支的其余部分,这确实是一种糟糕的做法。记录合并后,表示您拥有合并提交的内容。不过,您当然可以做您开始做的事情——有选择地在主题分支中应用几行diff,并直接提交(而不是合并)。如果以后合并整个主题,这应该(希望)不会导致冲突。请在此处接受答案。我尝试了该命令,它似乎执行了自动合并并暂存文件。运行第一个命令后,我得到以下消息:自动合并进行得很顺利;在提交为之前停止requested@marckassy:但是你可以
git reset HEAD
git add-p
来选择你想要的。要完全关闭最初的合并,请添加
-s ours
。我想达到同样的目标,在
git merge--no commit--no ff
之后,我运行了一个
git reset HEAD
。这样,所有“为提交而暂存”的更改都变为“未暂存”。现在,通过
git diff
我可以看到完整的差异,我可以
添加
提交
我想要的内容,并丢弃不需要的更改。我从来都不知道cherry pick命令。我希望使用diff工具(例如KDiff3)从提交中手动选择几行代码。这似乎合并了整个提交过程。@marckassy:如果你这样做,
git cherry pick--no commit;git重置磁头
然后,您可以使用git add-p仅准备您想要的内容。选择
[difftool "fugitive"]
  cmd = vimdiff $LOCAL $MERGED $REMOTE
  trustExitCode = false
  keepBackup = false