首页 > 解决方案 > Git 直接拉合并更改,即使有冲突?

问题描述

我有一些本地更改,并且我知道自上次拉动以来回购已向前推进。当我执行 git pull 时,我收到以下消息 -

$ git pull
Enter passphrase for key '/c/Users/xxx/.ssh/id_rsa':
remote: Counting objects: 65, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 65 (delta 29), reused 0 (delta 0)
Unpacking objects: 100% (65/65), 16.35 KiB | 7.00 KiB/s, done.
From bitbucket.org:abc/someproject
   ashljkl..db9e852  feature/somefeature -> origin/feature/somefeature 
error: Your local changes to the following files would be overwritten by merge:
        src/main/java/com/somefilepath
Please commit your changes or stash them before you merge.
Aborting
Updating ashljkl..db9e852

来自这篇 SOF 帖子:如何忽略“git pull”上关于我的本地更改将被合并覆盖的错误? 我可以弄清楚如何解决这个问题。1) git stash local change 2) git pull 3) 然后 git stash pop 隐藏的更改。

但我想知道是否有更简单的方法来处理这个问题 -只需git pull使用一些选项/标志直接将来自 repo 的更改与我的本地更改合并。在合并的过程中,如果有冲突,我可以用 git 显示冲突并在有冲突的源文件中放置冲突标记。

标签: git

解决方案


没有简单的方法可以做到这一点。解决此问题的最简单、最好的方法是存储您的更改,然后拉取。

出现这种情况的原因是这里发生的任何类型的合并都涉及索引。合并会将更改写入索引,然后签出文件。您的更改可能会或可能不会在索引中。如果您没有git add在该特定版本上运行,它将不在索引中,并且任何合并操作都会在结帐期间破坏它,而不是实际执行合并。

如果这些更改在索引中,您可以尝试执行 agit fetch然后自己与 执行合并git read-tree -um,检出文件。但是,在这种情况下,Git 所做的三向合并与正常的递归合并不同,因此您将失去任何让诸如重命名之类的东西起作用的能力。因此,虽然这是可能的,但这不是一个好的选择,您可能会对结果不满意。您还必须自己进行合并基础计算(或编写脚本),这很麻烦。

所以最好的解决办法就是藏在这里。


推荐阅读