2011-05-11 269 views
44

我沒有得到git rebase origingit rebase origin/master之間的差異。在我的情況下,我克隆了一個git倉庫兩次。在第一個克隆中,我必須使用git rebase origin,而在另一個克隆中,我必須使用git rebase origin/master「git rebase origin」與「git rebase origin/master」

一個例子:http://paste.dennis-boldt.de/2011/05/11/git-rebase

+0

你能提供更多關於你在做什麼的信息嗎? 'git rebase origin'應該不起作用,因爲'origin'是一個遠程而不是分支(至少默認情況下,你可以命名一個分支源。) – asm 2011-05-11 11:43:27

+0

我在我的問題中增加了一個例子。一旦我能夠使用'git rebase origin'(第27行)。在另一個克隆它不工作(第54行),所以我必須使用'git rebase origin/master'(第57行) – Dennis 2011-05-11 12:23:35

+0

這兩個表單都使用[gitrevisions](https://www.kernel.org/pub/)軟件/ scm/git/docs/gitrevisions.html)語法來命名特定的提交。正如手冊頁所指出的,「origin」意思是「實際上」,無論哪個「origin/*」分支由「origin/HEAD」命名。最常見的是'origin/HEAD'命名'origin/master'(這顯示在'git branch -r'輸出中,作爲'origin/HEAD-> origin/master')。如果'origin/HEAD' *失蹤*,您只會得到一個錯誤(如@Dennis所做的那樣)。如果你是「遠程設置頭部」(如同在接受的答案中那樣),你可以選擇'origin/HEAD'的解析方式。 – torek 2017-03-06 04:57:11

回答

19

這裏有一個更好的選擇:

git remote set-head -a origin 

從文檔:

使用-a,查詢遠程以確定其HEAD,然後$ GIT_DIR/remotes // HEAD被設置爲同一分支。例如,如果遠程HEAD指向下一個,則「git remote set-head origin -a」將把$ GIT_DIR/refs/remotes/origin/HEAD設置爲refs/remotes/origin/next。這隻有在refs/remotes/origin/next已經存在時纔有效;如果不是,它必須先取得。

這實際上已經有相當長的一段時間了(從v1.6.3開始);不知道我錯過了它!

+3

我從來沒有回答過:現在我用了很多,而且工作得很好! – Dennis 2013-10-12 11:34:33

+0

當我嘗試'git rebase origin'時,我看到錯誤'invalid upstream origin'。運行這個命令解決了我的問題。 – DrStrangepork 2014-11-13 18:39:28

48

git rebase origin意味着「從origin跟蹤分支衍合」,而git rebase origin/master的意思是「從分支的originmaster變基」

你必須有一個跟蹤分支~/Desktop/test,其中意味着git rebase origin知道origin的哪個分支將與之分開。如果沒有跟蹤分支存在(在~/Desktop/fallstudie的情況下),git不知道它必須採用哪個分支origin,並且失敗。

爲了解決這個問題,可以使現有的master分支軌跡origin/master

git branch --set-upstream master origin/master 
+0

其實我找到了唯一的區別:'test'另外有'remotes/origin/HEAD'。所以,你是對的。我如何將這個添加到克隆'fallstudie'? http://paste.dennis-boldt.de/2011/05/11/git-branch – Dennis 2011-05-11 13:08:47

+0

'git branch --set-upstream master origin/master' – CharlesB 2011-05-11 13:11:47

+0

這不是解決方案。該錯誤仍然是'無效的上游原點',並且仍然只有一個原點分支。 – Dennis 2011-05-11 13:33:37

2

你可以用名稱爲「HEAD」 [git的\裁判\遙控器\起源]下一個新的文件,並把內容「ref:refs/remotes/origin/master」。這應該可以解決你的問題。

看來,從空回購克隆將導致此。也許空的回購沒有HEAD,因爲沒有提交對象存在。

可以使用

git的日誌--remotes --branches --oneline --decorate

看到每個庫之間的區別,而 「問題」 一不有「原產地/ HEAD」

編輯:給出一個使用命令行的方式
你也可以使用git命令行來做到這一點,他們有相同的結果

git的象徵-REF參/遙控器/產地/ HEAD參/遙控器/產地/主

+0

正確,看起來就是這樣。有了這個額外的文件,我得到了錯過的HEAD分支。我在我的Linux系統上做過:'echo「ref:refs/remotes/origin/master」> .git/refs/remotes/origin/HEAD'。感謝冬天。 – Dennis 2011-05-11 15:17:42

+1

@丹尼斯:這裏的結論是'origin'意思是'origin/HEAD',但是git對於確定原點的HEAD有點不確定。遠程協議實際上並不允許傳輸符號引用,因此當您克隆時,它會有效地向遠程發送HEAD的SHA1,然後指出ref也指向該提交。 (如果有多個,它會首先選擇主人。)而遠程更新等實際上並不會觸及遙控器的頭部,所以如果您在克隆時沒有得到它,則會被卡住。 – Cascabel 2011-05-12 03:22:37

+0

@Jefromi:我意識到git是有問題的。謝謝你的解釋。 – Dennis 2011-05-12 11:09:31