我正在一个存储库的分支上工作。我每天从一台计算机上提交并推送更改。然后第二天在另一台计算机上执行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 HEAD
和git merge --abort
做同样的事情:
- 终止正在进行的合并;和 从
HEAD
(当前提交)复制所有提交的文件到Git的索引和你的工作树。合并冲突的发生是因为当前分支上的更改与来自git pull
的传入提交的更改发生了冲突。也就是说,您的git pull
正在运行:
git fetch
;然后git mergearguments
(其中参数由于历史原因有些复杂)
第二步,git merge
,实际上是git merge HEAD@{upstream}
,并且正在寻找一些合并工作要做:
I--J <-- your-branch (HEAD)
/
...--G--H [merge base]
K--L <-- origin/your-branch
对于Git合并自共同起始点以来的更改,这里,提交H
-由您在提交I
和J
时所做的更改与其他人在提交K
和L
时所做的更改,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.
也就是说,从H
到J
,你改变了src/main.c
中的一些内容,从H
到L
,他们也改变了src/main.c
中的一些内容,而这两个变化是不一致的
你会得到一个合并冲突,因为Git不能自己合并这些更改。运行git merge --abort
或git 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
之后,合并将工作,但这是因为您丢弃了所有自己的工作。如果这是你想要的,你已经准备好了。