【问题标题】:Difference between git checkout --track origin/branch and git checkout -b branch origin/branchgit checkout --track origin/branch 和 git checkout -b branch origin/branch 的区别
【发布时间】:2012-04-17 15:17:07
【问题描述】:

有人知道这两个切换和跟踪远程分支的命令之间的区别吗?

git checkout -b branch origin/branch
git checkout --track origin/branch

我认为两者都会跟踪远程分支,这样我就可以将我的更改推送到源分支,对吧?

有什么实际区别吗?

【问题讨论】:

    标签: git branch git-branch git-checkout


    【解决方案1】:

    这两个命令具有相同的效果(thanks to Robert Siemer’s answer for pointing it out)。

    实际区别在于使用名为不同的本地分支:

    • git checkout -b mybranch origin/abranch 将创建 mybranch 并跟踪 origin/abranch
    • git checkout --track origin/abranch 只会创建“abranch”,而不是具有不同名称的分支。

    (也就是说,as commented by Sebastian Graf,如果本地分支确实已经存在。
    如果是这样,您将需要git checkout -B abranch origin/abranch)


    注意:对于 Git 2.23(2019 年第三季度),这将使用 new command git switch

    git switch -c <branch> --track <remote>/<branch>
    

    如果分支存在于多个遥控器中,其中一个由 checkout.defaultRemote 配置变量命名,我们将使用该分支来消除歧义,即使 &lt;branch&gt; 在所有遥控器中不是唯一的。
    将其设置为例如checkout.defaultRemote=origin 如果&lt;branch&gt; 不明确但存在于“原点”远程上,则始终从那里签出远程分支。

    这里,“-c”是新的“-b”。


    首先,一些背景知识:跟踪意味着本地分支将其上游设置为远程分支:

    # git config branch.<branch-name>.remote origin
    # git config branch.<branch-name>.merge refs/heads/branch
    

    git checkout -b branch origin/branch 将:

    • 创建/重置branchorigin/branch 引用的点。
    • 创建分支branch(与git branch)并跟踪远程跟踪分支origin/branch

    当本地分支从远程跟踪分支启动时,Git 会设置分支(特别是 branch.&lt;name&gt;.remotebranch.&lt;name&gt;.merge 配置条目),以便 git pull 适当地从远程跟踪分支。
    可以通过全局 branch.autosetupmerge 配置标志更改此行为。可以使用 --track--no-track 选项覆盖该设置,稍后使用 git branch --set-upstream-to 进行更改。


    git checkout --track origin/branch 的作用与git branch --set-upstream-to 相同):

     # or, since 1.7.0
     git branch --set-upstream upstream/branch branch
     # or, since 1.8.0 (October 2012)
     git branch --set-upstream-to upstream/branch branch
     # the short version remains the same:
     git branch -u upstream/branch branch
    

    它还将为“branch”设置上游。

    (注意:git1.8.0 将弃用git branch --set-upstream 并将其替换为git branch -u|--set-upstream-to:参见git1.8.0-rc1 announce


    为本地分支注册一个上游分支将:

    • 告诉 git git statusgit branch -v 中显示两个分支之间的关系
    • 指示git pull不带参数在新分支签出时从上游拉取

    请参阅“How do you make an existing git branch track a remote branch?”了解更多信息。

    【讨论】:

    • @VonC 我一直在寻找你碰巧提到的那个小细节作为额外信息。就我而言,我很好奇为什么我的一些分支允许我git pull,而一些分支会要求从远程分支中提取。事实证明,如果您第一次检查您的对等创建的远程分支,git 会继续并将branch.&lt;BNAME&gt;.remote=origin 添加到本地 gitconfig。然后允许您发出git pull。但是,如果您是创建分支 git checkout -b BNAME 的人,那么 git -当然-不知道。所以你应该指定它的遥控器。
    • @batilc "事实证明,如果你第一次检查你的同伴创建的远程分支,";是的,阅读git-scm.com/docs/git-checkout,我看到:“If &lt;branch&gt; 未找到,但在一个远程(称为&lt;remote&gt;)中确实存在一个具有匹配名称的跟踪分支,视为等同于$ git checkout -b &lt;branch&gt; --track &lt;remote&gt;/&lt;branch&gt;”跨度>
    • @VonC 我为此找到了更好的配置。将branch.autoSetupMerge 设置为always 只是执行我们正在谈论的内容。此设置默认为true,这意味着仅在签出远程分支时才会执行跟踪。 true 不会为本地创建的分支设置跟踪。
    • @batilc 我同意。我倾向于不总是使用,因为我更喜欢明确设置跟踪,但在你的情况下,这应该是正确的设置。
    • "git branch --set-upstream-to branch upstream/branch" 不是正确的语法。它应该是:“git 分支 --set-upstream-to 上游/分支分支”
    【解决方案2】:

    完全没有区别!

    1) git checkout -b branch origin/branch

    如果没有--track--no-track,则默认--track。可以通过设置branch.autosetupmerge 更改默认值。

    实际上,1) 的行为类似于 git checkout -b branch --track origin/branch

    2)git checkout --track origin/branch

    “为方便起见”,没有-b--track 暗示-b 并且-b 的参数被猜测为“分支”。猜测是由配置变量remote.origin.fetch驱动的。

    实际上,2) 的行为类似于 git checkout -b branch --track origin/branch

    如您所见:没有区别。

    但它变得更好:

    3)git checkout branch

    也等价于git checkout -b branch --track origin/branch,如果“branch”尚不存在但“origin/branch”存在1


    所有三个命令都将“branch”的“upstream”设置为“origin/branch”(否则会失败)。

    上游被用作无参数git statusgit pushgit mergegit pull 的参考点(如果这样配置(默认或几乎默认))。

    例如git status 告诉你你落后或领先上游多远(如果已配置)。

    git push 配置为默认将当前分支推送到上游2 从 git 2.0 开始。

    1 ...如果“origin”是唯一具有“branch”的遥控器
    2默认(命名为“简单”)强制两个分支名称相等

    【讨论】:

      【解决方案3】:

      The book 似乎表明这些命令产生相同的效果:

      简单的例子就是你刚才看到的例子,运行 git checkout -b [分支] [远程名称]/[分支]。如果您有 Git 版本 1.6.2 或 稍后,您还可以使用 --track 简写:

      $ git checkout --track origin/serverfix 
      Branch serverfix set up to track remote branch serverfix from origin. 
      Switched to a new branch 'serverfix' 
      

      要建立一个名称与本地分支不同的本地分支 远程分支,您可以轻松地使用第一个版本与不同的 本地分支名称:

      $ git checkout -b sf origin/serverfix
      

      当您的 bash 或 oh-my-zsh git 完成能够为您提取 origin/serverfix 名称时,这特别方便 - 只需附加 --track(或 -t),您就可以使用了。

      【讨论】:

        【解决方案4】:

        您无法使用此命令创建新分支

        git checkout --track origin/branch
        

        如果您有未暂存的更改。

        示例如下:

        $ git status
        On branch master
        Your branch is up to date with 'origin/master'.
        
        Changes not staged for commit:
          (use "git add <file>..." to update what will be committed)
          (use "git checkout -- <file>..." to discard changes in working directory)
        
                modified:   src/App.js
        
        no changes added to commit (use "git add" and/or "git commit -a")
        
        // TRY TO CREATE:
        
        $ git checkout --track origin/new-branch
        fatal: 'origin/new-branch' is not a commit and a branch 'new-branch' cannot be created from it
        

        但是,您可以使用 git checkout -b 命令轻松创建具有未暂存更改的新分支:

        $ git checkout -b new-branch
        Switched to a new branch 'new-branch'
        M       src/App.js
        

        【讨论】:

        • 请记住,问题中的两个命令都用于跟踪现有的远程分支 (origin/branch)
        • @Green 您所做的测试是使用origin/new-branch 而不是origin/branch。你知道吗?
        猜你喜欢
        • 1970-01-01
        • 2011-12-20
        • 2020-03-05
        • 2015-10-03
        • 2017-12-07
        • 1970-01-01
        • 2018-08-31
        • 2021-04-14
        • 2017-08-19
        相关资源
        最近更新 更多