2013-07-16 36 views
11

我在库中有一些提交:混帐:删除早提交,但保持最近的变化

,如:

A - Added Feature A 
B - Removed Feature B 
C - Redesigned Feature C 
D - Added Feature D 
E - Added Feature D 

其中E是最近提交我做了。现在我想摆脱我使用功能C所做的更改,但我希望保留使用D和E添加的更改。

我希望你能帮助我。

谢谢

+2

的可能重复的[GIT中:删除选择提交对储存日志条目(http://stackoverflow.com/questions/495345/git-removing-selected-commit-log-entries-for- a-repository) – jszakmeister

+1

@jszakmeister:不完全一样,链接的文章想压缩提交,而OP想要在这里删除它们 – CharlesB

+1

@CharlesB不完全正确。压缩B和C是一种选择,在OP的问题中删除提交也是一种选择。答案中包含两个方向。 – jszakmeister

回答

7

如果您只想“摆脱变化”(如问题主体中指定的那样)而不是实际“删除提交”(如标题中指定的那样),那么一个简单的选项是添加一个新的承诺,完全与早先的承诺完全相反。

这不是万无一失的,它可能会导致因自作的修改冲突,但它不会改变历史,让你记录下逆转及其原因,并与其他工作副本打得很好。

git revert是用来做一组提交的这种邪恶双胞胎的工具。

0

这样做,请按照下列步骤操作:

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.

20

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将处理剩下的部分(您可能必须根据提交的性质修复一些冲突,并将其还原正试图删除)。

需要注意的是,如果您已经推送了您的代码并且其他人已经将其拉出,上述内容将无法正常工作,因为下次有人将您的分支签出时,提交将返回到此处。交互式资料库会将提交删除,但没有记录,所以其他克隆不知道它们已被删除。下一次他们推动,他们会尝试并重新设置它们,因为本地克隆“看到”原点没有您删除的对象(提交)。

+1

这里更好解释一下。这应该被接受的答案。 –

+0

@CyrilCHAPON - 尽管我同意这是一个很好的答案(对问题标题),但IMO并不一定是正确答案(在正文中)。 IMO @ aib的答案是首选,因为rebasing具有破坏性(重写历史记录 - 正如本答案中所述,但没有突出显示IMO)。有时候,这是唯一的答案,但是国际海事组织的重组只能作为最后的手段在主分支上使用。 –

1

如果您只在本地进行更改,您可能最好关注重新贴标签答案。如果你已经在任何地方发布了更改,那么你不想重新绑定,因为这会改变历史,这意味着其他人也必须重新绑定,否则你会再次合并你的违规提交。

如果其他人有你的提交,做干净的事情是恢复有问题的改变,而不是干脆切除它。使用git revert COMMIT_ID创建一个新的提交,撤销在COMMIT_ID中应用的更改。

0
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控制台,你会看到你的提交没有更多的日志和他们的文件上演。

0

如果您在Windows中使用TortoiseGit,你可以在Git的文件夹,单击鼠标右键然后单击TortoiseGit > Show log。您可以查看之前完成的所有提交,然后检查您想要恢复的提交。

点击提交,你可以在下面看到更改后的文件。点击要恢复的文件右键,然后点击revert to parent revision

How to revert commits