通过Git中的SHA哈希恢复到提交?[副本]

hfsqlsce  于 2023-04-28  发布在  Git
关注(0)|答案(9)|浏览(178)

此问题已在此处有答案

How do I revert a Git repository to a previous commit?(41答案)
8年前关闭。
我不太清楚git revert是如何工作的。例如,我想恢复到头部后面六个提交的提交,恢复中间提交中的所有更改。
假设它的SHA哈希是56e05fced214c44a37759efa2dfc25a65d8ae98d。那我为什么不能做点什么

git revert 56e05fced214c44a37759efa2dfc25a65d8ae98d
fruv7luv

fruv7luv1#

如果你想在当前HEAD的顶部提交,并在另一次提交时使用相同的状态,撤销所有的中间提交,那么你可以使用reset来创建正确的索引状态来进行提交。

# 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"
vyswwuz2

vyswwuz22#

git-revert所做的是创建一个提交,该提交撤销给定提交中所做的更改,创建一个与给定提交相反的提交。因此

git revert <SHA-1>

它应该和工作。
如果你想回退到指定的提交,并且你可以这样做,因为这部分历史记录还没有发布,你需要使用git-reset,而不是git-revert:

git reset --hard <SHA-1>

(Note --hard会让你丢失工作目录中任何未提交的更改)。

附加说明

顺便说一句,也许这不是显而易见的,但在文档中提到<commit><commit-ish>(或<object>)的任何地方,您都可以放置提交的SHA-1标识符(完整或缩短)。

q1qsirdb

q1qsirdb3#

它恢复所述的提交,也就是说,添加与之相反的提交。如果要检出较早的修订版,请执行以下操作:

git checkout 56e05fced214c44a37759efa2dfc25a65d8ae98d
pkbketx9

pkbketx94#

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

git reset --hard <commit-id>

然后:

git push <reponame> -f
jmp7cifd

jmp7cifd5#

如果你的修改已经被推送到一个public,sharedremote,并且你想恢复HEAD<sha-id>之间的所有提交,那么你可以传递一个提交范围给git revert

git revert 56e05f..HEAD

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

bkkx9g8r

bkkx9g8r6#

更新时间:

如果中间没有合并提交,这个答案提供了一个更简单的方法:https://stackoverflow.com/a/21718540/541862
但是如果有一个或多个合并提交,这个答案就不起作用了,所以坚持这个(在所有情况下都起作用)。

原始答案:

# 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在这里很神奇。第一个修改了工作目录,但也修改了head(当前分支)。我们用第二个来固定头部。

vm0i2vca

vm0i2vca7#

这更容易理解:

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

为了证明它有效:

git diff 56e05fced
r6hnlfcb

r6hnlfcb8#

应该是这样简单:

git reset --hard 56e05f

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

ecr0jaav

ecr0jaav9#

这可能会起作用:

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

相关问题