1

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

我后来才意识到我错过了仍然在旧代码上的一行。我给它一个谷歌搜索并找出关于git commit --amend,对我来说幸运的是,没有其他提交。我以为我所要做的就是修复代码行、git add文件、,git commit --amend最后修复git push到 repo,但 git 告诉我

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

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

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

4

1 回答 1

4

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

git push origin master --force

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

此外,您需要确定自从您尝试修改的提交以来,没有向远程分支添加新的提交。强制您的分支退出将破坏您以外的其他人在相关提交之后所做的任何新工作。

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

更新:

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

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

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

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

当你尝试 push 时,Git 认为 commitB是共同的祖先,而你实际上是在 remote后面master。另一种绘制方法是:

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

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

于 2016-01-21T04:12:08.683 回答