Git:拉取当前分支的最新版本时发生冲突
恐怕这件事已经被问了几千次了,但我在任何地方都找不到它,而且它总是发生在我身上 在工作中,当我尝试提取当前已签出的分支上的最新提交时,会出现冲突错误。即使我没有对分支进行任何更改,这种情况也会发生 因此,我最终删除了我的本地分支,并获取该分支,就好像它是全新的一样 这是我描述的一个例子:Git:拉取当前分支的最新版本时发生冲突,git,Git,恐怕这件事已经被问了几千次了,但我在任何地方都找不到它,而且它总是发生在我身上 在工作中,当我尝试提取当前已签出的分支上的最新提交时,会出现冲突错误。即使我没有对分支进行任何更改,这种情况也会发生 因此,我最终删除了我的本地分支,并获取该分支,就好像它是全新的一样 这是我描述的一个例子: ➜ my_project git:(foo_branch) ✗ git pull From github.com:Blabla/my_project + c6a6ccf...39052a7 foo_bran
➜ my_project git:(foo_branch) ✗ git pull
From github.com:Blabla/my_project
+ c6a6ccf...39052a7 foo_branch -> origin/foo_branch (forced update)
+ aa9d3a9...22cdf8c development -> origin/development (forced update)
* [new branch] docs/DE3802 -> origin/docs/DE3802
0b2ed86..1256c5c docs/US16862 -> origin/docs/US16862
15a755b..8a3ebdd master -> origin/master
Auto-merging cloudformation/appsync/schema.graphql
CONFLICT (add/add): Merge conflict in my_project/media/clients/foo/file_1
Auto-merging my_project/media/clients/foo/policy_coverages
Auto-merging my_project/apps/engine/tests/test_functions.py
CONFLICT (content): Merge conflict in my_project/apps/engine/tests/test_functions.py
Auto-merging my_project/apps/engine/functions.py
CONFLICT (content): Merge conflict in my_project/apps/engine/functions.py
Auto-merging my_project/apps/engine/defaults.py
CONFLICT (content): Merge conflict in my_project/apps/engine/defaults.py
Automatic merge failed; fix conflicts and then commit the result.
我怎样才能获取分支中的最新更改,并使它们覆盖我已有的旧版本?有人一直在更改历史并强制推动他们的分支
From github.com:Blabla/my_project
+ c6a6ccf...39052a7 foo_branch -> origin/foo_branch (forced update)
+ aa9d3a9...22cdf8c development -> origin/development (forced update)
* [new branch] docs/DE3802 -> origin/docs/DE3802
0b2ed86..1256c5c docs/US16862 -> origin/docs/US16862
15a755b..8a3ebdd master -> origin/master
tl;dr:除非需要更改,否则不要创建本地分支。与其创建并签出foo_分支,不如签出origin/foo_分支
tl;dr:使用git pull-rebase在远程分支上重播本地更改。我建议重新调整所有拉力。它是安全的。可以通过将其添加到.gitconfig中来实现
git pull是git获取加上git合并。git pull的第一部分是git fetch部分的记录,用于更新远程跟踪分支
From github.com:Blabla/my_project
+ c6a6ccf...39052a7 foo_branch -> origin/foo_branch (forced update)
+ aa9d3a9...22cdf8c development -> origin/development (forced update)
* [new branch] docs/DE3802 -> origin/docs/DE3802
0b2ed86..1256c5c docs/US16862 -> origin/docs/US16862
15a755b..8a3ebdd master -> origin/master
让我们只关注foo_分支
这表示远程分支foo_分支正在origin/foo_分支中本地跟踪。您在c6a6ccf有origin/foo_分支机构。回程将其移动到39052a7,强制更新和。。。表明这不是快进
快进是指在不合并的情况下更新分支。例如
A - B - C [master]
\
D - E [feature]
如果我们将git合并特性放到master中,那么就不需要合并,git只需将master标签移动到与该特性相同的commit
如果主控台有更改,则需要合并以将特性中的更改与主控台中的新更改合并
A - B - C - F [master]
\
D - E [feature]
$ git merge feature
A - B - C - F - G [master]
\ /
D - E [feature]
通常,git fetch是一种快进方法。origin/foo_分支是上次git获取的快照。您不应该对origin/foo_分支进行任何其他更改,因此任何新更改都可以快速转发。下面是它的样子。记住,git pull-origin-foo_分支是git-fetch-origin,git-merge-foo_-origin/foo_分支
但是,如果有人对foo_branch进行了重新定位并进行了强制推送,会发生什么呢
origin
A - B1 - C1 - D - E [foo_branch]
local
A - B - C [foo_branch]
[origin/foo_branch]
$ git fetch origin
local
A - B1 - C1 - D - E [origin/foo_branch]
\
B - C [foo_branch]
B1和C1表示重定基础的提交。在fetch foo_分支和origin/foo_分支分叉之后。git pull的下一部分无法快进,需要合并
$ git merge foo_branch origin/foo_branch
local
A - B1 - C1 - D - E [origin/foo_branch]
\ \
B - C ------------ M [foo_branch]
尽管foo_分行未发生局部变更,但B与B1、C与C1之间可能存在冲突
那么,该怎么办呢
首先,如果不需要进行本地更改,请不要创建本地分支。参考origin/foo_分支,而不是创建本地foo_分支。那么就没有本地分支不同步了
第二,更改git pull,使其执行重基而不是合并。您可以使用git pull-rebase单独执行此操作,也可以通过将pull.rebase设置为merges来全局执行此操作
回到我们上面的例子,在foo_分支被远程重设基础后,foo_分支和origin/foo_分支发生了分歧
origin
A - B1 - C1 - D - E [foo_branch]
local
A - B - C [foo_branch]
[origin/foo_branch]
git pull-rebase不会尝试合并。它将在新的origin/foo_分支的基础上,将您的本地更改重定为foo_分支。由于没有本地更改,所以foo_分支只需使用新的origin/foo_分支更新
如果您确实有更改,它们将在新的origin/foo_分支上重放
第三,与项目的其他成员讨论强制推送的过程。请不要将此作为覆盖文件关闭。这不是问题所在。我正在研究一个答案。这是一个惊人的超级澄清的解释。非常感谢你!我会在周一的工作中尝试所有的建议。我不理解关于结帐origin/foo_branch的建议。为什么要签出一个远程跟踪分支?从这里你能做什么,除了在分离的头部模式下环顾四周?@matt没错,你可以看树枝而不用做局部的。OP提到,即使我没有对分支做任何更改,这种情况也会发生在我身上。在这种情况下,他们不需要当地分支机构。少了一个需要维护的本地分支。对了,我明白了,你的理论是OP已经创建了一个本地分支,只是为了做远程跟踪分支的工作。然后,当你把它和有人强行推动遥控器上的分支结合在一起时,坏事情就发生了。
origin
A - B1 - C1 - D - E [foo_branch]
local
A - B - C [foo_branch]
[origin/foo_branch]
$ git fetch origin
local
A - B1 - C1 - D - E [origin/foo_branch]
\
B - C [foo_branch]
$ git merge foo_branch origin/foo_branch
local
A - B1 - C1 - D - E [origin/foo_branch]
\ \
B - C ------------ M [foo_branch]
origin
A - B1 - C1 - D - E [foo_branch]
local
A - B - C [foo_branch]
[origin/foo_branch]
local
A - B1 - C1 - D - E [foo_branch]
[origin/foo_branch]
origin
A - B1 - C1 - D - E [foo_branch]
local
A - B - C [origin/foo_branch]
\
F - G [foo_branch]
$ git pull --rebase
local
A - B1 - C1 - D - E [origin/foo_branch]
\
F - G [foo_branch]