使用 git 删除提交 [重复]
Posted
技术标签:
【中文标题】使用 git 删除提交 [重复]【英文标题】:Removing a commit with git [duplicate] 【发布时间】:2011-11-01 17:23:18 【问题描述】:可能重复:How to delete a 'git commit'
我是 git 新手,遇到了需要帮助的情况。 我克隆了一个远程存储库到我的 PC,然后打开了一个名为“meir”的新分支。
出于练习目的,我首先提交了对文件所做的一些更改。之后,我按照我想要的方式更改了文件并再次提交。然后我将本地分支推送到远程存储库。
问题是我的第一个提交是一个测试,我不希望它出现在远程服务器上。我想了两种可能的方法来解决它:
-
删除本地和远程存储库上的远程“meir”分支并重新开始。
仅删除第一个提交,然后再次将分支推送到服务器,这样它也会丢失第一个提交。
我需要运行哪些命令来实现每个选项?
谢谢, 梅尔
【问题讨论】:
查看这个答案:***.com/questions/1338728/how-to-delete-a-git-commit 【参考方案1】:一般来说,在您推送到远程存储库中的公共分支后,您不应该更改提交历史记录。这会给从远程存储库中提取/克隆的人带来痛苦。
但如果你真的想这样做,你可以使用交互式 rebase 和强制推送:
-
使用 git rebase -i 将第一个提交压缩为第二个提交,以便本地分支
是按照您希望远程分支的方式设置的。
使用 git push -f(使用正确的分支规范)“强制推送”到远程分支。没有 -f 的普通 git push 会抱怨推送不是快进推送并会拒绝。
另一种选择是使用git push origin :meir
删除远程分支“meir”,使用git rebase -i
重构您的本地存储库,然后正常推送。
【讨论】:
【参考方案2】:有多种方法可以做到这一点,但没有一种是推荐的 因此,使用它们需要您自担风险。
推送其中一个提交
使用变基
如果您有 2 个提交并且希望只推送其中一个,这不是最新的。
-
git reset –hard
git 推送
git reset –hard
只有与 2nd Commit Id 对应的更改才会被推送,而您的最新提交将不会被推送。
但是,如果必须推送最新的提交而不是第二次提交,则必须先撤消提交
-
git log - 记下 53259b225 之前的提交 ID。让我们说它是 xxxxxxxx
git rebase -i xxxxxxxx
在打开的编辑器中,您应该会看到两行代表您的提交 53259b225 和 227552392 之类的
选择 227552392 blah blah 选择 53259b225 blah blah
将这两行重新排序,使其看起来像
选择 53259b225 等等等等 选择 227552392 blah blah
然后保存文件。
有了这个,你基本上改变了你的提交顺序。如果您在两次提交中处理不同的文件集,那么这将是一个相对容易的过程。如果没有,那么您可能需要进行一些合并。
如果在任何时候你认为自己搞砸了,那么你可以发出命令
-
git rebase --abort 让您回到开始交互式 rebase 之前的流的样子。
使用壁球
-
执行“git log”并记下您的 HEAD 提交(列表中的第一个提交)并记下您的更改的“基本提交”(您要替换的第一个提交之前(及时)的提交)。确保添加索引中没有文件。
执行“git reset --hard”(请谨慎使用此命令;确保执行上述步骤)。
执行“git merge --squash” - 这将撤销提交,所有提交的文件都将被暂存。
执行“git status”等操作并验证预期的更改是否在您的索引(和工作树)中。
如果您不想推送任何文件,请执行 git reset HEAD 或
如果您希望对这些文件进行更改,请进行这些更改并暂存它们
执行“git commit -m ''”。
如您所见,这也可用于将几个提交合并为一个。
【讨论】:
以上是关于使用 git 删除提交 [重复]的主要内容,如果未能解决你的问题,请参考以下文章