Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 我如何取消我的提交?_Git_Github - Fatal编程技术网

Git 我如何取消我的提交?

Git 我如何取消我的提交?,git,github,Git,Github,在尝试使用git筛选器分支时,我复制了几个提交。如何修复此问题?警告: 以下命令将丢失所有过去提交的d4f81a8和任何未提交的本地更改 git reset --hard d4f81a8fff53cbbaabfdf6980fa68bf44e8d77f5 git push --force origin 问题是,git过滤器分支创建了一个完全独立的提交链。当您尝试推送到服务器时,git拒绝了,因为新的头不是服务器头的后代。推送将丢失指向旧头的链中的提交,这通常是您希望避免的。但是,在这种情况下,新

在尝试使用git筛选器分支时,我复制了几个提交。如何修复此问题?

警告:
以下命令将丢失所有过去提交的
d4f81a8
和任何未提交的本地更改

git reset --hard d4f81a8fff53cbbaabfdf6980fa68bf44e8d77f5
git push --force origin
问题是,
git过滤器分支
创建了一个完全独立的提交链。当您尝试推送到服务器时,git拒绝了,因为新的头不是服务器头的后代。推送将丢失指向旧头的链中的提交,这通常是您希望避免的。但是,在这种情况下,新链是旧链的副本,因此不会丢失任何内容

第一个命令,
git reset
,通过将主分支的头设置为新链中的最后一个提交来撤消合并。合并是不合适的,因为链已经具有相同的内容,使得旧链多余。
--hard
选项还将索引和工作目录重置为该提交


git push的
--force
选项告诉git忽略新头部不是旧头部的后代这一事实。同样,这是非常危险的,因为它将丢失旧链中的提交。要检查服务器上是否没有新内容,可以使用
git-fetch
,它会将提交从服务器下载到ref
fetch\u HEAD
,但与
git-pull
不同,它不会自动合并。这样,您就可以将您的提交与服务器上的最新提交进行比较,并仔细检查是否没有遗漏任何内容。

您能解释一下您到底做了什么吗?@poke-I run
git 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在这种情况下的错误之处。