我想从线性提交树中删除选定的提交日志条目,以便条目不会显示在提交日志中.
我的提交树看起来像:
R--A--B--C--D--E--HEAD
我想删除B和C条目,以便它们不会在提交日志中显示,但应保留从A到D的更改.也许通过引入一个提交,使B和C成为BC并且树看起来像.
R--A--BC--D--E--HEAD
或者,理想情况下,A直接来自D.D'表示从A到B,B到C和C到D的变化.
R--A--D'--E--HEAD
这可能吗?如果有,怎么样?
这是一个相当新的项目,因此目前没有分支,因此也没有合并.
git-rebase(1)正是如此.
$ git rebase -i HEAD~5
git awsome-ness [git rebase --interactive]包含一个例子.
不要git-rebase
在公共(远程)提交上使用.
确保您的工作目录是干净的(commit
或stash
您当前的更改).
运行以上命令.它启动你的$EDITOR
.
更换pick
前C
和D
通过squash
.它会将C和D合并为B.如果要删除提交,则只需删除其行.
如果您迷路了,请键入:
$ git rebase --abort
# detach head and move to D commit git checkout# move HEAD to A, but leave the index and working tree as for D git reset --soft # Redo the D commit re-using the commit message, but now on top of A git commit -C # Re-apply everything from the old D onwards onto this new place git rebase --onto HEAD master
这是一种删除特定提交ID的方法,只知道您要删除的提交ID.
git rebase --onto commit-id^ commit-id
请注意,这实际上删除了提交引入的更改.
扩展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
您可以移动行来更改提交顺序并删除行以删除该提交.或者,您可以添加一个命令将两个提交组合(压缩)到一个提交(先前提交是上面的提交),编辑提交(更改内容)或重新提交消息.
我认为选择只是意味着你想单独留下那个提交.
(例子来自这里)
您可以通过以下方式非交互式删除示例中的 B和C:
git rebase --onto HEAD~5 HEAD~3 HEAD
或象征性地,
git rebase --onto A C HEAD
请注意,B和C的变化不会在D中; 他们会走了.