【问题标题】:What is the difference between `git rebase -i HEAD~N` and `git reset --soft HEAD~N`?`git rebase -i HEAD~N` 和 `git reset --soft HEAD~N` 有什么区别?
【发布时间】:2021-10-28 11:04:48
【问题描述】:

我们可以压缩Git 中的最后 N 个提交。据我了解,我们可以使用 git rebase -i HEAD~Ngit reset --soft HEAD~N 压缩最后 N 次提交。

在此问题 (Squash my last X commits together using Git) 的答案中,最受好评的答案建议使用 git reset --soft HEAD~N,这不是公认的答案。接受的答案推荐git rebase -i HEAD~N。因此,我很困惑,更喜欢使用哪一个。

这些方法有何不同?推荐或安全使用哪一种?

【问题讨论】:

  • rebase is 命令更漂亮、更强大,因此需要更多的工作(通过计算机)。 reset-and-commit 命令要简单得多,功能也少得多,因此更容易(对于计算机而言)。如果您所做的只是压扁所有内容,则最终结果是相同的,因此请使用 发现更容易的任何一个 - 或者,如果您的计算机速度非常慢,请使用重置并提交方法所以它需要几秒钟而不是30分钟。我发现对于很多提交,rebase 对我来说也更难,因为我必须将很多行从 pick 更改为 s
  • 当然,如果你想要或者需要rebase的任何额外capabilities,使用rebase。

标签: git git-rebase git-reset git-squash


【解决方案1】:

你给出的两个命令都可以用来重写一个分支的历史。软重置选项:

git reset --soft HEAD~N

会将分支的 HEAD 指针移回 N 次提交,同时将这些提交中的工作放入舞台。如果您从此时开始提交,您会将提交压缩为单个 new 提交。

变基选项:

git rebase -i HEAD~N

会弹出一个窗口,显示之前的 N 次提交。在每一行,对于每个提交,您可以选择选择(保留)、挤压、改写等。您可以通过选择squash 来实现与上述软重置选项相同的结果有问题的提交。然而,交互式变基比这更强大。

您使用哪种方法取决于您的操作的复杂性。我们可能会将软重置视为交互式 rebase 的穷人版本,后者的任务很重。

【讨论】:

    【解决方案2】:

    git rebase -i 允许您以交互方式重新调整提交范围 - 您可以选择接受哪些提交、删除哪些提交、重新排序、在某个时候手动干预,以及如您所述,压缩它们等。

    git reset --soft 只是删除所有提交,保持索引不变。

    【讨论】:

    • 更准确地说,保持索引和工作树完好无损(并且“已删除”的提交仍然存在,只是现在很难找到)。
    猜你喜欢
    • 2014-08-25
    • 2021-07-04
    • 2023-03-23
    • 2022-06-24
    • 2018-06-25
    • 2017-12-10
    • 2011-09-06
    • 2019-08-30
    相关资源
    最近更新 更多