2016-01-21 67 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'並強制分支出來應該沒有問題。 –