Git checkout <SHA> and Heroku

6

我在我的笔记本电脑上创建了一个本地Git仓库,然后将源代码推送到Heroku创建一个远程分支。几天后进行了一些提交和推送后,我需要回滚到早期的提交。以下是我所做的操作。

cd <app root>
git checkout 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73 

有人告诉我,执行checkout命令只是创建了一个新的工作树,而不是分支本身。因此,当我将回滚更改推送到Heroku时,它显示一切都是最新的,没有任何东西被推送。请问如何解决这种情况?提前感谢您的帮助。
2个回答

8
当你检出一个直接提交名称(使用提交对象的SHA-1哈希值)而不是检出分支名称时,会出现“分离的HEAD”状态。HEAD是“ref”,用于跟踪当前检出的内容。当你直接检出提交而不是分支时(它不附加到任何分支),它就变成了分离的。在分离存储库的HEAD时不更新任何分支。您可以将分离的HEAD状态视为匿名分支已检出。
要重新连接存储库的HEAD,请将当前HEAD保存为分支并检出该分支:
  1. To save the current HEAD in a new branch do this:

    git branch <new-branch-name>
    
  2. To overwrite an existing branch you need to use --force:

    git branch --force <existing-branch-name>
    
  3. Then, reattach your repository's HEAD by checking out the new/updated branch:

    git checkout <branch-name>
    

    (where <branch-name> is the same as <new-branch-name> or <existing-branch-name>, depending on which of the above two commands you used)

这个步骤(使用git branch命令将引用指向当前HEAD提交,然后使用更新的分支进行git checkout)将保留您在工作索引和/或树中可能有的任何未提交的内容。


如果您想要将当前分支“回滚”到以前的某个提交状态,应该使用这种方法,而不是分离您的存储库的HEAD:

git reset --hard <commit>

这将重置当前分支(如果已分离,则为分离的 HEAD)到指定的提交,并使索引和工作树反映该提交(即,它会丢弃自指定提交以来的任何提交以及未提交的内容)。

分离的 HEAD 状态对于回顾旧状态有用,有时也用于不确定是否会保留的短期工作。除此之外,您可能希望避免使用它。


2

您想要重置:

git reset --hard 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73

谢谢,这会将工作树还原为分支吗? - Bob
这可能是你最初应该做的,但它不会解决你的问题。如果你的HEAD仍然是分离状态,它将无法重新附加到分支上。请查看我的答案。 - Chris Johnsen
1
它将重置您当前的头指向指定的提交。因此,您需要 git checkout master(或您想要回滚的任何分支),然后使用 git reset 命令。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接