如何从Git中删除特定的提交?

时间:2017-10-13 06:51:58

标签: git

我想从远程存储库中删除一些提交。我的回购中很少有这样的提交:

commits    messages

abcd123    some message
xyze456    another commit message
98y65r4    this commit is not required
987xcrt    this commit is not required
bl8976t    initial commit

我想从我的仓库中删除提交98y65r4987xcrt。如何实现呢?

1 个答案:

答案 0 :(得分:9)

有两个替代方案:安全的一个让你有一个肮脏的git历史,或者不安全的一个让你有一个干净的git历史。你选择:

选项1:还原

你可以告诉git"还原提交"。这意味着它将引入一个更改,以恢复您在提交中所做的每个更改。您需要执行两次(每次提交一次):

scp -r  username@hostname:sourcedirectory username@hostname:destinationdirectory

此解决方案将保留您的git历史记录(您可以执行git revert 98y65r4 git revert 987xcrt 查看回购状态的图形表示):

gitk --all

然后你可以将新的2次提交推送到你的远程仓库:

2222222    revert of 987xcrt: this commit is not required
1111111    revert of 98y65r4: this commit is not required
abcd123    some message
xyze456    another commit message
98y65r4    this commit is not required
987xcrt    this commit is not required
bl8976t    initial commit

此解决方案是安全的,因为它不会对远程仓库进行破坏性操作。

选项2:交互式rebase

您也可以使用交互式rebase。命令是:

git push

在其中,您告诉git让您选择要混合的提交,重新排序或删除

执行命令时,编辑器将打开一个类似于此的文本:

git rebase -i bl8976t

继续删除你不想要的行,如下所示:

pick    bl8976t    initial commit
pick    987xcrt    this commit is not required
pick    98y65r4    this commit is not required
pick    xyze456    another commit message
pick    abcd123    some message

保存文件并关闭编辑器。

到目前为止,这只修改了您的存储库的本地副本(您可以使用pick bl8976t initial commit pick xyze456 another commit message pick abcd123 some message 查看提交树。)

现在您需要将更改推送到您的仓库,这是通过"推力"完成的,但在执行命令之前请记住推力是一种破坏性操作,它将覆盖远程存储库的历史记录,并可能导致其他人员的合并问题。如果你没事,想要做推力,命令是:

gitk --all