如何使用 git 设置分支的多个跟踪级别

How to setup multiple tracking levels of branchs with git

我有一个 git 跟踪远程 svn 主干的本地分支。

我新建了一个开发分支,设置本地分支跟踪

我希望开发分支也会跟踪 svn/trunk 类似于:

from:
local branch > development branch

to:
local branch > development branch > svn/trunk

可以用git吗?

我正在使用 git 版本 2.14.3

git GUI - 智能git v18.1

不,这在 Git 中是不可能的。但这也不是那么重要(真的!),因为 tracking a branch in Git 只是意味着一个分支将另一个设置为它的 upstream:

git branch --set-upstream-to=desired-upstream my-branch

您的每个分支随时都可以最多一个 上游。当您的分支 确实 有上游时,会发生以下情况:

  • git fetch 没有参数知道哪个其他 Git 存储库可能包含要获取的提交。因此你可以 运行 git fetch 而不是 git 获取 <em>remote</em>.

    但是,如果您只有一个名为 origin 的遥控器,这很常见,这并不能真正给您带来任何好处,因为没有参数的 git fetch 将从 origin 获取,如果它没有比上游更好的了。换句话说,git fetch 已经从(单个)正确的远程获取。所以在这里有一个上游并没有给你带来任何东西。

  • git mergegit rebase 运行 没有附加参数会自动知道要使用哪个远程跟踪名称。这 确实 给你买了东西,但如果你想有两个上游,你仍然必须告诉 git mergegit rebase 使用哪个 upstream,因此必须键入 git merge fred/xyzzygit merge giselle/xyzzy 并没有那么糟糕。事实上,它可能更好:git merge upstream1git merge upstream2 更短,但 fred/xyzzy 是上游 #1,还是上游 #2?为什么不用更容易记住的名字?

  • 和上面的其他两个一样,git pull—只是运行s其他两个,先取一个,然后取其中一个其他两个命令——也知道默认使用什么。我建议大多数 Git 用户 避免 git pull 因为它是一个方便的命令,但在最坏的时候往往会带来不便。如果你避免 git pull,让它知道事情根本不会给你带来任何好处。

  • 默认的 git push 行为,使用 simple 的标准 push.default 设置更好。这个 确实 给你买了一些东西,但你可能应该只推送到另一个 Git 存储库,所以你可以选择那个特定的其他 Git 存储库作为 (单)上游分支。

  • 最后,git status 命令(其他一些 Git 命令 运行,或 运行 的一部分)变得更加有用,告诉你您在所选上游之前和之后有多少次提交。这也包括 git branch -v。我发现这具有重要价值。

幸运的是,有一种简单的方法可以从命令行获取相同的信息,您可以创建一个别名或脚本来为您执行此操作。当 git status 表示您“领先 1”时 and/or “落后 3”,它 运行 相当于:

git rev-list --count --left-right <local-name>...<upstream-name>

例如,分支 stash-exp 的上游是 origin/master,我可以 运行:

git rev-list --count --left-right stash-exp...origin/master

并得到相同的两个数字(作为原始数字):第一个是“领先”计数,第二个是“落后”计数。注意这里的三个.;此命令和选项的这种形式需要全部三个,而大多数命令大多使用双点语法。

总而言之,设置一个上游,以便某个本地分支名称跟踪某个远程跟踪名称或其他某个本地分支名称,具有非常低的成本(一个命令)和一些明显的好处,所以你应该在有意义的时候去做。但是好处并不大到需要有一个以上的上游。