git - rebase 和 merge 的最后一次提交的快照是否相同?
问题描述
我是 Git 的新手学习者。我正在 [ https://git-scm.com/book/en/v2]上阅读这本书,现在我正在阅读“3.6 Rebasing”一章。
本章有一个要点:
请注意,您最终得到的最终提交所指向的快照,无论是 rebase 的最后一个 rebase 提交还是合并后的最终合并提交,都是相同的快照——只是历史记录不同。
我认为并非在所有情况下都是正确的。下面我们来看一个案例。
假设我们C0
在 2 个分支上提交,master
并且test
. 我们有一个空的foo
文本文件。
接下来,我们检查master
,写一个文本"line 1"
并foo
提交C1
。然后我们签出test
,还写了一个文本"line 1"
,foo
做一个提交C2
。之后,我们"line 1"
从 foo 中删除文本,进行提交C3
。
现在的历史:
C0---C1 master
\
C2---C3 test-HEAD
现在我们有 2 个案例要移动:
使用合并方式
git merge master
:Git 将合并后的结果带到C4
. 现在的内容foo
是"line 1"
。现在的历史:C0---C1 master | \ C2--C3--C4 test
使用变基:变基
git rebase master
后的最后一次提交是C3'
. 现在的内容foo
是空的。现在的历史:C0---C1 master \ C2'---C3' test
可以看到,快照指向的 byC4
和 byC3'
是不一样的,因为 in 的内容和foo
inC4
不同。所以我认为上面引用的句子在这种情况下是不正确的。foo
C3'
我有什么问题吗?谢谢你。
P/s:我的英文不是很好,所以如果我的写作有不好的地方请见谅。
解决方案
使用 git rebase master 的变基:变基后的最后一次提交是 C3'。foo 现在的内容是空的。
没有。C2' 尝试将“line1”添加到文件中,但它已经包含此行,因此您会遇到冲突。根据您解决冲突的方式,结果可能会有所不同。如果您决定保留两个“line1”行(C1 中的一个,以及您在 C2 中添加的那个),那么 C3' 将删除这些行之一(同样,您会遇到冲突,这取决于如何你解决它),你会得到“line1”作为内容。
我认为您的错误是认为 C3 和 C3' 对应于同一个快照。他们没有:他们对应于同一个补丁,即关于他们的父母的相同差异。
底线:rebase
可能会产生更多的冲突merge
,特别是在历史单向并稍后取消的情况下。当您没有冲突时,rebase
and的最终结果merge
必须相同。
推荐阅读
- c# - 如何通过管道在 Azure devops 部署期间删除本地 wwwroot 文件夹的内容?
- regex - 从文本字符串中去除空格和 \n
- node.js - 如何检查特定路由器的 JWT 令牌
- iframe - 如何使用 youtube iframe 提高页面速度
- tfs - Team Foundation Server 2018:在下拉值更改时设置字段值
- android - 如何将本机框架/库添加到颤振插件(不使用 cocoapods)?
- elasticsearch - 使用嵌套类型更新架构不起作用
- c# - 在用户/其他屏幕上显示选定/突出显示的文本
- python - 如何在数组中制作model.predict?
- ios - 静默推送通知在 ios 13 中不起作用