据我所知,提交文件的快照所以如果我执行更改A然后更改B,更改B的提交文件已包含更改A中的更改,不会重新排序更改A冗余吗?为什么使用git rebase -i重新排序提交不会搞砸历史?
回答
也就是说,其实是一个非常好的问题,因为提交是快照。
底垫原因的工作原理是因为底垫实际上是重复git cherry-pick
(有位在前面包裹的找出该选择什么样的,多在年底移动分支标签),并git cherry-pick
作品转动承诺变更集。
假设,例如,你有提交的序列:
A--B--C <-- topic
/
...--o--*--o--o <-- mainline
变基topic
到mainline
我们需要(1)发现,上topic
的提交,但不mainline
(这是C
,B
,并沿着第一行A
,结束于标记为*
的提交),然后(2)将它们复制到新的提交中,我们将在mainline
的提示下添加新提交。
再次基于第一发现三个后*
提交,并将它们放入一个(反向下令:A
,B
,C
)列表(也忽略了合并默认的提交,但这里没有合并)。然后它为每个提交做一个樱桃选择。
为了挑选A
,Git比较A
而不是*
。这将两个快照转换为变更集。混帐然后应用最尖端提交的mainline
的更改,使一个新的承诺,让我们称之为A'
,在一个匿名的分支:
A--B--C <-- topic
/
...--o--*--o--o <-- mainline
\
A' <-- HEAD
要樱桃采摘B
,Git的diff文件B
对A
。将这些更改应用于A'
会产生另一个提交B'
。重复C
获得C'
:
A--B--C <-- topic
/
...--o--*--o--o <-- mainline
\
A'-B'-C' <-- HEAD
最后,从Git的剥离C
的topic
标签路程,它指向C'
代替。链老被放弃(虽然你仍然可以通过reflogs找到它,rebase
副本C
的ID,以特殊的名字ORIG_HEAD
以及):
A--B--C [abandoned]
/
...--o--*--o--o <-- mainline
\
A'-B'-C' <-- topic
现在的重订完成。
请注意,如果需要,每个副本都使用git的合并机制完成(如果diffs不适用于干净地)。每个人都可能导致合并冲突,需要重组停止并获得您的帮助。 (或者,更糟糕的是,你可能会错误合并,尽管这些在实践中很少见。)
当然,如果您重新订购提交(通过在交互式转化中移动pick
行),我们只需更改我们选择的顺序并应用每个提交。樱桃采摘操作仍然以相同的方式工作:比较挑选的提交与其父母(C
与B
,A
与*
,B
与A
)。
但差异数据取决于前一次提交中文件的内容,重新排序后它们会发生变化。或者这是只重新订购化妆品? –
新副本是*新副本*,这意味着所有这一切。例如,假设在选择'B'的时候你会遇到合并冲突,因为'mainline'的提示有一个冲突的变化。当你修复冲突并继续rebase时,新的提交'B'现在与原来的提交'B'有不同的改变。 'B'和'B''仍然在版本库中,并且在尝试将该更改应用于'B''之前,下一个樱桃选择器(假设它用于'C')比较'C'和'B'(由于'B'现在不同,所以可能会发生另一次合并冲突!)。 – torek
我想我现在看到你的评论并重新阅读你的答案后就看到了。看来我刚刚被术语所抛弃。正如我现在看到的那样,当然,提交可以重新排序,但重新绑定后的结果提交是完全新的提交,无论您是否重新排序它们。这个结果提交也有一个不同的“快照文件”,这是将樱桃采摘的差异应用到主线尖端的结果。以这种方式,重新排序是美化的,因为重新排序的原始提交保持不变。请让我知道,如果我是对的。 –
- 1. 'git merge'如何搞乱你的提交历史?
- 2. 混帐:改写历史:重新排序和合并提交
- 3. 重写GIT中提交历史
- 4. git rebase,提交重复
- 5. GIT rebase - 多个提交到一个 - 仍在历史中看到
- 6. 为什么git pull --rebase在重放现有提交时失败?
- 7. Git rebase重新排列提交涉及相同的文件
- 8. 为什么我会与git rebase -p -i发生冲突?
- 9. 使用git rebase更改之前提交的代码-i
- 10. Github - 副本github提交历史
- 11. rebase之后推出新的历史?
- 12. 为什么不git rebase -i:/ ^主要工作?
- 13. git改写历史(rebase旧分支?)
- 14. 重新排序提交
- 15. 不通过所有提交重写git回购历史记录
- 16. 为什么git svn dcommit会失去本地分支合并提交的历史记录?
- 17. 为什么不git的变基导致线性项目历史
- 18. Git:修改历史提交的内容
- 19. git rebase分支后推新提交
- 20. 搞砸了我的rebase?树不再是平坦的
- 21. 压扁多个历史提交
- 22. 重写历史记录以删除重复的提交消息
- 23. Git:为什么rebase会导致冲突,而merge不会呢?
- 24. 猛砸历史范围
- 25. 如何使用git rebase清理错综复杂的历史
- 26. 为什么要截断BytesIO搞砸了?
- 27. Git commit squashing(rebase -i):提交实际上如何工作?
- 28. Git - 从以前的提交和拆分提交历史分支
- 29. GIT - 重写提交历史记录的作者
- 30. 重写git历史记录以解压缩提交
Git根据需要做差异; rebase将差异应用于新的基本内容。 – jthill