Git 如何使新的本地分支跟踪与本地分支相同的远程分支it';它是从哪里创建的?

Git 如何使新的本地分支跟踪与本地分支相同的远程分支it';它是从哪里创建的?,git,Git,短版: 我想从本地分支(a)创建一个本地分支(B),并使其跟踪(a)正在跟踪的同一个远程分支。我怎么能在一个命令中做到这一点?有没有办法将此行为设置为默认行为 完整解释: 我最近已经从使用git svn转换为“纯”git。我的工作流程中有一个方面非常令人沮丧,我正试图找到一种恢复该工作流程的方法。以下是git svn的情况: 创建跟踪远程分支(X)的新本地分支(a) 做一些工作,做一些本地提交 git svn rebase——A被重设到X的头部 做一些工作,做一些本地提交 有一个分支的想法,从

短版:

我想从本地分支(a)创建一个本地分支(B),并使其跟踪(a)正在跟踪的同一个远程分支。我怎么能在一个命令中做到这一点?有没有办法将此行为设置为默认行为

完整解释:

我最近已经从使用git svn转换为“纯”git。我的工作流程中有一个方面非常令人沮丧,我正试图找到一种恢复该工作流程的方法。以下是git svn的情况:

  • 创建跟踪远程分支(X)的新本地分支(a)
  • 做一些工作,做一些本地提交
  • git svn rebase
    ——A被重设到X的头部
  • 做一些工作,做一些本地提交
  • 有一个分支的想法,从(a)中创建一个新的本地分支(B)
  • 做一些工作,做一些本地提交
  • git svn rebase
    --B被重设到X的头部
  • 等等
在纯git的世界中,我遇到的问题是,(A)跟踪远程分支,(B)不继承该分支。我知道我可以通过执行
git-branch--set-upstream(B)(X)
显式地设置它。我正在寻找的是一种自动继承这种跟踪行为的方法,因此我不必记住要这样做,然后当我的
git pull--rebase
在(B)上不起作用时,我会感到非常沮丧

我意识到这个问题在于它可能会失去从(A)中产生的(B)的传统。我只是不在乎


有什么想法吗?

您正在尝试将集中式工作流应用于分布式系统。你需要考虑在本地做事情,而不是集中做。共享(中心)存储库只是一个放置您想要与他人共享的内容或检索他们想要共享的内容的地方

这基本上就是你想要的。然而,我不认为这是最好的工作流程。请参阅下面的修改版本

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
当然,这两种情况都取决于这样一个事实:在将origin/master重定为idea分支之前,您没有在本地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)

最简单的解决方案,但可能是部分解决方案,就是:

git checkout -b B <remote>/X
git merge A
git签出-b b/X
git合并A
如果您在需要B之前已经将A推回X,则不需要第二步。基于遥控器签出B将自动设置跟踪

关于一个步骤:

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

将ol'
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分支更痛苦-vvv有太多的上下文,为什么人们喜欢把简单的问题变成复杂的问题?。我大概可以用一句话来问。“我如何使我的本地分支永久跟踪远程分支?”除了“我如何使我的本地分支永久跟踪远程分支?”这显然不是我要问的问题。“我想从本地分支a创建分支B,并使其跟踪a正在跟踪的同一远程分支。我怎么能在一个命令中做到这一点?我有没有办法将此行为设置为默认行为?”.Better?Edited.FWIW,这个可以说是冗长的解释先发制人地转移了“你到底为什么要这样做?”/“你到底想在这里做什么?”?“通过解释我真正想做的事情,特别是为什么我想做来回答。我所在的团队使用git和一个集中的工作流。需要及时了解其他人推动的“共享”回购协议的最新情况每天都会发生多次。您的建议:
git-rebase-origin/master
有效,但它要求我知道并键入“origin/master”,这正是我不想做的。我希望分支(B)是(a)正在跟踪的同一远程设备的跟踪分支。我已将
branch.autosetuprebase设置为yes,因此在分支正在跟踪的情况下,我只需键入
git pull
,就可以开始了。我的问题是确保默认情况下所有分支都在跟踪。如果你不想知道或键入“origin/master”,那么我认为你只会伤害你自己。如果您打算像SVN一样使用git,那么最好还是回到SVN,因为这会让您的团队感到舒适。git的强大之处在于理解诸如origin/master之类的概念以及如何利用它。由于git的工作方式,您可以安全地执行更复杂的操作。但是,如果你不想知道这些,那就没有什么意义了——也许你会坚持使用subversion。但是为了回答你的具体问题,我认为没有办法让git自动设置跟踪分支,跟踪分支指向创建新分支之前创建本地分支的远程分支。通常,跟踪分支指向远程服务器上的相同分支。如果你想让他们指向不同的东西,你必须明确地告诉git。当然,你必须记住,你的idea分支并不是指向遥控器上的idea,而是指向遥控器上的“A”。我已经使用git svn好几年了。我非常熟悉git在本地的工作方式。问题不在于缺少知识
#/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