2015-05-20 59 views
2

關於這個問題有很多問題,但他們似乎都指的是什麼時候有遠程更改。對我來說並非如此。Git拒絕推送(在遠程對方後面)

$ git push repo master 
... 
hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. 

$ git fetch repo master 
$ git diff repo/master 
<single commit I've done locally> 

是,git pull讓我來推,但我需要做的更多或更少的每一次什麼是錯的。

編輯:

繼RUP的評論我檢查的樣子在gitk --all,它看起來像我的遠程分流了。所以,這很奇怪。

Image from gitk --all

檢查,看看我是否有本地提交:

$ git branch -r --contains 48673b311730fdfcf71b0e5776f6180c5173df42 
    origin/master 
$ git branch --contains 48673b311730fdfcf71b0e5776f6180c5173df42 

所以,顯然我有一個遠程提交,在回購只有我才能訪問,我沒有在本地有。我只用一臺電腦,那個提交不可能來自這臺電腦和我之外的任何地方。我很困惑。

編輯2: 因此,遵循Javabrett的答案,我冒險進入reflogs。

d022f6d [email protected]{144}: pull bt master: 
41a6f50 [email protected]{145}: pull bt master: checkout 41a6f50f7e3e96723f0d1c222205645d78a504db 
48673b3 [email protected]{146}: commit: Added commented out urls to .env 
14948e3 [email protected]{147}: rebase finished: returning to refs/heads/master 
14948e3 [email protected]{148}: pull bt master: checkout 14948e3c4dd014bb5af7293fdee6772a9e605b6f 

其中bt是共享回購。我最好的猜測是,我推到了我的私人回購站,但是從共享回購站下來,我將其重新分配到bt/master,並且原始提交「消失」。因爲歷史不會同步,所以再次推入私人會觸發拒絕。那對嗎?

+1

聽起來好像您的更改已被推送到遠程。 'git pull'應該快速前進。 – thirtythreeforty

+1

嘗試使用'gitk --all'來查看本地和遠程分支之間的確切關係 – Rup

+0

發佈本地和遠程最近提交的日誌。 – javabrett

回答

1

gitk看法是小了點,所以有點猜測這裏的,並且不包含提交哈希值或當前本地HEAD或提交下面的「刪除的廣告從主佈局「 - 這是一個帶評論的提交」添加了對.env的註釋「或完全不同的東西?無論哪種方式,它沒有提交散列48673b3

您的--contains測試是有幫助的。您還應該運行git refloggrep或搜索48673b3。當您的本地HEAD確實指向48673b3時,這可能會顯示您,以及之後或之後發生的情況。

最有可能的情況是,通過直接命令或某種工具,您已在本地存儲庫中重定位或壓扁或修改了提交remotes/origin/master。或者,也許你重置日期/時間或作者。 Git現在認爲這是一個獨立的發展路線 - 你永遠不應該重定位或擠壓你已經推到某個地方的提交,如果這是發生了什麼。

git reflog可能會顯示這樣的事情,例如:

20fa43d [email protected]{0}: commit (amend): Added commented out urls to .env 
48673b3 [email protected]{1}: commit: Added commented out urls to .env 
e039c6c [email protected]{2}: commit: Updated backend variables to new test server. 

如果是這樣,(修改),告訴你什麼地方錯了 - 你會重新編寫地方誌在這種情況下,你可以沒有更快速地推進這個分支。如果是這樣的話,你可以用一個變基修復它(也許做到這一點上的臨時支在前):

git rebase --onto origin/master origin/master 

根據您當地的歷史發生了什麼變化,你可能會得到一個合併衝突解決的在您的本地修改了提交。之後,您將重新編寫任何本地提交,以便它們同意遠程歷史記錄,並且您應該能夠執行快速前進。

問題編輯答案2更新:

用另一隻,上游遙控器上的信息,對底墊和引用日誌,這是相當清楚發生了什麼。

48673b3製成,被推到origin/master同樣的變化也包含在另一個承諾,無論其自身或混合與其他的變化,由您或其他人推到upstream/masterbt/master你)製成。當你從上游編輯git pull時,Git將創建一個合併提交。雖然它沒有顯示在reflog中,但是您先前已在[email protected]{148}/[email protected]{147}處重新拉出,因此可以合理地假設您在[email protected]{144}之後的某個時間再次嘗試返回線性歷史記錄,刪除合併提交。您運行git rebase而沒有--keep-empty,並且48673b3bt/master的頂部重播時,沒有任何操作,因此丟棄了提交,即rebase的默認行爲。

origin/master現在已經偏離您當地的回購協議,在最年輕的共同父協議之前提交了一個承諾48673b3,可能是14948e3。 Git不會允許你推動(沒有-f的力量) - 即使樹哈希可能相同,提交歷史已經發生了分歧。

對工作流程的一些建議:

1)如果你喜歡墊底和線性歷史有上合併的提交(不夠公平),然後一直堅持下去。運行git fetch ...git rebase ...,從不運行git pull(提取併合並)或git merge,或者如果必須,請使用--ff=only運行它們,以便它們只在本地沒有任何新提交時運行。考慮設置配置pull.ff=onlymerge.ff=only以強制執行此操作,以防在命令行中忘記它們。有了這個地方,除非你明確地說,否則,你永遠不會到達上游的非線性狀態,你總會被提醒到git rebase bt/master

這實際上並不能解決您的問題,但最好避免混合合併/重新綁定策略。如果您的策略是重新綁定,並且意外創建了合併,請重置爲最新的本地提交併重試。

2)如果您使用並推送到兩個遠程回購站,其中一個更改(上游),並且您正在重新定位,遲早您將遇到此問題並需要確定您的本地現在是「最新「和強制推送到您的私人origin/master。重新分配已經推送到遠程的分支最終總是會變得不穩定 - 重新分配(或擠壓或修改)是重寫歷史的方式,因此歷史將始終分歧。如果您僅僅使用origin/master作爲代碼的「只寫」遠程備份,那麼習慣於運行push -f來覆蓋它(當然,您需要知道這是正確的,否則您將失去提交),或者更好的是, push origin HEAD:'date -u +%Y%m%d%H%M%S``給你非矛盾的裁判,你可以稍後放棄。如果您將origin用於更復雜的事情,那麼您需要了解重新綁定到上游時會遇到的問題。

+0

雖然我不完全理解我的reflogs,但這個答案已經足夠接受了。我意識到它與重新定義有關,這並不意外。隨意評論我的第二次編輯。 – Frans

+0

夢幻般的答案,謝謝! – Frans

1

也許你可以試着用rebase選項來拉動。

git pull --rebase origin master 

比:

git push 
+0

昨天其實已經試過了,但是我不清楚爲什麼這會有所作爲。 – Frans

+0

看看這個參考:http://gitready.com/advanced/2009/02/11/pull-with-rebase.html – teoreda