2016-01-21 69 views
1

我决定将一个库集成到我的代码中。 我添加了库,并更改了几行代码以开始实现它。 它编译,所以我承诺并推动回购。git我在提交和推送前忘了编辑一行

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

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

我觉得奇怪,因为我在最近一次提交的,如果我git reset -soft HEAD~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' 

当你试图推,Git会认为提交B是共同的祖先,那你实际上落后远程master。绘制此的另一种方式是:

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

Git不会意识到你想让你的修改提交到遥控器上更换C,所以你必须尽了力推动实现这一目标。

+1

您应该真正描述该命令的功能,以及为什么OP不应该首先使用它。 – Alik

+0

太好了,谢谢!完美工作。我知道为什么我不应该使用它,因为它可能会与其他开发人员混淆在旧提交中,但由于我是在此分支上开发的唯一人员,我认为它没关系? – danielr

+0

是的,如果你是唯一的开发者,那么使用'git commit --amend'并强制分支出来应该没有问题。 –