如何在保持更改的同时从Git存储库中删除选定的提交日志条目?

xk0*_*der 239 git commit

我想从线性提交树中删除选定的提交日志条目,以便条目不会显示在提交日志中.

我的提交树看起来像:

R--A--B--C--D--E--HEAD
Run Code Online (Sandbox Code Playgroud)

我想删除B和C条目,以便它们不会在提交日志中显示,但应保留从A到D的更改.也许通过引入一个提交,使B和C成为BC并且树看起来像.

R--A--BC--D--E--HEAD
Run Code Online (Sandbox Code Playgroud)

或者,理想情况下,A直接来自D.D'表示从A到B,B到C和C到D的变化.

R--A--D'--E--HEAD
Run Code Online (Sandbox Code Playgroud)

这可能吗?如果有,怎么样?

这是一个相当新的项目,因此目前没有分支,因此也没有合并.

jfs*_*jfs 272

git-rebase(1)正是如此.

$ git rebase -i HEAD~5
Run Code Online (Sandbox Code Playgroud)

git awsome-ness [git rebase --interactive]包含一个例子.

  1. 不要git-rebase在公共(远程)提交上使用.
  2. 确保您的工作目录是干净的(commitstash您当前的更改).
  3. 运行以上命令.它启动你的$EDITOR.
  4. 更换pickCD通过squash.它会将C和D合并为B.如果要删除提交,则只需删除其行.

如果您迷路了,请键入:

$ git rebase --abort  
Run Code Online (Sandbox Code Playgroud)

  • @slhck:http://replay.web.archive.org/20090627051320/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive (6认同)
  • @Eray:只需`推-f`你的改变.如果你不单独工作,不要这样做. (6认同)
  • 我们怎样才能在远程回购上做到这一点? (3认同)
  • @ ripper234:我已经修复了指向博客文章的指向`git-rebase`手册和回归机的链接. (2认同)

CB *_*ley 73

# detach head and move to D commit
git checkout <SHA1-for-D>

# move HEAD to A, but leave the index and working tree as for D
git reset --soft <SHA1-for-A>

# Redo the D commit re-using the commit message, but now on top of A
git commit -C <SHA1-for-D>

# Re-apply everything from the old D onwards onto this new place 
git rebase --onto HEAD <SHA1-for-D> master
Run Code Online (Sandbox Code Playgroud)


rad*_*ado 41

这是一种删除特定提交ID的方法,只知道您要删除的提交ID.

git rebase --onto commit-id^ commit-id
Run Code Online (Sandbox Code Playgroud)

请注意,这实际上删除了提交引入的更改.

  • 此命令中的额外HEAD将导致rebase以"分离的HEAD"结束,这是不合需要的.应该省略. (7认同)
  • 这会恢复我的commit-id引入的更改,OP希望保留更改,只需压缩提交. (3认同)

idb*_*rii 19

扩展JF Sebastian的答案:

您可以使用git-rebase轻松地对提交历史记录进行各种更改.

运行git rebase --interactive之后,你在$ EDITOR中得到以下内容:

pick 366eca1 This has a huge file
pick d975b30 delete foo
pick 121802a delete bar
# Rebase 57d0b28..121802a onto 57d0b28
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
Run Code Online (Sandbox Code Playgroud)

您可以移动行来更改提交顺序并删除行以删除该提交.或者,您可以添加一个命令将两个提交组合(压缩)到一个提交(先前提交是上面的提交),编辑提交(更改内容)或重新提交消息.

我认为选择只是意味着你想单独留下那个提交.

(例子来自这里)


Hea*_*ead 14

您可以通过以下方式非交互式删除示例中的 B和C:

git rebase --onto HEAD~5 HEAD~3 HEAD
Run Code Online (Sandbox Code Playgroud)

或象征性地,

git rebase --onto A C HEAD
Run Code Online (Sandbox Code Playgroud)

请注意,B和C的变化不会在D中; 他们会走了.