我想知道git rebase如何帮助恢复变化。我无法理解为什么rebase比合并还原更改更容易。
恢复更改我的意思是,还原以前版本的主数据。
此时我想恢复为Master v4
。
当我的意思是帮助时,我并不是说您使用rebase或合并来恢复。
我会更好地解释我的同事说的话:
例如,您有此日志:
a
b
a
b
a
放入master [merge-a] b
放入master [merge-b] 他说恢复更难,因为提交并非全部归为一组。但对我来说没有任何意义,如果你还原一个标签,让我们说[tag-a],master没有来自分支b
的更改。我也不关心何时对分支b
进行提交,即使它们与分支a
中的提交交错(及时)。或者我错过了git如何工作的重要一点......
当我恢复到[tag-a]时,我真的不关心在master中做了多少次提交,我只是得到了[tag-a]的主人,简单,独立于提交的次数和时间他们已经成就了。
由于
答案 0 :(得分:3)
当重新定位时 - 树更直,没有不必要的“分支”(通过分支我的意思是在提交树的结构上的文字分支,而不是“git branch”)并且它使得更容易找到某个阶段以恢复到。 当很多人使用一个repo时,每次合并它都会创建一个复杂的树结构。
答案 1 :(得分:1)
实际上,在这种情况下,你可能既不想要改变也不想合并。根据使用情况,您需要git revert
或git reset
。
Revert
将允许您创建一个或多个提交,以恢复一个或多个提交中引入的更改。 Reset
基本上会删除历史记录中的提交。
在您描述的情况下,您可以git revert
v5
中引入的更改,创建可以撤消这些更改的新提交,也可以git reset --hard
转换为v4
,这将从历史记录中删除提交v5
。
两者都有优点和缺点,并且出于不同的原因应该在不同的情况下使用。例如,如果分支是公共的,并且由多个开发人员处理,那么您希望避免使用git reset --hard
,因为这会弄乱其他开发人员根据v5
做出的任何提交。另一方面,如果你在本地工作,并且只是决定放弃你在v5
开始的任何工作,那么引入一个提交来反转这个改变(用git revert
)只会介绍噪音进入分支的历史。
您可以在git revert
以及git网站上git reset
上阅读更多内容。
编辑:
嗯,好像我误解了你的问题......当你一直在使用rebase
而不是{{{}时,你会问为什么它更容易恢复到原来的状态? 1}}引入功能分支。
如果是这样的话,那么Dmitriy M的答案就解释了原因:一个被重新组合的分支是线性的,而一个被合并到的分支更复杂,所以找出哪个提交恢复或重置为更简单。
另一方面,如果您真正尝试做的是撤消将分支引入merge
,则更容易找出对master
的提交如果你一直在合并而不是变基础,特别是如果你使用reset
,因为你可以简单地寻找引入分支的合并提交(它应该读取类似"合并分支XXX到master {#34;)和merge --no-ff
到reset
侧的父级。例如,如果要撤消将分支master
引入feature-a
,并且合并提交,则将" Merge feature-a引入master"有一个以master
开头的哈希,那么你可以87db280
或git reset 87db280^
。
答案 2 :(得分:-3)
Rebase将保留两条路径的提交历史记录(在另一组路径上显示为一组)。合并将失去两条路径之一的历史。