我需要将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时,原始克隆中的所有文件仍然存在。好像根本没有发生任何恢复。想法?
答案 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