使用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
答案 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
时,您仍然在当前分支上,但您的父级是当前提交之前的提交(历史记录正在移动到树中的给定点)