使用git rebase,因为更容易还原更改?

时间:2016-02-01 19:44:35

标签: git merge rebase git-revert

我想知道git rebase如何帮助恢复变化。我无法理解为什么rebase比合并还原更改更容易。

更新1:

恢复更改我的意思是,还原以前版本的主数据。

  • Master v1
  • Master v2
  • Master v3
  • Master v4
  • Master v5

此时我想恢复为Master v4

更新2:

当我的意思是帮助时,我并不是说您使用rebase或合并来恢复。

我会更好地解释我的同事说的话:

例如,您有此日志:

  • 提交时间1:最初掌握[tag-x]
  • 提交时间2:从主
  • 分支a
  • 提交时间3:来自主人的分支b
  • 提交时间4:分支a
  • 上的随机提交
  • 提交时间5:分支b
  • 上的随机提交
  • 提交时间6:将分支a放入master [merge-a]
  • 提交时间7:将分支b放入master [merge-b]

他说恢复更难,因为提交并非全部归为一组。但对我来说没有任何意义,如果你还原一个标签,让我们说[tag-a],master没有来自分支b的更改。我也不关心何时对分支b进行提交,即使它们与分支a中的提交交错(及时)。或者我错过了git如何工作的重要一点......

当我恢复到[tag-a]时,我真的不关心在master中做了多少次提交,我只是得到了[tag-a]的主人,简单,独立于提交的次数和时间他们已经成就了。

由于

3 个答案:

答案 0 :(得分:3)

当重新定位时 - 树更直,没有不必要的“分支”(通过分支我的意思是在提交树的结构上的文字分支,而不是“git branch”)并且它使得更容易找到某个阶段以恢复到。 当很多人使用一个repo时,每次合并它都会创建一个复杂的树结构。

答案 1 :(得分:1)

实际上,在这种情况下,你可能既不想要改变也不想合并。根据使用情况,您需要git revertgit 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-ffreset侧的父级。例如,如果要撤消将分支master引入feature-a,并且合并提交,则将" Merge feature-a引入master"有一个以master开头的哈希,那么你可以87db280git reset 87db280^

答案 2 :(得分:-3)

Rebase将保留两条路径的提交历史记录(在另一组路径上显示为一组)。合并将失去两条路径之一的历史。