git 我忘记在提交和推送之前编辑一行

git I forgot to edit a line before commiting and pushing

我决定将一个库集成到我的代码中。 我添加了库,并更改了几行代码以开始实施它。 它编译,所以我提交并推送到回购协议。

我后来才意识到我漏掉了仍然在旧代码上的一行。 我对其进行了 google 搜索并找到了 git commit --amend,幸运的是,没有其他提交。 我以为我所要做的就是修复代码行,git add 文件,git commit --amend,最后 git push 到 repo,但是 git 告诉我

! [rejected] master -> master (non-fast-forward) hint: Updates were rejected because the tip of your current branch is behind

我觉得这很奇怪,因为我正在进行最新的提交,如果我 git reset -soft HEAD~1 除了我更改的单行代码之外,我又回到了与 repo 保持一致的状态。

我做错了吗?我真的不想只为这一行代码做一个全新的提交,这行代码应该是上次提交的一部分。

如果你真的想修改提交,那么你需要强制分支到远程:

git push origin master --force

请记住,这将覆盖 远程分支,这可能会对共享该分支的其他人造成严重破坏。

此外,您需要确定自您尝试修改的提交以来没有新的提交添加到远程分支。强制你的分支会破坏你以外的人在有问题的提交之后所做的任何新工作。

如您所知,这里有很多地方可能出错。因此,一个更安全的策略,也是我为您推荐的,是简单地修复 new 提交中丢失的代码行,然后将您的更改推送到远程。

更新:

您收到 Updates were rejected because the tip of your current branch is behind 错误的原因是因为修改本地分支 HEAD 上的提交实际上导致您的本地分支与远程分支 diverge。这是一张图表,显示了您的本地和远程 master 分支在 修改之前的样子:

remote: A -- B -- C
local:  A -- B -- C

换句话说,你是最新的。但是,当您在本地修改提交 C 时,您实际上 将其替换为 一个全新的提交(使用新的 SHA-1 哈希)。这是图表在 修改后的样子:

remote: A -- B -- C
local:  A -- B -- C'

当您尝试推送时,Git 认为提交 B 是共同的祖先,而您实际上 落后于 远程 master.另一种绘制方式是:

remote: A -- B -- C
local:         \_ C'

Git 没有意识到您打算用修改后的提交替换远程上的 C,因此您必须强制推送才能实现此目的。