2025-02-26 10:00:03

如何使用Git恢复

git如何恢复使用?

这听起来像是一个重复的问题,但当人们问这个问题时,通常的回答是,使用git reset,就像在git中通过SHA散列恢复到提交一样。

然后,当有人问如何使用git重置时,人们会回答说你应该使用git revert as per git -如何回滚。

在你意识到之前,八个不同的人出现了,他们用自己独特的方法来救OP的屁股,所有这些都超出了你的理解范围。

所以让我们试着坚持简短和写一个傻瓜指南git恢复。

一个场景:你承诺了两次master,结果很糟糕。你在推波助澜,别人也有你的坏改变。

你想要撤销它。这不是你可以自己在代码中手工撤销的东西,比如一些向导或包管理器在各处更改了大量的东西——你只想把它都放回原来的样子。

这就是源代码控制的意义所在。我相信这很简单。

你会用到git revert,怎么用呢?

在运行git恢复之后,你还需要做其他事情吗?你必须提交恢复所做的更改还是恢复直接提交到存储库还是什么??

显然,你需要再次用力,可能还会向团队宣布你的决定。


当前回答

我通过运行'git revert commit id'恢复了一些提交,例如:

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

然后我被提示提交还原(就像你在运行'git commit'时一样)。我的默认终端程序是Vim,所以我运行:

:wq 

最后,我将更改推到存储库:

git push

其他回答

下面的信息图显示了git如何恢复本质上是一个反向的git樱桃选择,通过前滚来撤销东西;被还原的目标提交将保留在历史记录中!

当你不能重写整个历史,但仍然想完全撤销之前的提交时,使用git revert。与大多数Git命令一样,还原是在本地执行的,因此,需要推送结果提交,以便与团队的其他成员共享。

Git会进行一次新的提交

Git还原只是创建一个与现有提交相反的新提交。

它使文件处于相同的状态,就好像已经恢复的提交从未存在过一样。例如,考虑以下简单的例子:

$ cd /tmp/example
$ git init
Initialized empty Git repository in /tmp/example/.git/
$ echo "Initial text" > README.md
$ git add README.md
$ git commit -m "initial commit"
[master (root-commit) 3f7522e] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ echo "bad update" > README.md 
$ git commit -am "bad update"
[master a1b9870] bad update
 1 file changed, 1 insertion(+), 1 deletion(-)

在这个例子中,提交历史有两次提交,最后一次是错误的。使用git恢复:

$ git revert HEAD
[master 1db4eeb] Revert "bad update"
 1 file changed, 1 insertion(+), 1 deletion(-)

日志中会有3次提交:

$ git log --oneline
1db4eeb Revert "bad update"
a1b9870 bad update
3f7522e initial commit

所以发生的事情有一个一致的历史记录,但文件似乎从来没有发生过糟糕的更新:

cat README.md 
Initial text

要还原的提交在历史记录中的哪个位置并不重要(在上面的例子中,还原的是最后一次提交——任何提交都可以还原)。

关闭问题

之后你还有别的事要做吗?

git还原只是另一种提交,例如,推到远程,以便其他用户可以提取/获取/合并更改,然后你就完成了。

你必须提交还原所做的更改还是还原直接提交到回购?

Git还原是一个提交——假设还原单个提交是你想做的,没有额外的步骤。

显然你需要再推一次,可能还要向团队宣布。

实际上——如果远程处于不稳定状态——与团队的其他成员沟通他们需要拉取以获得修复(还原提交)将是正确的事情:)。

我通过运行'git revert commit id'恢复了一些提交,例如:

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

然后我被提示提交还原(就像你在运行'git commit'时一样)。我的默认终端程序是Vim,所以我运行:

:wq 

最后,我将更改推到存储库:

git push

这个问题很老了,但仍然让人(比如我)感到困惑

作为一个初学者,在经历了一些试验和错误(错误比试验更多)后,我得到了一个重要的观点:

Git恢复需要您想要删除的提交的id,并将其保留到历史记录中 Git重置需要你想要保留的提交,并将从历史记录中删除之后的所有内容。

也就是说,如果你在第一个提交id中使用revert,你会发现自己进入了一个空目录,并且在历史记录中有一个额外的提交,而使用reset你的目录将是..返回到最初的提交,您的历史记录就会像上次提交从未发生过一样。

更清楚的是,用这样的日志:

# git log --oneline

cb76ee4 wrong
01b56c6 test
2e407ce first commit

使用git恢复cb76ee4将默认将您的文件恢复到01b56c6,并将进一步提交到您的历史记录中:

8d4406b Revert "wrong"
cb76ee4 wrong
01b56c6 test
2e407ce first commit

Git重置01b56c6将把你的文件带回01b56c6,并从你的历史记录中清除任何其他提交:

01b56c6 test
2e407ce first commit

我知道这些是“基础”,但这对我来说很困惑,通过运行还原第一个id('第一次提交'),我期望找到我的初始文件,这需要一段时间来理解,如果你需要你的文件作为'第一次提交',你需要使用下一个id。

使用Git恢复如下所示:

Git恢复<insert bad commit hash here>

Git将用回滚的更改创建一个新的提交。git reset将擦除git历史记录,而不是重新提交。

之后的步骤与任何其他提交相同。