我有一个关于使用
repo切换分支的问题.我知道我可以签出这样的分支:
$repo init ... -b foo $repo sync
我的理解是,这将检查清单存储库的foo分支,然后检查清单中描述的git项目.
我也明白我可以像这样切换分支:
$repo init ... -b bar $repo sync -d
我的问题是,我可以切换分支而无需执行repo init&每次repo同步,这样做的含义是什么?
让我举个例子说明一下:
$repo init ... -b foo $repo sync -d $repo start foo-mytopic proj1 proj2 ... make some commits ... $repo upload -t $repo init ... -b bar $repo sync -d $repo start bar-topic proj1 proj3 $repo upload -t $cd proj1 $git checkout foo-mytopic # IS THIS ALLOWED?
我之前尝试过这个,它似乎工作,但它有点奇怪,因为我现在检查了foo清单中的代码,但我当前的清单分支是吧.与清单中描述的不同,在不同的分支上有什么含义?
注意:我读过this,我认为我的问题不同了.我知道如何切换分支.我对与当前清单中描述的分支不同的分支以及这可能如何影响我的工作流程的影响感兴趣.
解决方法
由于没有其他人能够回答这个问题,我做了更多的研究和实验.这是我发现的:
Tl; dr – 某些命令会做奇怪的事情.使用repo sync和repo start时要小心.尝试坚持使用普通的git命令. repo上传应该工作.
repo documentation表示回购同步相当于
$git fetch origin $git rebase origin/<BRANCH>
其中BRANCH是本地项目目录中当前已签出的分支.但是,根据我自己的经验,repo还会根据当前清单中的内容搞乱该分支的上游跟踪信息.
为了继续上面的例子,git checkout foo-mytopic实际上是允许的,并且会表现得恰到好处. Repo upload会将更改推送到foo-mytopic正在跟踪的分支(foo),但repo sync会更改上游跟踪信息.在这种情况下,最好手动运行git fetch origin和git rebase origin /< BRANCH>.
repo init描述的清单(和分支)在重新执行repo sync或repo start之前不会再次发挥作用.