2011-02-28 83 views
22

我們正在使用我們所有人使用的單個遠程存儲庫的模型。我們爲新功能分支並重新集成到主幹分支。我們的工作流程是當其他功能集成到中繼線時,我們應該從中繼線集成到我們的工作分支中。如何在git中快速轉發其他跟蹤分支?

因此,它並不少見,我們做:

(branch) $ git commit -a -m"blah blah blah" 
(branch) $ git fetch # origin/trunk is updated 
(branch) $ git checkout trunk 
(trunk) $ git pull # trunk is fast-forwarded to current version of origin/trunk. 
(trunk) $ git checkout branch 
(branch) $ git merge trunk 
(branch) $ git push 

我不喜歡「混帳結賬主幹/ git的拉/ git的結帳分支」的怪圈。它通常與Visual Studio結合,抱怨說我的所有文件和項目都在磁盤上發生了變化,並且它應該重新加載它們。兩個結帳。和拉。併合並。合併是不可避免的,但由於git的工作原理,它應該能夠在trunk上快速轉發,而不需要檢查它。

但我不知道這個命令,而且我的google-foo在這方面失敗了。任何人都知道嗎?

回答

19

你真的需要更新本地trunk分支嗎?

只需fetch origin/trunkmerge它直接在您正在處理的分支中。
那就是Mark Longair的建議:git: fetch and merge, don’t pull


Oliver提到了his answer(upvoted):

git fetch upstream trunk:trunk 

由於he comments

你可以跳過合併和簡單的快進,用一個班輪。

它確實將本地分支trunk快速轉發到遠程分支的HEAD。

多見於「git: update a local branch without checking it out?

+7

:)我不得不說,我稍微嚇壞了,你發生在答覆都提到了該職位(謝謝!),以它的名字命名的第一行中提到用戶... – 2011-02-28 21:28:27

+1

所以,你的建議是做「git merge origin/trunk」而不是checkout/pull/checkout/merge dance?我會在下一次出現時嘗試。 – 2011-02-28 21:39:29

+2

使用'git fetch upstream upstream trunk:trunk',你可以跳過合併,簡單地快進,使用單線程。請參閱[我的答案](http://stackoverflow.com/a/21601318/177710)。 – Oliver 2014-05-13 15:36:12

-2

嘗試以下操作:

$ git pull trunk branch 
+0

我收到一個錯誤,告訴我「trunk」不是存儲庫。然後 – 2011-02-28 21:37:05

+0

第一結賬分支做混帳混帳拉://foo.com/someone/bar.git樹幹 – Pablitorun 2011-02-28 21:53:53

+0

SLL我的意思是,你應該能夠做T他只需一個步驟上拉,但如上面提到的有些人認爲這ISN最好的主意。 – Pablitorun 2011-02-28 21:55:50

8

VonC's answer同意,但認爲它可能是有趣的回答這個問題:「你怎麼快進master如果您'在另一個分支上?「無論如何。我不認爲有辦法做到這一點只用瓷的命令,但該腳本做這項工作(很明顯,你會希望你的情況來改變mastertrunk):

#!/bin/sh 

BRANCH=master 
NEWER=origin/master 

if [ x"$(git symbolic-ref HEAD)" = x"refs/heads/$BRANCH" ] 
then 
    echo "This doesn't make sense if you're already on the branch '$BRANCH'" 
    echo "Just run: git merge $NEWER" 
    exit 1 
fi 

BRANCH_HASH=$(git rev-parse $BRANCH) 
NEWER_HASH=$(git rev-parse $NEWER) 
MERGE_BASE=$(git merge-base $BRANCH_HASH $NEWER_HASH) 

if [ "$MERGE_BASE" = "$BRANCH_HASH" ] 
then 
    git update-ref "refs/heads/$BRANCH" "$NEWER_HASH" "$BRANCH_HASH" 
else 
    echo "$BRANCH can't be fast-forwarded to $NEWER" 
    exit 1 
fi 

更新2012-10 -20:這個腳本只是一個簡單的例子;對於執行相同操作的腳本,只要將任意commit-ish合併到本地分支(只要合併是快進)即可,請參見Jefromi's answer to a similar question

+0

我想用來做非常相似,這個混帳東西,但是當我在源檢查git-pull.sh我沒有看到它仍然沒有任何表示。 – Arrowmaster 2011-02-28 23:43:05

+0

我剛剛使用這個腳本 - 感謝提示!我很驚訝,但這並沒有被構建到'git-merge'中。你會認爲這是一個很常見的用例。 – mattjgalloway 2012-07-05 17:19:37

+1

你可以用'git的分支-f主產地/ master'的做到這一點,但你不希望:如果它不是一個快進合併就會失去提交和衝突。 – Christopher 2012-08-15 15:40:27

27

我覺得最簡單辦法避免git checkout trunkgit pullgit checkout branch週期是使用this answer

git fetch upstream trunk:trunk 

這不正是你想要的東西 - 你的本地分支trunk快速轉發到遠程分支的頭。

+3

對於不熟悉通用「上游」術語的初學者,「git fetch origin trunk:trunk」。 – pdem 2017-01-05 14:49:30