如何做hg revert --all with git?

时间:2015-06-01 11:51:16

标签: git mercurial

使用Mercurial时,可以发出以下命令: hg revert --all --rev <revision> 工作目录的内容设置为指定的<revision>,但您将保持在树中的位置(相同的父级,分支等)。

如何在git中执行此操作? 它应该像git reset --hard <commit>一样,不移动分支指针。

TL; DR git config alias.revert-all 'read-tree -um HEAD' git revert-all <commit>

我找到的所有变种的比较/测试可以在这里找到:http://git.io/vk9it

4 个答案:

答案 0 :(得分:1)

git read-tree -um @ $thatcommit

会做到的。那个&#34;将索引和工作树从HEAD aka @ commit转换为$ thatcommit,如结帐(但不触及HEAD)&#34;。

当您所做的事情与任何便利命令都不匹配时,核心命令会让您回头: - )

如果您需要清除未提交的更改,git reset --hard可能会选择一些git clean选项来清除完全未跟踪的文件,git真的很讨厌在没有明确订单的情况下踩踏未提交的工作。

答案 1 :(得分:0)

这需要几个步骤。首先,如果您已暂存任何文件或进行任何不需要的本地更改,请使用

git reset --hard

摆脱它们(当然,如果你想保留它们,先提交它们)。如果没有暂存文件且没有本地更改,则可以跳过此步骤。

其次,检查要返回的修订版本:

git checkout <rev>

您的工作目录现在包含正确的文件,但指向错误的提交。要返回原始版本,请执行以下操作:

git reset --mixed <original_rev>

原始修订版通常是您所在分支的负责人,因此您只需使用原始修订版的分支名称即可。 --mixed是可选的,因为它是git --reset的默认值;它会将文件移出索引,git checkout放置它们并将提交移至<original_rev>

更简单的方法是直接签出修订文件,然后使用git reset --mixed忘记索引。即。

git checkout <rev> .
git reset --mixed

注意上面的点(.)。它指定当前目录(并递归地在其下面的所有内容)。

答案 2 :(得分:0)

为了完整性,另一个(较慢的)替代方案: git diff --cached --full-index --binary <commit> | git apply --reverse --cached

仅更新索引,强制它到工作目录发出: git checkout-index -fa && git clean -dxf

答案 3 :(得分:-1)

  

工作目录的内容设置为指定但您保持在树中的位置(相同的父级,分支等)。

在git中,HEAD可以指向单个提交。您不能同时拥有多个HEADS(除非您使用git new-workdir,然后您有n个存储库副本)

唯一可能与此相似的东西(但又不是你想要的)就是使用分支(与hg相同)。

一旦你有几个分支,每个分支可以有不同的HEAD。

您不必使用重置,只需branch在任何给定点:

git checkout -b <branch_name> <SHA-1>

并且您将有一个指向所需父级的新分支。

在git中执行git revert时,您仍然在当前分支上,但您的父级是当前提交之前的提交(历史记录正在移动到树中的给定点)