【问题标题】:Delete a range of commits删除一系列提交
【发布时间】:2015-02-17 16:55:30
【问题描述】:

我的提交历史记录超过 40 次。 其中一些提交是不必要的,只是无缘无故地存在。

我想删除一系列不必要的提交,一开始我尝试了这个:

git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>

很遗憾,这行不通。我真正想要的是删除日志中的最后一个提交(第一个提交),直到另一个,例如从最后一个提交的第 10 个,所以通常删除最后 10 个提交。

我不打算回滚到那个版本,因为这些提交没什么用,会导致源文件夹为空。

【问题讨论】:

  • 您要删除的提交是否引入了任何更改?
  • 什么都没有!是一个新分支,其中包含来自其他分支的旧提交,没有理由在此分支中。但是这个分支现在包含一些变化..
  • 你可以做一个交互式 rebase `git rebase -i HEAD~40' 然后删除你不想要的行(提交)。
  • 这会删除最后一个吗?还是会把头换到最后一个?

标签: git


【解决方案1】:

您可以使用git rebase -i --root 重新设置从初始提交开始的所有内容。

假设您有 11 次提交,看起来像这样:

* cf0bc41 - (HEAD, master) Faun: Eleven (2 seconds ago)
* b32d8cc - Faun: Ten (2 seconds ago)
* f789e49 - Faun: Nine (2 seconds ago)
* 780435e - Faun: Eight (2 seconds ago)
* 3c6b084 - Faun: Seven (2 seconds ago)
* fecce89 - Faun: Six (2 seconds ago)
* 0433dbe - Faun: Five (2 seconds ago)
* 8002cb7 - Faun: Four (2 seconds ago)
* 3439445 - Faun: Three (2 seconds ago)
* 38181f1 - Faun: Two (2 seconds ago)
* 9373809 - Faun: One (2 seconds ago)

如果您想删除前 10 个提交,只需运行 git rebase -i --root,它将在您的编辑器中打开类似以下内容:

pick 9373809 One
pick 38181f1 Two
pick 3439445 Three
pick 8002cb7 Four
pick 0433dbe Five
pick fecce89 Six
pick 3c6b084 Seven
pick 780435e Eight
pick f789e49 Nine
pick b32d8cc Ten
pick cf0bc41 Eleven

# Rebase cf0bc41 onto 0bd34c4

您可以简单地删除要删除的提交的行。但是,这可能会导致冲突,因为稍后提交的文件很可能是您在之前的提交中引入的修改文件。

另外请注意,运行此命令将重写 所有 次提交的 SHA,这也可能会给您带来问题。

压缩或修复这些初始提交可能会更好。不理会第一个并将单词pick 更改为squashfixup。有关详细信息,请参阅交互式 rebase 底部的 cmets。

例如,如果您编辑交互式变基,如下所示:

pick 9373809 One
fixup 38181f1 Two
fixup 3439445 Three
fixup 8002cb7 Four
fixup 0433dbe Five
fixup fecce89 Six
fixup 3c6b084 Seven
fixup 780435e Eight
fixup f789e49 Nine
fixup b32d8cc Ten
pick cf0bc41 Eleven

你最终会得到这个 git 历史记录:

* f8980bc - (HEAD, master) Faun: Eleven (0 seconds ago)
* 3d300e9 - Faun: One (0 seconds ago)

【讨论】:

  • 嗯,我不想仅仅为了删除一些提交而获得新问题。所以删除提交可能不是一个好主意
  • 可能是真的,特别是如果您已将存储库推送到公共场所。
  • 我建议阅读 git rebase 上的 tutorial,因为它是一个非常强大的工具,但也是一个非常锋利的工具。
【解决方案2】:

您可以做的是将squash 前 10 个提交合并为一个提交。这是一个将五个初始提交压缩为一个同时保留其余历史记录的示例。

警告:重写历史会改变 SHA1。 It is not possible to prevent this。除非您先与您的团队交谈,否则不要重写公共提交的 SHA。

原始日志

> git log --online --decorate

f85179d (HEAD, master) ten
7de4071 nine
5c7a482 eight
9585035 seven
b41bffc six
d102f05 five
5a28cb9 four
6fc27c9 three
524b0c7 two
bb7e6ae one

Rebase everthing,这会打开记事本(或您使用的任何提交编辑器)。通过s 选项选择您想要压缩在一起的提交。

> git rebase -i --root

# this is notepad

pick bb7e6ae one
s 524b0c7 two
s 6fc27c9 three
s 5a28cb9 four
s d102f05 five
pick b41bffc six
pick 9585035 seven
pick 5c7a482 eight
pick 7de4071 nine
pick f85179d ten

保存后,这是您的日志结果。请注意,您已更改所有 SHA1。

> git log --oneline --decorate

6c63e02 (HEAD, master) ten
276cc7c nine
5248b0b eight
251f87a seven
a70d035 six
3529f1a Squash the five initial commits into one.

【讨论】:

    猜你喜欢
    • 2016-04-17
    • 2013-04-18
    • 2013-09-10
    • 2015-05-11
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多