删除一系列提交

时间:2015-02-17 16:55:30

标签: git

我有40次提交的提交历史记录。 其中一些提交不是必需的,只是没有任何理由。

我想删除一系列不必要的提交,起初我尝试过这个:

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

不幸的是,这不会奏效。我真正想要的是删除日志中的最后一个提交(第一个提交)直到另一个提交,比如从最后一个提交,所以一般来说删除最后10个提交。

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

2 个答案:

答案 0 :(得分:1)

你可以做的是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.

答案 1 :(得分: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底部的注释。

例如,如果您编辑交互式rebase,请执行以下操作:

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)