1

在我的工作场所,在使用 Source Safe 10 多年后,我们刚刚迁移到 Git 进行版本控制(耶!)。我现在必须支持我们的工程师学习新工具。需要注意的是,我们都在使用 Windows 下的 GitExtensions UI。

几个同事做了以下事情(来自 UI):

  • 克隆中央存储库(origin
  • 基于主开发分支创建一个新的本地分支(A )
  • 在A分支上创建提交
  • 虽然仍然检查了那个A分支,但他们(错误地)将主开发分支拉到了他们的A分支中

下面是我们进行拉取操作时 GitExtensions 的 UI 的样子(遗憾的是,我无法发布工作中的屏幕截图):

拉取自:原点

当地分公司:A

远程分支:开发

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

(然后按下拉按钮)

这是 GitExtensions 的命令日志显示它为拉动所做的:

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

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

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

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

提前致谢

编辑

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

谢谢

4

2 回答 2

2

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

+refs/heads/develop:refs/remotes/origin/A部分称为refspec(参考规范)。它说要使名为(缩写为)的本地目标引用指向远程存储库的引用(远程存储库中的分支)当前指向的同一提交。开头的加号 ( ) 表示即使目标 ref 不能快进到源 ref,也要强制 ref 匹配。refs/remotes/origin/Aorigin/Arefs/heads/developdevelop+

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

  1. 找出远程存储库的develop分支指向的提交
  2. 从远程存储库下载该提交及其祖先提交(本地存储库中已有的内容除外)
  3. 强制本地refs/remotes/origin/A引用指向该提交
  4. 将该提交合并到当前签出的任何内容中

根据您提供的 UI 模型,这不是我所期望的。我本来希望 GitExtensions 运行以下命令:

git pull --progress origin refs/heads/develop

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

  1. 找出远程存储库的develop分支指向的提交
  2. 从远程存储库下载该提交及其祖先提交(本地存储库中已有的内容除外)
  3. 将本地FETCH_HEAD临时引用设置为指向该提交
  4. 将该提交合并到当前签出的任何内容中

注意第 3 步的不同之处。

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

于 2012-03-03T00:04:20.800 回答
1

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

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

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

另外,考虑使用命令行。您可以获得命令历史记录和其他好处。

于 2012-03-02T21:08:22.410 回答