在我的工作场所,我们在使用Source Safe(yay!)超过10年后,才转向Git进行版本控制。我现在必须支持我们的工程师学习新工具。值得注意的是,我们都在Windows下使用GitExtensions UI。
一些同事做了以下(来自用户界面):
以下是当我们进行拉动时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 分支。
由于
答案 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:
develop
分支指向refs/remotes/origin/A
引用指向该提交根据您提供的UI模型,这不是我预期会发生的事情。我原以为GitExtensions会运行以下代码:
git pull --progress origin refs/heads/develop
通过省略本地引用名称(冒号后面的部分),Git执行以下操作:
develop
分支指向FETCH_HEAD
临时引用设置为指向该提交注意步骤3中的差异。
我不熟悉GitExtensions,但这就是我认为GitExtensions正在做的事情:假设您希望将给定的远程分支指定为给定本地分支的官方上游分支。有了这个假设,创建origin/A
作为远程develop
分支的远程跟踪分支就会产生适度的意义。我很想知道GitExtensions是否还修改了remote.origin.fetch
中的branch.A.merge
或.git/config
配置设置,以确保指定为正式。如果是这样,那就是糟糕的用户界面设计。如果没有,那么它可能是一个错误。
答案 1 :(得分:1)
您只能拉出已检出的分支。这是您的跟踪混乱的地方。
查看正在发生的事情的最简单方法是查看.git / conf文件。您将看到哪个分支正在跟踪哪个远程分支。您可以通过直接编辑文件或使用git branch的--set-upstream选项来解决此问题。
我建议获取,然后检查远程获取分支的位置,然后通过合并更改或更新它们来更新本地分支。您也可以通过重置和强制推送来拒绝更改。
另外,请考虑使用命令行。您将获得命令和其他好处的历史。