2012-05-18 77 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> 
相关问题