[英]What does "Git push non-fast-forward updates were rejected" mean?
我正在使用 Git 來管理我的兩台計算機和我的開發。 我正在嘗試將更改提交到 GitHub,但出現此錯誤:
無法將某些引用推送到
<repo>
。 為了防止您丟失歷史記錄,拒絕了非快進更新。 在再次推送之前合並遠程更改。
是什么原因造成的,我該如何解決?
編輯:
拉取回購協議返回以下內容:
*branch master->master(非快進)已經是最新的
推動仍然給我上述錯誤。
GitHub 有一個很好的部分叫做“ 處理“非快進”錯誤”
這個錯誤一開始可能有點讓人不知所措,不要害怕。
簡而言之,git 無法在不丟失提交的情況下對遠程進行更改,因此它拒絕 push 。
通常這是由另一個用戶推送到同一分支引起的。 您可以通過獲取和合並遠程分支或使用 pull 同時執行這兩項來解決此問題。在其他情況下,此錯誤是使用
git commit --amend
或git 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(圖形用戶界面) 。 這個解決方案可能並不理想,但是這讓我重新開始工作,而不必擔心我可能會丟失我的更改或損害其他開發人員的最新更新。
右鍵單擊您之前的提交以撤消本地提交的更改,然后選擇將Reset current branch to this commit
如下所示:
一旦所有加載微調器消失並且 Sourcetree 完成加載前一個提交,在窗口的左上角,單擊“ Pull
按鈕...
...然后將出現一個對話框彈出窗口,然后單擊右下角的OK
按鈕:
拉最新后,如果您沒有收到任何錯誤,請跳到第4步(下面的下一步)。 否則,如果您此時發現任何合並沖突,就像我對Web.config
文件所做的那樣:
...然后單擊頂部的Stash
按鈕,將出現一個對話框彈出窗口,您需要編寫一個 Descriptive-name-of-your-changes,然后單擊OK
按鈕:
...一旦 Sourcetree 完成存儲更改的文件,請重復步驟 2 中的操作(上面的上一步),然后您的本地文件將具有最新更改。 現在可以通過打開在STASHES
底部看到的 STASHES 來重新應用您的更改,使用箭頭展開您的Apply Stash 'Descriptive-name-of-your-changes'
,然后右鍵單擊以選擇Apply Stash 'Descriptive-name-of-your-changes'
,然后選擇OK
出現的對話框彈出窗口中的按鈕:
如果您現在有任何合並沖突,請轉到您首選的文本編輯器,如 Visual Studio Code,並在受影響的文件中選擇Accept Incoming Change
鏈接,然后保存:
然后回到 Sourcetree,點擊頂部的Commit
按鈕:
然后右鍵單擊沖突的文件,並在Resolve Conflicts
選擇Mark Resolved
選項:
終於!!! 我們現在可以提交我們的文件,並且在單擊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.