only "git pull" 在某个分支中做什么?
What does only "git pull" do in a certrain branch?
我有一个 branchA 和 branchB(主分支)。经过一些代码审查后,我尝试 运行 首先在 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.
我也在命令提示符下看到了这个
在那之后,我只做了“git pull”(没有任何参数)并且它工作得很好。 运行ning "git pull"
中发生了什么
(注意:这个答案简化了。但不是很多!)
考虑这种情况,查看同一分支的两个版本:
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,但要点是 不需要新的合并提交 才能做到这一点。这称为 快进 — 不会创建新的提交,但现有的推送提交只是附加到分支。
因此,从技术上讲,规则是您不能推送,除非可以在遥控器上快进。当我们开始时,那是 not 可能的:必须有人创建一个真正的合并提交才能协调这些分支,并且有人 not 会是远程。通过先进行拉取,并允许在本地进行非快进合并,就可以在远程进行快进。
我有一个 branchA 和 branchB(主分支)。经过一些代码审查后,我尝试 运行 首先在 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.
我也在命令提示符下看到了这个
在那之后,我只做了“git pull”(没有任何参数)并且它工作得很好。 运行ning "git pull"
中发生了什么(注意:这个答案简化了。但不是很多!)
考虑这种情况,查看同一分支的两个版本:
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,但要点是 不需要新的合并提交 才能做到这一点。这称为 快进 — 不会创建新的提交,但现有的推送提交只是附加到分支。
因此,从技术上讲,规则是您不能推送,除非可以在遥控器上快进。当我们开始时,那是 not 可能的:必须有人创建一个真正的合并提交才能协调这些分支,并且有人 not 会是远程。通过先进行拉取,并允许在本地进行非快进合并,就可以在远程进行快进。