如何在Git中恢复到特定的标签?

8yoxcaq7  于 2023-05-12  发布在  Git
关注(0)|答案(5)|浏览(231)

我知道如何恢复到Git分支中较早的提交,但如何恢复到由标记指定的分支状态?我设想的是这样的:

git revert -bytag "Version 1.0 Revision 1.5"

这可能吗?

6yjfywim

6yjfywim1#

Git标签只是指向提交的指针。因此,您使用它们的方式与您使用HEAD、分支名称或提交sha散列相同。你可以在任何接受commit/revision参数的git命令中使用标签。您可以尝试使用git rev-parse tagname来显示它所指向的提交。
在您的情况下,您至少有以下两种选择:
1.将当前分支重置为特定标记:

git reset --hard tagname

1.在顶部生成revert commit,以使您进入标记的状态:

git revert tag

如果您有合并提交,这可能会引入一些冲突。

cmssoen2

cmssoen22#

使用git reset

git reset --hard "Version 1.0 Revision 1.5"

(假设指定的字符串是标记)。

vngu2lb8

vngu2lb83#

你可以使用git checkout。
我尝试了公认的解决方案,但得到了一个错误,warning: refname '<tagname>' is ambiguous'
但是正如答案所述,标签的行为就像一个指向提交的指针,所以就像你使用提交哈希一样,你可以只 checkout 标签。唯一的区别是你用tags/开头:
git checkout tags/<tagname>

wh6knrhe

wh6knrhe4#

如果您是:

  • 确定要返回哪个提交
  • 删除之后的所有提交
  • 将更改应用到遥控器

1.重置为名为reset-to-here的标记

git reset --hard reset-to-here

1.通过+将更改推送到远程强制

git push origin +master
vpfxa7rd

vpfxa7rd5#

我一直在寻找这个问题的解决方案很长一段时间。经过大量的研究,我可以说,没有一个解决这个问题的办法:

  • git reset --hard <tagname>将更改历史记录。这不是还原
  • git revert <tagname>将只应用该特定提交的更改
  • 如果有合并,git revert <hash1>..<hash2>将无法工作。而且即使您可以指定父级,如果有几个合并,这个操作也可能很繁琐。我们还必须考虑到,如果我们不想破坏我们的分支,那么每一个还原都必须经过明智的选择和测试。git rebasegit cherry-pick有同样的问题。

所以这是唯一对我有效的方法:

git checkout <tag name>
mkdir ../tmp
cp -r . ../tmp
git checkout master
cp -rf ../tmp/* .
rm -rf ../tmp
git commit -m "Revert"
git push

相关问题