防止合并冲突的git pull选项

11

在执行git pull时,是否有选项可以完全避免合并冲突的可能性?我查看了合并策略,但没有一个满足这个描述。我正在寻找像git pull --quit_if_possible_merge这样的选项。

基本上,希望有一个命令可以将内容拉到生产站点,而不会有任何合并冲突的风险,因为这可能会导致站点暂时下线,直到我们解决它。


如果您只是从生产克隆中拉取代码而从未更改任何内容,为什么会出现冲突呢? - gview
1
没有这样的标志,但最好确保您的主分支始终可以执行快进合并以避免此问题。 - mipadi
请注意,Git 2.0将引入有用的“push.ff”设置:请参见下面的我的回答 - VonC
5个回答

21

怎么样:

git pull --ff-only 

如果其他答案所说的是真的,那么这应该会产生期望中的效果。不是吗?

--ff-only 标记代表 "快进"(Git 如何称呼其中一个合并分支包含另一个分支的所有提交(严格超集)的情况)。这很特殊,因为这意味着不可能出现合并冲突。位于前方的分支上的提交只需添加到另一个分支上,所有人都会很高兴。


3
如果解释一下-ff-only标志的作用,这个回答会更好。 - KatieK
"ff" 代表 "快进",这是 Git 中指的一个分支包含另一个分支的所有提交记录(严格超集)的情况。这是特殊的,因为它意味着不可能出现合并冲突。在领先的分支上的提交记录会被添加到另一个分支上,这样每个人都很开心。 - emersonthis
为什么不使用 git pull --ff-only 呢? - Michael Mior
@MichaelMior 没有什么原因。那是一个打字错误。一直应该是 pull。已经编辑过了。 - emersonthis

4
我不认为有这样的标志。如果出现冲突,就需要处理。但是有一种合并策略可以保证没有合并冲突:不要在生产站点上修改或提交任何内容
如果在生产站点上没有提交任何内容,则不会与之发生冲突。在本地计算机上的生产分支上进行所有合并,并在从生产站点拉取之前解决所有合并冲突。

4

正如其他人所说: 只有在本地仓库中提交了任何内容才会出现合并冲突。如果没有提交任何内容,您将不会遇到任何合并冲突。

如果您没有提交任何内容,但您在本地git仓库中工作,即更改文件或创建新文件,则git pull仍会使您陷入麻烦,因为它需要更新您修改的文件。 - 因此,请勿直接在本地仓库中工作,这样就可以避免问题。

接下来,如果您坚持在本地仓库中工作,并考虑使用git pull更新文件。您必须决定如何处理您修改的文件。 如果您只想放弃所有本地更改,只需获取远程存储库中的文件,您可以执行git fetch;git reset --hard @{u}


1
在Git中进行合并时,您可以执行以下类型的合并:
git merge -ff-only branch_to_merge_into_this_one

这将只在Git看到可以使用快进方式完成合并时才会完成合并。否则,Git将中止合并并告诉您无法以快进方式完成合并。
那么什么是快进合并,它如何确保不会发生合并冲突。快进合并会查看所涉及的两个分支(假设您正在A上合并B)的提交历史记录,然后检查B是否包含A的完整提交历史记录。此外,A不包含任何不属于B的提交。这意味着,在合并B时,可以通过将所有B的新提交堆叠在A的HEAD顶部,然后将A的HEAD移动到B的HEAD所在位置来进行合并。以这种方式应用变更集是线性的,没有冲突编辑的机会,因为Git在其提交历史记录中有足够的信息来负责决定哪些更改是您想要的,哪些不是。

1

Git 2.0(2014年第二季度)在commit b814da8中添加了一个名为push.ff的新设置:

在您的情况下:

git config push.ff only

pull.ff::

默认情况下,在合并当前提交的后代提交时,Git不会创建额外的合并提交。相反,当前分支的指针会快进到最新提交。 当将其设置为false时,此变量告诉Git在这种情况下创建额外的合并提交(等同于使用命令行中的--no-ff选项)。 当将其设置为only时,只允许此类快速前进合并(等同于使用命令行中的--ff-only选项)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接