如何在git上撤销最后一次操作?

3

我刚开始接触Git,我将一个文件推送到仓库,但它只是覆盖并删除了我们小组仓库中的所有工作,我该如何快速撤销这个操作,而且不让任何人注意到。

当我尝试使用git revert时,它会提示bad object。

我按照以下步骤操作:

clone <repsurl>

在git bash中,我将一些文件添加到本地目录并使用了以下命令:
git add <somfile>

git commit -m "somecomment"

最后,关于技术方面的内容。
git push

我认为我的错误是没有使用


git add .

最终,只有我的文件在仓库中。


1
Revert 是一种本地操作,但不必要的 push 已经修改了远程仓库,而不是你的仓库。总的来说,解决方案将涉及将旧引用(被覆盖的引用)推送到(错误的)新引用的位置。我还建议告诉其他人,保密可能会使事情变得更糟。做错事是不好的,但撒谎会被许多人认为更糟糕。 - Romain Valeri
我仍然在本地计算机上有旧的代码库,我该如何将其推送? - physshyp
1
你需要执行 git push --force <oldRef>:<Destinationbranch> 命令,但是这样做可能会试图掩盖事实而造成更多的损害... 我不再争论这个问题了,但请注意 ^^ - Romain Valeri
<oldRef> 是之前在 <destinationBranch> 分支顶端的提交的 SHA-1 哈希值。你可以通过检查远程仓库或本地仓库来更容易地找到它,但是如果不了解你的仓库,很难说。 - Romain Valeri
1
你是如何推送的?如果你没有使用--force,那么你并没有覆盖任何东西,只是添加了一个文件的新版本。你可以通过检出相应的提交来返回到以前的版本。 - mfnx
显示剩余6条评论
1个回答

2
当你执行git push时,你并不会覆盖文件,而是添加文件的一个版本。这个版本的图片是一个commit,它由一个commit hash来标识。
我强烈建议你阅读https://git-scm.com/docs。它很简短,可以回答你很多问题。
所以,回答你的问题:我怎么撤消这个操作?问题应该是:我怎么得到之前的文件?像往常一样,在git中,有很多方法可以实现某些事情。我不会在这里发布git教程,但我会尝试为您提供一些基本命令,让您能够完成所需的操作。然而,如果你没有完全理解它们,请务必阅读文档。
我将假设您的工作区是干净的,也就是说,所有的东西都已经提交并推送到了远程。本地和远程存储库是完全同步的。
当执行git log时,你可以看到你在你的分支上(父分支)所做的所有提交。一些有用的变种是:git push -10 --oneline。这显示最近的10个提交的简短版本(每个提交一行)。对于每个提交,你将看到提交散列(你的提交标识符)。要切换到该提交,你可以执行:
git checkout <commit_hash>

在此之后,您的文件版本将对应于该提交。但请注意,您不再位于分支上。如果您想留在自己的分支上,但重置文件到给定提交的版本,可以执行以下操作:

git reset --hard <commit-hash>

请注意,此操作会永久删除您未提交的更改,请谨慎使用。

"Original Answer"翻译成中文为:"最初的回答"

git reset --hard <commit_hash>

有时候,进行软重置是有用的:

有时候,进行软重置是有用的:

git reset --soft <commit_hash>

这将重置您上一次的提交到由<commit_hash>标识的提交,但不会更改文件的版本。相反,这些更改在暂存区中。

还有一些有用的变体,例如:

最初的回答

git reset --soft HEAD~1

这个最后的命令会对你之前的提交进行软重置(重置到HEAD指向它之前的那个提交)。"最初的回答"。

谢谢。当我尝试结账时,它会显示错误的树。另外,当我使用git log命令时,它会给出另一个存储库的旧日志。 - physshyp
1
看起来你的本地仓库出了问题。尝试删除本地仓库,然后从远程重新克隆。 - mfnx
如果我使用 git reset --soft HEAD~1,它会撤销我的最后一次提交吗? - physshyp
好的,我执行了 git reset --hard <上一个正确提交的哈希值> 命令,它已经改变了本地文件,现在我只需要使用 git push 命令吗? - physshyp
请注意,使用此操作会丢失您的最新版本(您和同事不想要的版本)。 - mfnx
显示剩余4条评论

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