我编辑了一个较旧的git提交,现在我想推它并使它成为HEAD

时间:2018-03-01 10:17:51

标签: git git-commit git-push

我克隆了存储库,检查了一个早期的提交,然后进行了一些更改。现在我想把它作为HEAD(提交/推送并使其成为HEAD) - 较新的提交将变得过时。

我该怎么做?

这不是How to move HEAD back to a previous location? (Detached head)的副本,因为我首先要提交更改,然后将新提交标记为HEAD。

1 个答案:

答案 0 :(得分:1)

HEAD只是对您目前已签出的提交的引用; 不多也不少。

签出特定提交会将HEAD移动到该提交。 进行新的提交会将HEAD移动到新的提交中。

在您的示例中:

当您检出克隆存储库的早期提交时,您将HEAD移动到之前的提交。如果您随后进行了新的提交,则将HEAD移至此新提交。如果您之后没有检出任何其他分支/提交,HEAD仍会指向您的新提交。

如果我正确地解释您的方案,听起来好像您可能使用git checkout <commit-hash>或类似方式直接检出了之前的提交。如果是这样,您将处于分离的HEAD状态 这不会改变现有的提交历史记录。 此外,您通常不希望在此状态下进行新的提交,因为您无法做到这一点切换分支后回到他们身边。您可以在此状态下添加另一个分支并从那里安全地提交,但听起来好像您实际上打算还原远程仓库中的更改,而不是进行新的更改并将它们并行运行现有的历史。

您可能正在寻找的是git reset --hardgit revert

git reset --hard从当前分支中删除提交。因此,让我们想象一下,您想要处理的早期提交是当前分支提示背后的两个提交。当您克隆repo时,而不是在此提交上运行git checkout,您可以运行git reset --hard HEAD~2(其中HEAD~2表示早于HEAD当前指向的两次提交)。这会将分支提示返回到先前的提交,并且任何新提交都将成为新的分支提示。请小心使用此命令,因为它会(几乎)永久地丢弃重置提交后的原始提交。

备选方案git revert实现了类似的目标,而不会永远丢弃原始的后期提交。它查看了您想要恢复的早期提交,而不是简单地回滚到它并丢弃后面的提交,它创建了早期提交的副本,并将其放在提交历史记录中的现有提交之后。

我可能完全误解了你的问题,但希望这有点有用!

可以找到解释HEADgit resetgit checkoutgit revert的优秀资源here