git merge conflicts even with git reset --hard



我正在一个存储库的分支上工作。我每天从一台计算机上提交并推送更改。然后第二天在另一台计算机上执行git pull,并期望从前一天推送的更改在我的工作目录中更新。

我一直收到:

CONFLICT (content): Merge conflict in src/main.c
Automatic merge failed; fix conflicts and then commit the result.

好,所以我然后做一个git reset --hard HEAD,这应该撤消所有本地和未提交的更改,然后再做git pull。但是,冲突错误仍然存在。

这不是我期望的行为。以前对我来说,git reset --hard HEAD跟着git pull会解决这个问题。但现在不是了:)

有人知道我在这里做错了什么吗?由于

git reset --hard HEADgit merge --abort做同样的事情:

  • 终止正在进行的合并;和
  • HEAD(当前提交)复制所有提交的文件到Git的索引和你的工作树。

合并冲突的发生是因为当前分支上的更改与来自git pull的传入提交的更改发生了冲突。也就是说,您的git pull正在运行:

  1. git fetch;然后
  2. git mergearguments(其中参数由于历史原因有些复杂)

第二步,git merge,实际上是git merge HEAD@{upstream},并且正在寻找一些合并工作要做:

I--J   <-- your-branch (HEAD)
/
...--G--H   [merge base]

K--L   <-- origin/your-branch

对于Git合并自共同起始点以来的更改,这里,提交H-由您在提交IJ时所做的更改与其他人在提交KL时所做的更改,Git必须比较(如git diff)在中共同起始点提交的快照与两个分支提示提交的快照:

git diff --find-renames <hash-of-H> <hash-of-J>   # what we changed
git diff --find-renames <hash-of-H> <hash-of-L>   # what they changed
Git的git merge然后尝试将合并这两组更改。当它这样做时,它会遇到一组无法组合的更改:
CONFLICT (content): Merge conflict in src/main.c
Automatic merge failed; fix conflicts and then commit the result.

也就是说,从HJ改变了src/main.c中的一些内容,从HL他们也改变了src/main.c中的一些内容,而这两个变化是不一致的

你会得到一个合并冲突,因为Git不能自己合并这些更改。运行git merge --abortgit reset --hard HEAD只会让您回到git merge之前的状态;再次运行git pull会导致git merge运行相同的两个git diff,以相同的方式组合它们,遇到相同的问题,并以相同的错误停止。

git reset origin/<my-branch>已经帮我解决了

这样做是为了扔掉你的工作。也就是说,给定上面的图表,git reset做了如下操作:

I--J   ???
/
...--G--H   <-- your-branch (HEAD)

K--L   <-- origin/your-branch

(虽然git reset --mixed后面跟着git merge会产生错误,所以我猜你在某处添加了一个--hard)。

在这样的git reset之后,合并将工作,但这是因为您丢弃了所有自己的工作。如果这是你想要的,你已经准备好了。

最新更新