git - Git根据SHA哈希来恢复一个提交?

  显示原文与译文双语对照的内容

这个问题已经有了如下答案:

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

假设它的SHA 散列是 56e05fced214c44a37759efa2dfc25a65d8ae98d 那么,为什么我不能这样做:


git revert 56e05fced214c44a37759efa2dfc25a65d8ae98d

时间:

如果你想在当前的头部上以不同的提交状态进行提交,撤销所有的中间提交,那么你可以使用 reset 创建索引的正确状态,使提交生效。


# Reset the index to the desired tree
git reset 56e05fced

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

git commit -m"Revert to 56e05fced"

# Update working copy to reflect the new commit
git reset --hard

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


git checkout 56e05fced214c44a37759efa2dfc25a65d8ae98d

什么 git-revert 所做的就是创建一个提交哪些撤消所做的更改在给定一个给定的提交,创建在认可它是反向( 呃,倒数) 提交。 因此


git revert <SHA-1>

应该和确实工作。

如果你想重新倒回指定的提交,你可以这样做,因为这个历史的一部分数据还没有发布,则需要使用 git-reset,而不是 git-revert:


git reset --hard <SHA-1>

( 注意 --hard 会让你丢失工作目录中的任何non-committed更改) 。

附加便笺

顺便说一下,也许尚不明显,但到处都是文档中写明哪 <commit> 或者 <commit-ish> ( 或者 <object> ),如果你希望一个 SHA-1 ( 完整或者缩短) 标识符的提交。

如果你的改动已经被传输到一个公开共享远程 HEAD<sha-id> 之间,并且你要还原所有提交,在提交范围以 git revert,就能过了。


git revert 56e05f..HEAD

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

这就是我所做的:


# 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 brand
git branch -d backup_master

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

这更容易理解:


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

并证明它是有效的:

 
git diff 56e05fced

 
...