簡體   English   中英

“Git 推送非快進更新被拒絕”是什么意思?

[英]What does "Git push non-fast-forward updates were rejected" mean?

我正在使用 Git 來管理我的兩台計算機和我的開發。 我正在嘗試將更改提交到 GitHub,但出現此錯誤:

無法將某些引用推送到<repo> 為了防止您丟失歷史記錄,拒絕了非快進更新。 在再次推送之前合並遠程更改。

是什么原因造成的,我該如何解決?

編輯:

拉取回購協議返回以下內容:

*branch master->master(非快進)已經是最新的

推動仍然給我上述錯誤。

GitHub 有一個很好的部分叫做“ 處理“非快進”錯誤

這個錯誤一開始可能有點讓人不知所措,不要害怕。
簡而言之,git 無法在不丟失提交的情況下對遠程進行更改,因此它拒絕 push
通常這是由另一個用戶推送到同一分支引起的。 您可以通過獲取和合並遠程分支或使用 pull 同時執行這兩項來解決此問題。

在其他情況下,此錯誤是使用git commit --amendgit rebase等命令在本地進行破壞性更改的結果。
雖然您可以通過在push命令中添加--force來覆蓋遠程,但只有在您絕對確定這是您想要執行的操作時才應該這樣做。
強制推送可能會給已經獲取遠程分支的其他用戶帶來問題,被認為是不好的做法。 如有疑問,請不要強制推送


Git 不能像快進合並那樣在遠程進行更改, Visual Git 參考說明如下:

替代文字

這不完全是您的情況,但有助於了解“快進”是什么(分支的HEAD只是移動到新的最近提交)。


branch master->master (non-fast-forward) Already-up-to-date ”通常用於不跟蹤其遠程對應部分的本地分支機構。
例如,請參閱這個 SO 問題“ git pull 表示最新但 git push 拒絕非快進”。
或者兩個分支是相連的,但與各自的歷史不一致:
請參閱“ 永無止境的 GIT 故事 - 我在這里做錯了什么?

這意味着你的 subversion 分支和你的遠程 git master 分支在某些事情上不一致。
一些更改被推送/提交給一個不在另一個中的更改。
啟動gitk --all ,它應該會給你一個關於出了什么問題的線索——在歷史中尋找“叉子”。

這意味着有其他提交推送到遠程存儲庫與您的提交不同。 你通常可以用

git pull

在你推動之前

最終,“快進”意味着提交可以直接應用在工作樹的頂部,而無需合並。

快進更新是一側的唯一更改是在另一側的最近一次提交之后,因此不需要進行任何合並。 這就是說您需要先合並更改,然后才能推送。

在這種情況下,您可能希望對推操作使用力

git push origin master --force

永遠不要執行git -f來執行push因為它會導致以后的災難性后果。

您只需要對本地分支執行git pull

例如:

git pull origin 'your_local_branch'

然后做一個git push

對於完全相同的錯誤,我也不是唯一的開發人員。

所以我去提交並同時推送我的更改,在Commit對話框彈出的底部看到:

選中的選項:立即將更改推送到原點

...但我犯了一個巨大的錯誤,忘記點擊“ Fetch按鈕來查看我是否有最新的,而我沒有。

提交成功執行,但不是推送,而是給出了同樣提到的錯誤; ...即使其他開發人員沒有更改與我相同的文件,我也無法提取最新的文件,因為出現了相同的錯誤。

圖形用戶界面解決方案

大多數時候我更喜歡堅持使用 Sourcetree 的GUI(圖形用戶界面) 這個解決方案可能並不理想,但是這讓我重新開始工作,而不必擔心我可能會丟失我的更改或損害其他開發人員的最新更新。

第 1 步

右鍵單擊您之前的提交以撤消本地提交的更改,然后選擇將Reset current branch to this commit如下所示:

右鍵單擊提交並選擇的 Sourcetree 窗口:將當前分支重置為此提交

第 2 步

一旦所有加載微調器消失並且 Sourcetree 完成加載前一個提交,在窗口的左上角,單擊“ Pull按鈕...

突出顯示“拉”按鈕的 Sourcetree 窗口

...然后將出現一個對話框彈出窗口,然后單擊右下角的OK按鈕:

突出顯示“確定”按鈕的 Sourcetree 窗口對話框彈出

第 3 步

拉最新后,如果您沒有收到任何錯誤,請跳到第4步(下面的下一步)。 否則,如果您此時發現任何合並沖突,就像我對Web.config文件所做的那樣:

顯示錯誤提示的 Sourcetree 窗口:更新被拒絕,因為當前分支的尖端落后

...然后單擊頂部的Stash按鈕,將出現一個對話框彈出窗口,您需要編寫一個 Descriptive-name-of-your-changes,然后單擊OK按鈕:

帶有 Stash 按鈕的 Sourcetree 窗口突出顯示,彈出對話框顯示輸入以突出顯示 OK 按鈕命名您的 stash

...一旦 Sourcetree 完成存儲更改的文件,請重復步驟 2 中的操作(上面的上一步),然后您的本地文件將具有最新更改。 現在可以通過打開在STASHES底部看到的 STASHES 來重新應用您的更改,使用箭頭展開您的Apply Stash 'Descriptive-name-of-your-changes' ,然后右鍵單擊以選擇Apply Stash 'Descriptive-name-of-your-changes' ,然后選擇OK出現的對話框彈出窗口中的按鈕:

帶有 Stashes 部分的 Sourcetree 窗口已展開並右鍵單擊更改並突出顯示 Apply Stash

Sourcetree 對話框彈出窗口要求您確認是否要將您的本地副本存儲起來

如果您現在有任何合並沖突,請轉到您首選的文本編輯器,如 Visual Studio Code,並在受影響的文件中選擇Accept Incoming Change鏈接,然后保存:

在此處輸入圖片說明

然后回到 Sourcetree,點擊頂部的Commit按鈕:

在此處輸入圖片說明

然后右鍵單擊沖突的文件,並在Resolve Conflicts選擇Mark Resolved選項:

在此處輸入圖片說明

第 4 步

終於!!! 我們現在可以提交我們的文件,並且在單擊Commit按鈕之前選中Push changes immediately to origin選項:

在此處輸入圖片說明

PS 在寫這篇文章時,另一個開發人員在我提交之前提交了一個提交,所以不得不重復步驟。

如果您的遠程分支已更新並且未與您的本地存儲庫同步,也可能發生這種情況。 所以就我而言,我創建了一個 git repo 並添加了自述文件。 在我的本地機器上,我創建了要上傳到該存儲庫中的新文件,因此我嘗試像往常一樣推送。 在那之后,我確實執行了$git pull但它讓我變得fatal: refusing to merge unrelated histories錯誤(作為 bash 中的普通文本)。 我嘗試重新定位、重新分期和重新提交,但問題仍然沒有解決。 在這種情況下,我的目標是無論如何都要合並它,因為我想同時保留它們並且它們之間沒有任何公共文件。 因此,我通過如下傳遞參數來允許不相關的歷史記錄:

$git pull origin main --allow-unrelated-histories

此命令將合並 - 忽略兩者位於不同的頭部的事實。

然后使用: $git push -u origin main將其推送到 origin 分支

如果有人更擅長解釋這一點,請隨時編輯此答案。

在這里參考我的回答... Git 推送失敗,“非快進更新被拒絕”


解決這個問題最安全的方法是使用--rebase

例如

git pull <remote> <branch> --rebase

這可能會導致本地分支發生沖突,您需要手動修復它們。

解決所有沖突后,您可以使用--force-with-lease推送您的更改

例如

git push <remote> <branch> --force-with-lease

使用這個標志,Git 檢查分支的遠程版本是否與你變基的版本相同,即如果有人在你變基時推送了一個新的提交,推送將被拒絕,你將被迫再次對你的分支進行變基。

如果你正在處理一個每小時有數百次提交的大型項目,這會很煩人,但這仍然是解決這個問題的最佳方法。

避免使用--force除非你確切地知道你在做什么。

使用--force是破壞性的,因為它會無條件地用您在本地擁有的任何內容覆蓋遠程存儲庫。

但是使用--force-with-lease ,確保你不會覆蓋其他人的工作。

在 Atlassian 的開發人員博客中查看 有關這篇文章的更多信息。

在將更改推送到遠程 repo/fork 之前,您需要在conflicts locally合並和解決conflicts locally

1)拉(獲取和合並)

$ git pull remote branch 

2) 推送更改

$ git push remote branch 

您仍然可以使用--force選項快速選擇強制push ,但應該避免,因為它可能導致更改丟失或對其他貢獻者產生嚴重影響。

暫無
暫無

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

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