我在库中有一些提交:混帐:删除早提交,但保持最近的变化
,如:
A - Added Feature A
B - Removed Feature B
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D
其中E是最近提交我做了。现在我想摆脱我使用功能C所做的更改,但我希望保留使用D和E添加的更改。
我希望你能帮助我。
谢谢
我在库中有一些提交:混帐:删除早提交,但保持最近的变化
,如:
A - Added Feature A
B - Removed Feature B
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D
其中E是最近提交我做了。现在我想摆脱我使用功能C所做的更改,但我希望保留使用D和E添加的更改。
我希望你能帮助我。
谢谢
如果您只想“摆脱变化”(如问题主体中指定的那样)而不是实际“删除提交”(如标题中指定的那样),那么一个简单的选项是添加一个新的承诺,完全与早先的承诺完全相反。
这不是万无一失的,它可能会导致因自作的修改冲突,但它不会改变历史,让你记录下逆转及其原因,并与其他工作副本打得很好。
git revert
是用来做一组提交的这种邪恶双胞胎的工具。
这就是所谓的垫底:你想要的-i
开关。
读:https://www.atlassian.com/git/tutorial/rewriting-git-history#!rebase-i
一个类似的问题/答案,请参阅:https://stackoverflow.com/a/2938393/2536029
这样做,请按照下列步骤操作:
git rebase -i HEAD~3
然后将提交C到成为第一个在底部,您将有
D - Added Feature D
E - Added Feature D
C - Redesigned Feature C
you sav e和退出,然后
git reset HEAD^
这将撤消承诺C.
Interactive rebase是你的朋友!
正如其他人所说:
$ git rebase -i HEAD~5
...其中-i
是交互式标志,并HEAD~5
手段包括在互动变基过去5个提交。
当你编辑了作为发行上述的结果,看看在打开文件的注释:
# 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
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
为你的键位是如果删除线在这里,COMMIT会迷路。
因此,删除引用您想要删除的提交的行,保存并关闭,然后git将处理剩下的部分(您可能必须根据提交的性质修复一些冲突,并将其还原正试图删除)。
需要注意的是,如果您已经推送了您的代码并且其他人已经将其拉出,上述内容将无法正常工作,因为下次有人将您的分支签出时,提交将返回到此处。交互式资料库会将提交删除,但没有记录,所以其他克隆不知道它们已被删除。下一次他们推动,他们会尝试并重新设置它们,因为本地克隆“看到”原点没有您删除的对象(提交)。
这里更好解释一下。这应该被接受的答案。 –
@CyrilCHAPON - 尽管我同意这是一个很好的答案(对问题标题),但IMO并不一定是正确答案(在正文中)。 IMO @ aib的答案是首选,因为rebasing具有破坏性(重写历史记录 - 正如本答案中所述,但没有突出显示IMO)。有时候,这是唯一的答案,但是国际海事组织的重组只能作为最后的手段在主分支上使用。 –
如果您只在本地进行更改,您可能最好关注重新贴标签答案。如果你已经在任何地方发布了更改,那么你不想重新绑定,因为这会改变历史,这意味着其他人也必须重新绑定,否则你会再次合并你的违规提交。
如果其他人有你的提交,做干净的事情是恢复有问题的改变,而不是干脆切除它。使用git revert COMMIT_ID
创建一个新的提交,撤销在COMMIT_ID
中应用的更改。
git reabse -i HEAD~3
你将有你的3名单最后提交信息
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D
您只需插入X git的复位HEAD ^之前要撤消,要撤消提交C,提交所以将会是这样的
C - Redesigned Feature C
x git reset HEAD^
D - Added Feature D
E - Added Feature D
退出rebase控制台,你会看到你的提交没有更多的日志和他们的文件上演。
的可能重复的[GIT中:删除选择提交对储存日志条目(http://stackoverflow.com/questions/495345/git-removing-selected-commit-log-entries-for- a-repository) – jszakmeister
@jszakmeister:不完全一样,链接的文章想压缩提交,而OP想要在这里删除它们 – CharlesB
@CharlesB不完全正确。压缩B和C是一种选择,在OP的问题中删除提交也是一种选择。答案中包含两个方向。 – jszakmeister