git - `git pull --rebase` 如何正确拉取修改后的提交?
问题描述
我有一个设置,我在我的机器上编码并从我的盒子local
里拉出来测试它。dev
假设我A
在分支foo
上创建了一个提交local
,并foo
在开发盒上创建了一个分支,其上游设置为local/foo
. 如果我在开发框上执行git pull
from 分支,则分支树将变为与.foo
dev/foo
local/foo
但是,如果我现在修改 中的提交A
,则从 dev 框local/foo
上git pull
的分支foo
会产生合并冲突。而git pull --rebase
工作正常并且不会重复提交A
两次dev/foo
.
git help pull
说:
-r, --rebase[=false|true|merges|preserve|interactive]
When true, rebase the current branch on top of the upstream branch after
fetching. If there is a remote-tracking branch corresponding to the upstream branch
and the upstream branch was rebased since last fetched, the rebase uses that
information to avoid rebasing non-local changes.
我知道在上述场景中应用了最后一行,但我不明白先决条件是什么或它是如何工作的?
一个解释会很有帮助。谢谢
解决方案
这是因为合并和变基的区别。
“常规”git pull
首先获取更改,然后将它们合并到本地状态,同时git pull --rebase
获取更改,然后将本地状态重新定位在远程状态之上。
合并只考虑项目的两种状态——合并的“我们的”和“他们的”一方,如果可能的话,还考虑它们的所谓“合并基础”——这些开发线共享的最后一个共同提交。
相反,变基首先将“我们的”端重置为指向“他们的”端在其尖端的相同提交,然后应用每个“我们的”提交“他们的”没有 单独的——作为文本补丁,一个——一个。
当本地更改以增量方式重新应用到远程的更新状态时,这可能更有可能不产生冲突。
推荐阅读
- r - 为什么对于我尝试安装的每个包,我都会收到错误“包‘XXXX’不可用(对于 R 版本 3.5.0)”?
- multithreading - 同步两个发送者和接收者线程
- javascript - auth0 无法读取未定义的属性选项
- javascript - 添加新脚本时无法重新初始化 DataTable
- html - 为什么我在 div 中使用缩放/缩放 css 后,即使 div 被缩放,height/width 属性仍然保持原始状态?
- javascript - 如何在 HTMLCollection 或 Element 上使 Javascript calss/constructor 可调用
- go - 无限的 goroutines,直到收到所需的响应
- c# - 如果 InnerText 包含空格,则按 InnerText 选择节点将不起作用
- reactjs - 从现有的原生安卓应用打开 React-Native 时显示白屏
- sql - 索引是否用于嵌套选择中的“外部”和“内部”where 子句?