Git 我如何取消我的提交?
在尝试使用git筛选器分支时,我复制了几个提交。如何修复此问题?警告:Git 我如何取消我的提交?,git,github,Git,Github,在尝试使用git筛选器分支时,我复制了几个提交。如何修复此问题?警告: 以下命令将丢失所有过去提交的d4f81a8和任何未提交的本地更改 git reset --hard d4f81a8fff53cbbaabfdf6980fa68bf44e8d77f5 git push --force origin 问题是,git过滤器分支创建了一个完全独立的提交链。当您尝试推送到服务器时,git拒绝了,因为新的头不是服务器头的后代。推送将丢失指向旧头的链中的提交,这通常是您希望避免的。但是,在这种情况下,新
以下命令将丢失所有过去提交的
d4f81a8
和任何未提交的本地更改
git reset --hard d4f81a8fff53cbbaabfdf6980fa68bf44e8d77f5
git push --force origin
问题是,git过滤器分支
创建了一个完全独立的提交链。当您尝试推送到服务器时,git拒绝了,因为新的头不是服务器头的后代。推送将丢失指向旧头的链中的提交,这通常是您希望避免的。但是,在这种情况下,新链是旧链的副本,因此不会丢失任何内容
第一个命令,git reset
,通过将主分支的头设置为新链中的最后一个提交来撤消合并。合并是不合适的,因为链已经具有相同的内容,使得旧链多余。--hard
选项还将索引和工作目录重置为该提交
git push的
--force
选项告诉git忽略新头部不是旧头部的后代这一事实。同样,这是非常危险的,因为它将丢失旧链中的提交。要检查服务器上是否没有新内容,可以使用git-fetch
,它会将提交从服务器下载到reffetch\u HEAD
,但与git-pull
不同,它不会自动合并。这样,您就可以将您的提交与服务器上的最新提交进行比较,并仔细检查是否没有遗漏任何内容。您能解释一下您到底做了什么吗?@poke-I rungit filter branch-f--env filter“GIT_AUTHOR_NAME='Nathan2055';GIT_作者_电子邮件nathan2055@private.fake'; GIT_提交人_NAME='Nathan2055';GIT\u提交人\u电子邮件nathan2055@private.fake';“HEAD
。当我尝试推送时,它说出于某种原因我需要先做一次拉送。我做了拉送,它想到需要合并。我像它说的那样做了一次提交,然后推送。现在一切都搞砸了。请注意,你唯一做错的事情(考虑到你的目标)是因为您没有执行git push-f。它要求您先拉(错误),因为您的本地分支和远程分支没有共享任何历史记录(如果您只是使用git filter branch重写历史记录,这是完全正确的)。以后请在问题中添加信息,不要使用重要信息进行评论。很好,我将添加一个警告。无论如何,--hard也没有必要。@Kzqai这是必要的,因为工作目录需要更新。@Kzqai reflog可用于恢复头提交(但不是工作目录)。如果您有一个提供更多安全性的替代方案,请与我们分享。+1–这确实是这种情况下的正确解决方案。不过,请简要说明这些命令的作用、它们应用于这种情况的原因以及OP在这种情况下的错误之处。