糟糕的git pull会创建无效的远程跟踪分支

时间:2012-03-02 21:04:17

标签: git git-pull git-extensions git-remote

在我的工作场所,我们在使用Source Safe(yay!)超过10年后,才转向Git进行版本控制。我现在必须支持我们的工程师学习新工具。值得注意的是,我们都在Windows下使用GitExtensions UI。

一些同事做了以下(来自用户界面):

  • 克隆中央存储库( origin
  • 根据主开发分支
  • 创建新的本地分支( A
  • A 分支
  • 上创建提交
  • 虽然仍然检查了 A 分支,但他们(错误地)将主开发分支拉入其 A 分支< / LI>

以下是当我们进行拉动时GitExtensions的UI看起来像什么(我很遗憾无法从工作中发布屏幕抓取):

  

拉出:原产地

     

本地分支: A

     

远程分支:开发

     

合并选项:将远程分支合并到当前分支

     

(然后按下拉按钮)

以下是GitExtensions的命令日志显示它为pull做的事情:

git pull --progress "origin" +refs/heads/develop:refs/remotes/origin/A

在该命令之后,用户看到他们的历史记录中出现了一个新的 origin / A 远程跟踪分支,而我们确认原点上没有分支 A

我查看了git pull手册,试着了解发生了什么,但是我仍然无法理解我们所看到的是GitExtensions错误还是我们对git pull应该做什么的误解。

任何人都可以帮我弄清楚这里发生了什么?

提前致谢

修改

我知道将远程开发分支拉入本地 A 分支是没有意义的,我知道如何通过删除远程跟踪分支来解决这种情况。我真正想要的是理解首先创建的 origin / A 远程跟踪分支背后的逻辑,因为在原点上没有 A 分支。

由于

2 个答案:

答案 0 :(得分:2)

很难说这是否是GitExtensions错误。在企业环境中,除了具有相同名称的远程分支之外,引入其他任何东西都是非常不寻常的(几乎总是一个错误),所以我对你得到奇怪的结果并不感到惊讶。 (我认为永远使用git pull是错误的,因为它的设计很可怕,但这是另一个故事。)

+refs/heads/develop:refs/remotes/origin/A部分称为refspec(参考规范)。它表示使名为refs/remotes/origin/A(缩写为origin/A)的本地目标reference指向远程存储库的refs/heads/develop引用(develop分支的相同提交在远程存储库中)当前指向。开头的加号(+)表示即使目标引用不能为源引用fast-forwarded,也强制引用匹配。

因此,您提到的pull命令导致Git:

  1. 弄清楚远程存储库的develop分支指向
  2. 的提交
  3. 下载该提交及其祖先从远程存储库提交(本地存储库中已有的东西除外)
  4. 强制本地refs/remotes/origin/A引用指向该提交
  5. 将提交合并到当前签出的任何内容
  6. 根据您提供的UI模型,这不是我预期会发生的事情。我原以为GitExtensions会运行以下代码:

    git pull --progress origin refs/heads/develop
    

    通过省略本地引用名称(冒号后面的部分),Git执行以下操作:

    1. 弄清楚远程存储库的develop分支指向
    2. 的提交
    3. 下载该提交及其祖先从远程存储库提交(本地存储库中已有的东西除外)
    4. 将本地FETCH_HEAD临时引用设置为指向该提交
    5. 将提交合并到当前签出的任何内容
    6. 注意步骤3中的差异。

      我不熟悉GitExtensions,但这就是我认为GitExtensions正在做的事情:假设您希望将给定的远程分支指定为给定本地分支的官方上游分支。有了这个假设,创建origin/A作为远程develop分支的远程跟踪分支就会产生适度的意义。我很想知道GitExtensions是否还修改了remote.origin.fetch中的branch.A.merge.git/config配置设置,以确保指定为正式。如果是这样,那就是糟糕的用户界面设计。如果没有,那么它可能是一个错误。

答案 1 :(得分:1)

您只能拉出已检出的分支。这是您的跟踪混乱的地方。

查看正在发生的事情的最简单方法是查看.git / conf文件。您将看到哪个分支正在跟踪哪个远程分支。您可以通过直接编辑文件或使用git branch的--set-upstream选项来解决此问题。

我建议获取,然后检查远程获取分支的位置,然后通过合并更改或更新它们来更新本地分支。您也可以通过重置和强制推送来拒绝更改。

另外,请考虑使用命令行。您将获得命令和其他好处的历史。