从 Git 中删除已提交的提交记录

4

我在我的分支中有以下历史记录:

  • "commit 3" (origin/master)
  • "commit 2"
  • "commit 1" (master 落后2个版本)
  • ... 以前的提交

我想要从历史记录中删除commit 2和commit 3,这样commit 1就是最新的。我是唯一使用这个仓库的人。

我正在使用SourceTree,在终端中输入了以下命令:

git rebase -i

我得到了一个彩色屏幕,但无法输入命令。我该怎么办?
编辑:
推送错误
ssh: connect to host <myhost> port 22: Bad file number
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

1
你很可能已经被扔到了vim - 尝试运行git config --global core.editor EDITOR_OF_CHOICE - Eric
你想要从本地仓库中删除那些提交记录,还是包括本地和远程仓库? - Roman
推送错误与您的原始问题无关。请参见下面我的答案中的注释。 - Mike Monkiewicz
4个回答

2
如果你想取消提交但保留你在文件中所做的修改:
git reset --soft HEAD^2

如果你想撤销提交并取消本地文件的修改:

git reset --hard HEAD^2

Head^X表示当前分支上倒数第X次提交之前的提交。


我收到了“模糊参数'HEAD^2':未知的修订版或路径”的错误信息。 - stefana
也许你的索引与分支分离了?另一个选项是用你想要回到的提交的标识符替换HEAD^2。 - kgautron
我知道如何设置当前分支。问题是最新的两个提交可以被拉取。我想要完全删除它们。 - stefana
好的,所以在您的本地存储库中,您仍然停留在提交1上。然后您需要做的是拉取提交,然后对这些提交执行git revert操作,这将创建一个反提交来取消它们。然后提交并推送。 - kgautron
如果我这样做并执行重置命令,那么我就会回到OP中解释的相同情况。 - stefana

1
所有这些答案似乎都展示了如何从本地存储库中删除commit2和commit3,但没有涉及远程存储库。
首先,退出您所在的交互式rebase。那只影响本地历史记录。您可能需要退出您所在的文本编辑器或运行git rebase --abort。我不太确定您的确切状态。
一旦回到正常的命令行界面,就可以检出master,因为它已经处于所需的commit1状态。 git checkout master 然后将origin/master强制更新到master。 git push -f 作为对其他读者的警告,永远不要在共享具有其他开发人员的存储库上进行强制推送!这对原始发布者有效,因为他们是唯一使用其远程存储库的人。

这似乎是解决方案,但当我输入push命令时,它会显示“坏文件号”、“无法从远程仓库读取”。但是,我可以通过用户界面进行推送。 - stefana
你能输入完整的错误文本吗?并且用户界面(我猜是SourceTree)中的强制推送是否起作用了? - Mike Monkiewicz
它可以通过UI工作,但在终端中无法正常运行。我会在原始帖中添加错误信息。 - stefana
这个问题与你的提交无关。你在通过SSH连接到存储库时出现了问题。尝试查看Git SSH错误:“连接到主机:坏文件号”或GitHub的建议错误:坏文件号 - Mike Monkiewicz

0
如果您想在当前 HEAD 的基础上提交一个具有不同提交状态的精确副本,撤销所有中间提交,则可以使用 reset 创建正确的索引状态以进行提交。
# reset the index to the desired tree
git reset 56e05fced

# move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Update working copy to reflect the new commit
git reset --hard

0

你可以在这两个提交上进行还原:2和3:

git revert "commit 3"
git revert "commit 2"

或者 git reset:

git reset --hard "commit 1"

git revert 会创建新的提交来撤销 commit2 和 commit3 的影响。但原始的 commit2 和 commit3 当然仍然存在。git reset --hard commit1 将把指针移回到 commit1,这样你就可以从那里开始工作 - 让你假装你甚至没有做过 commit2 和 commit3。 - Mike Monkiewicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接