将工作副本还原为较旧的提交?

时间:2018-05-04 21:57:06

标签: git github

我需要将this repository还原为提交e4ea7bf73124968e2f68012f77837df2046fd6e5。换句话说,我想彻底擦除之后的所有提交。

根据其中一个答案in this post,这就是我正在做的事情:

git clone git@github.com:superflycss/utilities-layout.git
cd utilities-layout

git reset e4ea7bf73124968e2f68012f77837df2046fd6e5 
# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to e4ea7bf73124968e2f68012f77837df2046fd6e5"

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

此时我认为我在家是免费的,但是当我做一个ls时,原始克隆中的所有文件仍然存在。好像根本没有发生任何恢复。想法?

2 个答案:

答案 0 :(得分:3)

要以最少的改变来实现您想要的目标,请切换到以下命令序列:

git clone git@github.com:superflycss/utilities-layout.git
cd utilities-layout

(目前为止,但随后:)

git reset --hard e4ea7bf73124968e2f68012f77837df2046fd6e5

(请注意此处添加--hard),然后回到之前的内容:

git reset --soft HEAD@{1}
git commit -m "Revert to e4ea7bf73124968e2f68012f77837df2046fd6e5"

此后不需要额外reset,因为第一个git reset调整了索引和工作树(同时还修改了存储在分支名称中的哈希)。第二个git reset 修改分支名称中存储的哈希,为您准备git commit

您的原始命令序列在第一步使用--mixed重置。这会在写入新哈希时重置索引,但保持工作树不变。第二个软重置修复了存储的哈希ID。第三个git reset --hard保留未跟踪的工作树文件:这些文件在第一个git reset时未跟踪,并且从那时起一直未被跟踪。换句话说,由于第一次重置是--mixed,所以这些工作树文件从未被删除,现在不会被删除。

(旁注:我可能会用一个git read-tree后跟一个git commit来实现这一点,而不是多个git reset命令。但这是一个不同的策略,并没有解释什么发生在您使用的方法上。因此上面的答案确实可以解释它。)

答案 1 :(得分:2)

要恢复到特定提交,您只需要

git reset --hard <COMMIT_HASH>

如果您想在远程

中更新此更改
git push --force origin <BRANCH_NAME>

如果您有未跟踪的文件,请查看

git clean