2017-05-24 34 views
2

我發現以下問題推我的GIT(到位桶)庫。爲什麼我不能在我的GIT存儲庫上推送此提交?錯誤:未能推動一些裁判給my_repo

如果我做混帳推我得到了以下錯誤消息:

$ git push 
fatal: You are not currently on a branch. 
To push the history leading to the current (detached HEAD) 
state now, use 

    git push origin HEAD:<name-of-remote-branch> 

於是,我就做混帳推起源主,但給我下面的錯誤消息:

$ git push origin master 
To https://bitbucket.org/AndreaNobiliProjects/glis-trigger.git 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to 'https://[email protected]/AndreaNobiliProjects/glis-trigger.git' 
hint: Updates were rejected because a pushed branch tip is behind its remote 
hint: counterpart. Check out this branch and integrate the remote changes 
hint: (e.g. 'git pull ...') before pushing again. 
hint: See the 'Note about fast-forwards' in 'git push --help' for details. 

可能是什麼問題?我怎樣才能解決它?

我解釋一下我以前做過獲得此錯誤消息:

  • 我試着把但我不能,因爲在倉庫有另一個人做了一些改動。
  • 我從倉庫拉,但是我不想用這些變化,所以我代替我與我的版本項目的內容(我已經拉之前做一個備份)。
  • 我承諾並再次推送,我正在獲取此錯誤。

我能做些什麼來解決這種情況呢?

回答

1

! [rejected] master -> master (non-fast-forward)

推由遠程儲存的掛鉤,因爲它不是一個快速向前推拒絕。本地主人和遠程主人分開。

重置本地主備份版本,然後運行git pull --rebase origin master。新的本地提交將重新發布到遠程主站的提示上。重建後,推動將是一個快速的推進。

+0

好的......我想了解......什麼是「快進推」?我該做什麼?從我所瞭解的我必須採取我的備份(我的代碼版本),然後執行「git pull --rebase origin master」。究竟在做什麼? – AndreaNobili

+0

這個rebase不可能產生預期的結果。這裏需要什麼,因爲樹已知處於目標狀態,更像是「重新裝修」;而不是通過'filter-branch'來完成這個工作,你可以使用類似我的答案中的程序爲master準備一個新的提交。 –

+0

@AndreaNobili推送實際上是將您的本地分支合併到遠程回購中的遠程目標分支。如果遠程目標分支的頭部是本地分支頭部的祖先,則推送將是快進合併。如果不是這兩個分支是分開的。假設本地分支是a-b-c-d,目標是a-b-c-e。 e不是d的祖先。通過'git pull --rebase',本地將成爲a-b-c-e-d'。現在e是d'的祖先。推動將是一個快速推進。快速合併和真正合並在'git merge --help'中解釋。 – ElpieKay

1

在你的你做了什麼導致了錯誤,什麼是缺失或不清晰的解釋。你處於分離的HEAD狀態,通常意味着你做了除分支名稱以外的其他東西。這很好,但它會是一個重要的細節(並且知道你做了什麼以及爲什麼可能會影響恢復步驟)。

如果你真的沒有檢出的,然後還有其他事情發生了以意想不到的方式改變了你的HEAD值。在恢復項目文件時,備份是否包含.git目錄(部分或全部)? (操作.git目錄而不是通過git命令是危險的業務。)

好吧,無論如何,第一個錯誤告訴我們你處於分離狀態。第二個錯誤告訴我們,你脫離的HEAD與主人分離。換句話說,在你當地的回購中,你有

X --- X --- X --- A <--(origin/master) 
      \ 
       B <--() 
        ^HEAD 

或類似的東西。現在,「推動主」意味着「讓origin/master指向這裏」。默認情況下,git的抵抗使origin/masterB,因爲那時A不再可達來自origin/master而以前。對於存儲庫的所有其他用戶而言,這是一種有效的上游重新分配(請參閱git rebase文檔https://git-scm.com/docs/git-rebase中的「從上游重新分配中恢復」)。

此安全功能可以被覆蓋,但我建議不要;這樣的決定應該由團隊謹慎決定,而且看起來好像你意外地發現自己處於這個位置。

相反,你應該瞄準因此像

X --- X --- X --- A --- B' <--(origin/master) 

如果B'恰好恢復所有的變化從A,這就是你和你的同事之間。那麼如何從這裏到達那裏?

好吧,假設你已經驗證了你的工作樹(項目目錄不含.git/目錄)看起來你想要的方式,你可以只攜帶了到大師。

git reset --mixed master 

將移動您的HEAD和索引狀態爲主,但保持您的工作樹狀態。

git add . 

將更新索引以匹配您的工作樹。 (您可以使用soft復位,而不是mixed復位後跟add,如果您已確認該指數相匹配你的工作樹 - 它有可能應該,但我要確保...)

git commit 
git branch -f master 

現在你應該能推,除非origin/master已在中期回升仍更多的提交。

0

看起來存在的detached HEAD上的提交應該作爲您本地master分支上的提交而存在。因此,您需要將更改從detached HEAD遷移到您的本地master分支,然後從遠程master分支中進行更改以更新本地主分支,最後,您可以將本地master分支推送到bitbucket。詳情如下:

#If you are still detached HEAD status 
git checkout -b temp 
git checkout master 
git merge temp 
git pull origin master -X ours #To keep the conflict files as local version, or you can use git pull origin master --rebase 
git push origin master 
相關問題