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

I edited an older git commit and now I want to push it and make it HEAD

我克隆了存储库,检查了一个较早的提交,然后做了一些更改。现在我想将其作为 HEAD(commit/push 并使其成为 HEAD)——较新的提交将变得过时。

我该怎么做?

这不是 的副本,因为我想先提交更改,然后将新提交标记为 HEAD。

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

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

在你的例子中:

当您签出克隆存储库的较早提交时,您将 HEAD 移到了较早的提交。如果您随后进行了新提交,则 HEAD 将移至该新提交。如果您随后没有签出任何其他 branches/commits,HEAD 仍将在那里指向您的新提交。

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

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

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

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

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

可以找到解释 HEADgit resetgit checkoutgit revert 的重要资源 here