这是我对跟踪git分支的理解,如果我在这里遗漏了某些内容,请纠正我。要跟踪远程分支,首先运行git fetch origin
,它会带来远程git存储库的副本映像。假设您列出要为mybranch
创建定位分支的分支,您只需运行git branch mybranch
然后git将自动创建一个远程分支并使其跟踪相应的(名称相关)远程科。非常简单!
问题是,为什么大多数git人都会讨论选项--track
如果git能够识别你刚刚创建的分支(基于名称相关性)在origin
或远程存储库中可用?
答案 0 :(得分:3)
还有一些其他细节不太正确,但关键在于:
您只需运行
git branch mybranch
,然后git将...使其跟踪相应的(名称相关性)远程分支
当您使用git branch mybranch
创建分支时,不会这样做。如果你运行git branch mybranch origin/mybranch
,那么 这样做,至少在默认情况下是这样做的。
如果你使用git branch mybranch
,Git会根据当前的提交哈希创建mybranch
,就好像你已经完成了一样:
git branch mybranch $(git rev-parse HEAD)
,命名远程跟踪分支时的默认行为由branch.autoSetupMerge
中的配置设置控制。
git checkout
命令有时(但不总是)使用隐含的--track
和远程跟踪分支创建新分支。具体来说,给定git checkout name
,有许多可选路径,具体取决于是否可以解析 name
:
name
是现有分支的名称:git checkout
尝试切换到现有分支。name
是现有代码的名称,或通过the gitrevisions documentation中描述的多步骤过程解析为提交:git checkout
尝试将该特定提交检查为独立的HEAD。name
不以上任何一项,但只有一个远程跟踪分支,如果被剥离它的远程匹配 name
(例如,当没有git checkout develop
但是有develop
时,您输入origin/develop
):在这种情况下, Git将创建一个新的分支develop
,用于跟踪" (具有上游)origin/develop
,就像git branch
具有适当的参数和适当的branch.autoSetupMerge
和/或branch.autoSetupRebase
设置一样。如果上述所有操作都失败,git checkout
会尝试将 name
解释为路径名。您可以使用git checkout
选项 - 终止符强制--
跳过上述步骤(并直接进行路径名解释):git checkout -- master
表示签出文件名为master
,而不是分支。
答案 1 :(得分:1)
您提到的自动跟踪是一种方便的“速记”,但它并不总是有效。
有时候有多个具有相同分支名称的遥控器;在这种情况下,git不知道要跟踪哪一个,也不会自动设置跟踪信息。
此外,有时您希望本地分支跟踪不具有相同名称的远程分支。
我想,有些开发人员可能永远不需要明确设置跟踪信息;但有些人这样做,所以你可以。