簡體   English   中英

Git 非快進被拒絕

[英]Git non-fast-forward rejected

我覺得這個問題已經被問過很多次了,但解決方案通常是“我刪除了目錄並用新的結帳重新完成了我的工作。” 我做了一次提交和推送,但意識到我在提交消息中引用了錯誤的票號。 所以我在 SO 上尋找一個快速解決方案,最終在終端中輸入以下內容:

$ git reset --soft HEAD^
$ git commit -m "... correct message ..."

唯一的問題是我收到以下錯誤消息:

To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'Note about
fast-forwards' section of 'git push --help' for details.

我正在使用 git-flow 模型並且正在開發分支上工作。 我怎樣才能把東西合並回來讓 git 再次開心?

如果您將提交推送到服務器,然后在本地重寫該提交(使用git resetgit rebasegit filter-branch或任何其他歷史操作),然后將重寫的提交推送回服務器,您將搞砸拉起任何其他人。 這是一個例子; 假設您已提交 A,並將其推送到服務器。

-*-*-A <-- master

-*-*-A <-- origin/master

現在您決定按照您提到的方式重寫 A,重置並重新提交。 請注意,這會留下一個懸空提交,A,最終將被垃圾收集,因為它無法訪問。

-*-*-A
    \
     A' <-- master

-*-*-A  <-- origin/master

如果其他人,例如 Fred,在您執行此操作時從服務器上拉下master ,他們將擁有對 A 的引用,他們可能會從該引用開始工作:

-*-*-A' <-- master

-*-*-A  <-- origin/master

-*-*-A-B <-- fred/master

現在,如果您能夠將 A' 推送到 origin/master,這將創建非快進,那么它的歷史記錄中就不會包含 A。 因此,如果 Fred 再次嘗試 pull,他將突然不得不合並,並且會重新引入 A 提交:

-*-*-A' <-- master

-*-*-A  <-- origin/master

-*-*-A-B-\ 
    \     * <-- fred/master
     A'--/

如果 Fred 碰巧注意到了這一點,那么他可以進行 rebase,這將防止提交 A 再次出現。 但他必須注意這一點,並記住這樣做; 如果你有不止一個人把 A 拉下來,他們都必須 rebase 以避免在樹中獲得額外的 A 提交。

因此,更改其他人從中提取的存儲庫的歷史記錄通常不是一個好主意。 但是,如果您碰巧知道沒有其他人從該存儲庫中提取(例如,它是您自己的私有存儲庫,或者您只有一個可以輕松協調的其他開發人員在處理該項目),那么您可以強行通過運行更新:

git push -f

或者

git push origin +master

這些都將忽略對非快進推送的檢查,並將服務器上的內容更新為新的 A' 修訂版,放棄 A 修訂版,因此最終將被垃圾收集。

使用receive.denyNonFastForwards配置選項可能會完全禁用強制推送。 默認情況下,此選項在共享存儲庫上啟用。 在這種情況下,如果你真的,真的想強制推送,最好的選擇是刪除分支並重新創建它,使用git push origin :master; git push origin master:master git push origin :master; git push origin master:master 但是,由於denyNonFastForwards原因啟用了denyNonFastForwards選項,這在上面已經描述過; 在共享存儲庫上,這意味着現在使用它的每個人都需要確保他們重新建立新的歷史記錄。

在共享存儲庫中,通常最好將新提交推送到頂部以解決您遇到的任何問題; 您可以使用git revert生成將撤消先前提交更改的提交。

強制git push

git push origin +develop

你可能需要做一個git pull ,它可以為你自動合並東西。 然后你可以再次提交。 如果您有沖突,它會提示您解決它們。

請記住,如果您尚未更新 gitconfig 以指定要從哪個分支中提取,則必須指定...

例如:

git pull origin develop:develop

我正在使用 EGit,我也遇到了這個問題。 只是試圖rebase當前分支和它的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM