2012-05-18 227 views
0

短版本:如何使新的本地分支跟蹤創建的本地分支所在的同一個遠程分支?

我想創建從本地分支(A)的本地分支(B),並使其追蹤同一個遠程分支(A)被跟蹤。我怎麼能用一個命令做到這一點?有沒有什麼辦法可以將此行爲設置爲默認值?

充分的解釋:

我是最近纔開始使用Git svn涉及到 「純」 混帳轉換。我的工作流程有一個方面令人非常沮喪,我試圖找出恢復該工作流程的方法。這是怎麼回事用git-SVN:

  • 創建跟蹤遠程分支(X)
  • 做了一些工作新的本地分行(A),使一些地方的提交。
  • git svn rebase - A重新設置爲X的頭部
  • 做一些工作,進行一些本地提交。
  • 有一個分支的想法,從(A)
  • 做一個新的本地分支(B)做一些工作,做一些本地提交。
  • git svn rebase - B被衍合到X

在純GIT中世界的HEAD,我遇到的問題是,雖然(A)將跟蹤遠程分支,( B)不會繼承那個。我知道我可以通過做git branch --set-upstream (B) (X)明確地設置它。我正在尋找的是這種跟蹤行爲自動繼承的方式,所以我不必記住這樣做,然後當我的git pull --rebase在(B)上不起作用時會感到沮喪。我認識到這個問題是因爲它可能會失去(B)從(A)中產生的遺產。我只是不在乎這一點。

任何想法?

+0

太多的背景下,爲什麼人們喜歡把簡單的問題變成複雜的問題?我大概可以用一句話來提問。 「我如何讓我的本地分支永久跟蹤遠程分支?」 – KurzedMetal

+0

除了「我怎樣才能讓我的本地分支永久跟蹤遠程分支?」顯然不是我問的。 – ipmcc

+0

「我想從本地分支A創建一個分支B,並使它跟蹤A正在跟蹤的同一個遠程分支。我怎麼能在一個命令中做到這一點?有什麼辦法可以將此行爲設置爲默認值?」。更好? – KurzedMetal

回答

0

拿了出來醇」 bash & perl腳本的魔力,並炮製了這個解決方案,拖放到一個名爲my-new-branch腳本:

#/bin/bash 
REMOTETRACKINGBRANCH=`git branch -vvv | perl -ne '/^\*[^\[]*\[[^:\]]+[:\]]+.*$/ && s/^\*[^\[]*\[([^:\]]+)[:\]]+.*$/\1/ && print;'` 
if [ -z "$REMOTETRACKINGBRANCH" ]; 
then 
    echo "ERROR: No remote tracking branch." 1>&2 
    exit 1 
else 
    git checkout -b $1 && git branch --set-upstream $1 $REMOTETRACKINGBRANCH 
fi 

我確定這可能更簡短,但我厭倦了與逃脫正則表達式的shell戰鬥,並且使用Perl強制它使用它。

這將是很好,如果有一個更容易解析(更不可能更改爲git轉)更多的管道方法來辨別遠程跟蹤分支,但AFAICT配置文件是權威的那位信息和解析看起來更像是一個痛苦,而不是解析git branch -vvv

0

您正嘗試將集中式工作流應用於分佈式系統。你需要考慮在本地做事情,而不是集中做事。共享(中央)存儲庫就是您將想要與他人分享的內容,或者檢索他們想要共享的內容的地方。

這裏基本上是你要求的。但是,我不認爲這是最好的工作流程。請參閱下面的修改版本。

Create a new local branch (A) that tracks a remote branch (X) 
    git clone <url> my_repo 
Do some work, make some local commits. 
    work, work work 
    git add . 
    git commit -m "commit of work" 

A is rebased up to the HEAD of X. We're operating on the same branch 
we want to rebase from the remote, so we can do it all with one command in 
this case. 
    git pull --rebase 

Do some work, make some local commits. 
    work, work work 
    git add . 
    git commit -m "commit of work" 

Have an offshoot idea, make a new local branch (B) from (A) 
    git checkout -b idea 

Do some work, make some local commits. 
    work, work work 
    git add . 
    git commit -m "commit of work" 

B is rebased up to the HEAD of X 

    git rebase origin master 

但是......整個工作流程都圍繞着遙控器作爲「真相的源泉」。做這件事的方式越多,恕我直言就是把你的本地視爲真相的來源,並用中央資源庫中的共享內容來更新它。這是一回事,只是從另一個角度接近它。

以下是我願意做你的工作流程:

創建跟蹤遠程分支(X) 混帳克隆my_repo 做了一些工作新的本地分行(A),使一些地方的提交。 工作,工作工作 git add。 git的承諾-m「提交作品」

A is rebased up to the HEAD of X. We use two commands here, but doing 
it this way makes it easy for me to view the differences before 
doing the rebase, if I choose. 
    git fetch 
    git rebase origin/master 

Do some work, make some local commits. 
    work, work work 
    git add . 
    git commit -m "commit of work" 

Have an offshoot idea, make a new local branch (B) from (A) 
    git checkout -b idea 

Do some work, make some local commits. 
    work, work work 
    git add . 
    git commit -m "commit of work" 

B is rebased up to the HEAD of X 

    git fetch 
    git rebase origin/master 

當然這兩種方案的取決於你沒有」做基礎重建產地/掌握到你的想法分支之前您的本地master分支額外工作的事實。如果你沒有,你不會有你做了主本地提交,它會更有效地做到:

git fetch 
git checkout master 
git rebase origin/master --(make sure master is up-to-date locally) 
git checkout idea 
git rebase master (apply idea on top of the updated local master) 
+0

我正在使用的團隊使用git和中央工作流程。需要了解其他人推到「共享」回購庫的內容,而且每天都會發生多次。你的建議:'git rebase origin/master'起作用,但它要求我知道並鍵入「origin/master」,這正是我不想做的。我希望分支(B)成爲(A)跟蹤的同一遙控器的跟蹤分支。我將'branch.autosetuprebase'設置爲yes,所以在分支正在跟蹤的情況下,我只需輸入'git pull',我就可以走了。我的問題是關於確保所有分支都默認跟蹤。 – ipmcc

+0

如果你不想知道或輸入「origin/master」,那麼在我看來你只會傷害你自己。如果你打算像SVN一樣使用git,那麼最好還是回到SVN,因爲這是你的團隊舒適的原因。 git的力量在於理解起源/主人等概念以及如何利用它。由於git做事情的方式,你可以做更復雜的操作並安全地執行。但是如果你不想知道這些,那麼沒有多少意義 - 可能會堅持顛覆。 – wadesworld

+0

但是,爲了回答你的具體問題,我不認爲有一種方法可以讓git自動設置跟蹤分支,這些分支指向創建新分支之前創建本地分支的遠程分支。通常跟蹤分支指向遠程的相同分支。如果你想讓它們指向不同的東西,你將不得不明確告訴git。當然,你必須記住,你的想法分支並不指向遠程的想法,它指向遠程的「A」。 – wadesworld

0

好,最簡單的解決方案,但可能是部分解決方案,是剛剛做:

git checkout -b B <remote>/X 
git merge A 

:如果你已經被推需要B.基於遠程設置自動跟蹤檢查出B之前一回X不需要第二個步驟。

至於一步:

function myGitCo() { git checkout -b $1 $3; git merge $2 } # <smiley> 
相關問題