如何使用Git阻止automerge?

mar*_*say 57 git

我试图将本地分支合并到主分支而不让Git进行自动注册.我想"亲自挑选"我想要合并为主人的东西.

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

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

更新:

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

Fra*_*ace 77

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

$ git checkout master
$ git difftool -t kdiff3 local-branch HEAD
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • OP的工作流程没有任何问题.他可能只是面临复杂的合并.Git喜欢决定某些合并是"安全的",并且当它们真的不安全时会默默地执行它们. (33认同)
  • @FractalSpace当你遇到合并冲突时,你也在挑选和选择.如果你认为挑选和选择是一个有缺陷的过程,那么它并不比"希望最好的"自动合并更糟糕(也可能更好). (7认同)
  • 如果您已经使用git config正确设置了difftool,则-t kdiff3不是必需的或有用的. (3认同)
  • 选择作为答案! (2认同)
  • @Apprentice队列您遗漏了重点。当git确实合并并且没有冲突时,您就不会选择任何东西。git神奇地合并了文件,这是op想要避免的。 (2认同)
  • @SzczepanHołyszewski 合并方向是“local-branch”到“master” (2认同)

eck*_*kes 17

git merge --no-commit --no-ff <local-branch>
Run Code Online (Sandbox Code Playgroud)

可以.

执行时,将应用更改local-branch但尚未暂存.

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

git commit -a 
Run Code Online (Sandbox Code Playgroud)

否则,选择要采用的文件,将它们暂存git add并最终提交git commit.然后恢复不需要的文件git checkout -- filename.

  • 我尝试了这个命令,似乎它做了一个automerge并上传了文件.运行第一个命令后,我得到以下消息:自动合并顺利; 在按要求提交之前停止 (4认同)
  • @marckassy:但是你可以然后`git reset HEAD` 和`git add -p` 来选择你想要的。 (3认同)
  • 我想实现同样的目标,在 `git merge --no-commit --no-ff &lt;local-branch&gt;` 之后,我运行了一个 `git reset HEAD`。这样,所有“暂存以提交”的更改都变成了“未暂存”。现在使用`git diff`我可以看到完整的差异,我可以`add`和`commit`我想要的并丢弃不需要的更改 (3认同)
  • 要完全关闭初始合并,请添加`-s ours`. (2认同)

and*_*ate 6

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

您可能想看看使用自定义合并驱动程序。此页面描述了如何进行。

Git-如何在选定文件上强制合并冲突和手动合并

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

git diff --name-only <branch1> <branch2> 
git checkout <branch1> -- <paths>
Run Code Online (Sandbox Code Playgroud)

  • 这并不是不信任自动合并。它根本没有给我任何关于 git 对文件做了什么的信息。 (3认同)