我在笔记本电脑上创建了一个本地 Git 存储库,然后将源推送到 Heroku,创建了一个远程分支。经过几天的提交和推送,我需要回滚到更早的提交。这就是我所做的。
cd <app root>
git checkout 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73
有人告诉我,结帐创建了一个新的工作树,而不是分支本身,所以当我将回滚更改推送到 Heroku 时,它说一切都是最新的,没有推送任何内容。我该如何解决这种情况?提前感谢您的帮助。
我在笔记本电脑上创建了一个本地 Git 存储库,然后将源推送到 Heroku,创建了一个远程分支。经过几天的提交和推送,我需要回滚到更早的提交。这就是我所做的。
cd <app root>
git checkout 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73
有人告诉我,结帐创建了一个新的工作树,而不是分支本身,所以当我将回滚更改推送到 Heroku 时,它说一切都是最新的,没有推送任何内容。我该如何解决这种情况?提前感谢您的帮助。
当您签出直接提交名称(使用提交对象的 SHA-1 哈希)而不是签出分支名称时,您最终会得到一个“分离的 HEAD”。HEAD 是跟踪当前签出内容的“参考”。当您直接签出提交而不是分支时,它会分离(它未附加到任何分支)。分离存储库的 HEAD 时不会更新任何分支。您可能会认为分离的头部状态就像您签出了一个匿名分支。
要重新附加存储库的 HEAD,您需要将当前 HEAD 保存为分支并检查该分支:
要将当前 HEAD 保存在新分支中,请执行以下操作:
git branch <new-branch-name>
要覆盖现有分支,您需要使用--force
:
git branch --force <existing-branch-name>
然后,通过签出新的/更新的分支来重新附加存储库的 HEAD:
git checkout <branch-name>
(与或<branch-name>
相同,取决于您使用上述两个命令中的哪一个)<new-branch-name>
<existing-branch-name>
这个序列(git branch
将引用指向当前的 HEAD 提交,然后git checkout
是更新的分支)将转发您在工作索引和/或树中可能拥有的任何未提交的内容。
将来,如果您想将当前分支“回滚”到以前的某个提交,您应该使用它而不是分离存储库的 HEAD:
git reset --hard <commit>
这会将当前分支(或已分离的 HEAD,如果它已经分离)重置为指定的提交,并使索引和工作树反映该提交(即,它丢弃自指定提交以来的任何提交以及任何未提交的内容)。
分离的 HEAD 状态对于重新访问旧状态很有用,有时对于您不确定是否会保留的短期工作很有用。除此之外,您可能想避免它。
您要重置:
git reset --hard 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73