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

git我在提交和推送之前忘了编辑一行,git,commit,git-amend,Git,Commit,Git Amend,我决定在代码中集成一个库。 我添加了这个库,并更改了几行代码来开始实现它。 它可以编译,所以我提交并推送到回购协议 我后来才意识到,我漏掉了一行仍在旧代码中的代码。 我在谷歌上搜索了一下,找到了关于git提交的信息——修改,幸运的是,没有其他提交。 我以为我所要做的就是修改代码行,git添加文件,git提交——修改,最后git将其推送到回购协议,但git告诉我 !![已拒绝]主机->主机(非快进)提示:更新 已被拒绝,因为当前分支的尖端已落后 我觉得这很奇怪,因为我正在进行最新的提交,如果我gi

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

我后来才意识到,我漏掉了一行仍在旧代码中的代码。 我在谷歌上搜索了一下,找到了关于git提交的信息——修改,幸运的是,没有其他提交。 我以为我所要做的就是修改代码行,
git添加
文件,
git提交——修改
,最后
git将其推送到回购协议,但git告诉我

!![已拒绝]主机->主机(非快进)提示:更新 已被拒绝,因为当前分支的尖端已落后

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


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

如果您真的想修改提交,则需要强制将分支转移到远程:

git push origin master --force
请记住,这将覆盖远程分支,这可能会对共享该分支的任何其他人造成严重破坏

此外,您还需要确定,自从您试图修改的提交之后,没有向远程分支添加新的提交。强迫你的分支机构退出会破坏你以外的人在提交相关文件后所做的任何新工作

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

更新:

您获得
更新的原因被拒绝,因为当前分支的提示落后于错误
,因为修改本地分支头部的提交实际上导致本地分支偏离远程分支。下面的图表显示了修改前本地和远程
分支的外观:

remote: A -- B -- C
local:  A -- B -- C
remote: A -- B -- C
local:  A -- B -- C'
换句话说,你是最新的。但是,当您在本地修改commit
C
时,实际上您用一个全新的commit(使用一个新的SHA-1散列)替换了它。下面是修改后的图表:

remote: A -- B -- C
local:  A -- B -- C
remote: A -- B -- C
local:  A -- B -- C'
当您尝试推送时,Git认为commit
B
是共同的祖先,而您实际上是远程
主机的幕后操纵者。另一种绘制方法是:

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

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

如果您确实想修改提交,则需要强制将分支转移到远程:

git push origin master --force
请记住,这将覆盖远程分支,这可能会对共享该分支的任何其他人造成严重破坏

此外,您还需要确定,自从您试图修改的提交之后,没有向远程分支添加新的提交。强迫你的分支机构退出会破坏你以外的人在提交相关文件后所做的任何新工作

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

更新:

您获得
更新的原因被拒绝,因为当前分支的提示落后于错误
,因为修改本地分支头部的提交实际上导致本地分支偏离远程分支。下面的图表显示了修改前本地和远程
分支的外观:

remote: A -- B -- C
local:  A -- B -- C
remote: A -- B -- C
local:  A -- B -- C'
换句话说,你是最新的。但是,当您在本地修改commit
C
时,实际上您用一个全新的commit(使用一个新的SHA-1散列)替换了它。下面是修改后的图表:

remote: A -- B -- C
local:  A -- B -- C
remote: A -- B -- C
local:  A -- B -- C'
当您尝试推送时,Git认为commit
B
是共同的祖先,而您实际上是远程
主机的幕后操纵者。另一种绘制方法是:

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

Git没有意识到您打算将修改后的commit替换为遥控器上的
C
,因此您必须进行强制推送才能实现这一点。

您应该真正描述一下该命令的作用以及OP不应该首先使用它的原因。太好了,谢谢!工作得很好。我知道为什么我不应该使用它,因为它可能会干扰其他使用旧提交的开发人员,但由于我是唯一一个使用此分支开发的人,我认为这没问题?是的,如果您是唯一的开发人员,那么使用
git commit--amend
并强制退出该分支应该没有问题。哇,非常好的更新答案,我现在完全明白了。谢谢你抽出时间!你应该真正描述一下这个命令的作用,以及为什么OP不应该首先使用它。太好了,谢谢!工作得很好。我知道为什么我不应该使用它,因为它可能会干扰其他使用旧提交的开发人员,但由于我是唯一一个使用此分支开发的人,我认为这没问题?是的,如果您是唯一的开发人员,那么使用
git commit--amend
并强制退出该分支应该没有问题。哇,非常好的更新答案,我现在完全明白了。谢谢你抽出时间!