在 certrain 分支中只有“git pull”做什么?

时间:2021-03-19 01:25:47

标签: git git-pull

我有一个分支 A 和分支 B(主分支)。经过一些代码审查后,我尝试首先在 branchA 中运行它以从 branchB 中提取更改

git pull --rebase origin branchB

关注

git push origin -u branchA

但我收到此错误

! [rejected](fetch first)
error: failed to push some refs to '<url>'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

我也在命令提示符下看到这个 enter image description here

在那之后,我只做了“git pull”(没有任何参数),它工作得很好。运行“git pull”会发生什么

1 个答案:

答案 0 :(得分:2)

(注意:这个答案简化了。但不是很多!)

考虑这种情况,看同一个分支的两个版本:

A - B - C - X (remote)

A - B - C - Y (local)

如何调和这些?只有一种方式:通过合并。如果我们将远程版本合并到本地版本,我们会得到:

          -- X --
         /       \
A - B - C         M (local)
         \       /
          -- Y --

...其中 M 是一个新创建的合并提交,它结合了 X 和 Y 的贡献。

嗯,这就是 git pull 的作用。它将分支的远程版本向下复制给您,并将其与您的本地版本合并。

但是在遥控器上做同样的事情是非法——说git push。您不得以这种方式形成合并提交。对帐只能在您的 计算机上本地执行。因此,当远程在此分支上提交而您没有提交时,您不能推送。

因此,当您尝试这样做时,远程 Git 会拒绝。 pull-then-push 的解就解决了这个问题。在拉取之后,您拥有远程拥有的所有提交,因此推送变得合法。


额外信息:

考虑拉后推前的情况。记住,遥控器还有:

A - B - C - X (remote)

您现在拥有:

          -- X --
         /       \
A - B - C         M (local)
         \       /
          -- Y --

当您推送时,远程能够接受这些提交只需在其分支版本的末尾添加 M,如下所示:

A - B - C - X - M (remote)
         \     /
          - Y -

确实它也必须容纳 Y,但关键是不需要新的合并提交来做到这一点。这称为快进——不会创建新的提交,但现有的推送提交只是附加到分支。

因此,从技术上讲,规则是除非可以在遥控器上快进,否则您不能推送。当我们开始时,这不可能:有人必须创建一个真正的合并提交来协调这些分支,并且有人不是将成为远程。通过先拉取,并允许在本地进行非快进合并,您可以在远程进行快进。

相关问题