在git中恢复为sha哈希提交?


Revert to a commit by a SHA hash in Git?

本问题已经有最佳答案,请猛点这里访问。

我不清楚git revert是如何工作的。例如,我想在头部后面恢复到提交6个提交,在中间提交之间恢复所有更改。

假设它的sha散列是56e05fced214c44a37759efa2dfc25a65d8ae98d。那我为什么不能做这样的事呢?

1
git revert 56e05fced214c44a37759efa2dfc25a65d8ae98d


如果您希望在当前头上提交,并在另一个提交时使用正确的状态,撤消所有中间提交,那么可以使用reset创建索引的正确状态以进行提交。

1
2
3
4
5
6
7
8
# Reset the index and working tree to the desired tree
# Ensure you have no uncommitted changes that you want to keep
git reset --hard 56e05fced

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

git commit -m"Revert to 56e05fced"


Git Revert所做的是创建一个commit,它撤消在给定commit中所做的更改,创建一个与给定commit相反的commit。因此

1
git revert <SHA-1>

应该而且确实有效。

如果要倒带回指定的提交,并且可以这样做,因为这部分历史记录尚未发布,则需要使用git reset,而不是git revert:

1
git reset --hard <SHA-1>

(请注意,--hard会使您丢失工作目录中任何未提交的更改)。

附加说明

顺便说一下,也许这并不明显,但是在文档中说明的任何地方,您都可以将sha-1标识符(完整或缩短)设置为commit。


它恢复所说的提交,即添加与之相反的提交。如果要签出早期版本,请执行以下操作:

1
git checkout 56e05fced214c44a37759efa2dfc25a65d8ae98d


回滚到特定提交的最佳方法是:

1
git reset --hard <commit-id>

然后:

1
git push <reponame> -f


如果您的更改已经被推送到一个公共的、共享的远程服务器上,并且您希望恢复HEAD之间的所有提交,那么您可以向git revert传递一个提交范围,

1
git revert 56e05f..HEAD

它将恢复56e05fHEAD之间的所有承诺(不包括范围的起点,56e05f)。


更新:

这个答案比我的答案简单:如何将Git存储库恢复到以前的提交?

原始答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Create a backup of master branch
git branch backup_master

# Point master to '56e05fce' and
# make working directory the same with '56e05fce'
git reset --hard 56e05fce

# Point master back to 'backup_master' and
# leave working directory the same with '56e05fce'.
git reset --soft backup_master

# Now working directory is the same '56e05fce' and
# master points to the original revision. Then we create a commit.
git commit -a -m"Revert to 56e05fce"

# Delete unused branch
git branch -d backup_master

在这里,两个命令git reset --hardgit reset --soft是魔法。第一个改变了工作目录,但它也改变了头部。我们用第二个固定头。


这更容易理解:

1
2
3
git checkout 56e05fced -- .
git add .
git commit -m 'Revert to 56e05fced'

为了证明它有效:

1
git diff 56e05fced


应该简单到:

1
git reset --hard 56e05f

这会让你回到那个特定的时间点。


这可能有效:

1
2
3
git checkout 56e05f
echo ref: refs/heads/master > .git/HEAD
git commit