我克隆了存储库,检查了一个早期的提交,然后进行了一些更改。现在我想把它作为HEAD(提交/推送并使其成为HEAD) - 较新的提交将变得过时。
我该怎么做?
这不是How to move HEAD back to a previous location? (Detached head)的副本,因为我首先要提交更改,然后将新提交标记为HEAD。
答案 0 :(得分:1)
HEAD只是对您目前已签出的提交的引用; 不多也不少。
签出特定提交会将HEAD移动到该提交。 进行新的提交会将HEAD移动到新的提交中。
在您的示例中:
当您检出克隆存储库的早期提交时,您将HEAD移动到之前的提交。如果您随后进行了新的提交,则将HEAD移至此新提交。如果您之后没有检出任何其他分支/提交,HEAD仍会指向您的新提交。
如果我正确地解释您的方案,听起来好像您可能使用git checkout <commit-hash>
或类似方式直接检出了之前的提交。如果是这样,您将处于分离的HEAD状态。 这不会改变现有的提交历史记录。 此外,您通常不希望在此状态下进行新的提交,因为您无法做到这一点切换分支后回到他们身边。您可以在此状态下添加另一个分支并从那里安全地提交,但听起来好像您实际上打算还原远程仓库中的更改,而不是进行新的更改并将它们并行运行现有的历史。
您可能正在寻找的是git reset --hard
或git revert
。
git reset --hard
从当前分支中删除提交。因此,让我们想象一下,您想要处理的早期提交是当前分支提示背后的两个提交。当您克隆repo时,而不是在此提交上运行git checkout
,您可以运行git reset --hard HEAD~2
(其中HEAD~2
表示早于HEAD当前指向的两次提交)。这会将分支提示返回到先前的提交,并且任何新提交都将成为新的分支提示。请小心使用此命令,因为它会(几乎)永久地丢弃重置提交后的原始提交。
备选方案git revert
实现了类似的目标,而不会永远丢弃原始的后期提交。它查看了您想要恢复的早期提交,而不是简单地回滚到它并丢弃后面的提交,它创建了早期提交的副本,并将其放在提交历史记录中的现有提交之后。
我可能完全误解了你的问题,但希望这有点有用!
可以找到解释HEAD
,git reset
,git checkout
和git revert
的优秀资源here。