Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git:拉取当前分支的最新版本时发生冲突_Git - Fatal编程技术网

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]