首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

EGit 推送總是 non-fast-forward:原為勾選 Amend Last Commit 導致

     編輯:程式設計綜合問答

現象

使用 EGit (Eclipse Git Plugin) 推送至遠端倉庫時,反覆出現 non-fast-forward 錯誤。依網路教學執行 pull --rebase 或 merge 解決後,下一次推送又再次報錯。

根因發現

提交對話框中勾選了 "Amend Last Commit"(修正上一次提交)。此選項會將當前變更合併至前一個提交,並改寫提交歷史(修改 Commit Hash)。導致本地分支歷史與遠端分支發散,每次推送都被視為非快轉更新而被拒絕。

Amend 運作原理

  • 正常提交:建立新 Commit,指向前一個 Commit → 歷史線性增長。
  • Amend 提交:取代前一個 Commit,產生新 Hash,舊 Commit 成為「懸空物件」。遠端仍保有舊 Commit,本地歷史已改寫 → 非快轉。

解決方式

  1. 取消勾選 Amend Last Commit:每次提交建立新 Commit,保持歷史線性,推送即為 fast-forward。
  2. 若確需修改上一提交(如修正訊息、補漏檔案):
    • 本地 amend 後,強制推送:git push -f origin branch(需確認無人同步該分支)。
    • 或在團隊協作分支避免使用 amend,改用新提交 git commit --fixup 稍後 rebase -i --autosquash 整理。

EGit 介面操作建議

  • Commit 對話框 → 取消勾選 Amend Last Commit。
  • 若需修改上一提交訊息:右鍵專案 → Team → Commit → 勾選 Amend → 提交 → 右鍵 → Team → Push → 勾選 Force update(僅限個人功能分支)。

總結

non-fast-forward 本質是本地歷史與遠端歷史發散。EGit 的 Amend 選項隱蔽且易誤觸,導致反覆改寫歷史。養成「不輕易改寫已推送歷史」的習慣,或改用命令列 git 更清晰掌控提交圖譜。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved