Git 追踪上游源

8
我正在处理一个项目,有一个中央的Git代码库。 这个项目是为多个fork的基线而设计的蓝图。
是否可以配置我的本地工作库以使其跟踪中央项目的原点,并将骨架的主要部分作为名为“upstream”的单独分支进行跟踪,以便对骨架进行更改选择?
我想像这样进行工作流程:
创建Skeleton >> Fork Skeleton >> Skeleton从Fork 2 Pulls更改 >> Fork 1从Skeleton Pulls更改
是否有更好的方法来实现我所描述的操作?
2个回答

10
请阅读GitHub“Fork a Repo”页面的“第三步:配置远程操作”(我知道您没有提到GitHub,但它仍然相关)
  • origin是您的fork的远程地址,您的本地克隆可以从中拉取/推送
  • upstream是您原始仓库Skeleton的远程地址(您可以使用git remote add upstream https://..../Skeleton.git添加它)

所以upstream不是一个分支。

但是您可以使用git branch定义一个本地分支,该分支将具有来自上游仓库的远程跟踪分支master作为上游分支。

git branch --set-upstream upstream_master upstream/master

然而,如果你永远不会在本地分支上进行新的提交,那么你就不需要一个本地分支:在执行git fetch upstream后,你可以直接将你的主分支与upstream/master进行比较,并从upstream/master中挑选出你需要的内容。


这与我尝试做的事情大致相同,促使了这个问题。命令 git branch --set-upstream upstream_master upstream/mastergit remote add upstream /srv/repos/git/skeleton.git 之后不能直接工作。为什么呢?我在排除故障时意外地纠正了这个问题。我并不想在我的主工作树中运行 git fetch upstream,但是使用它来进行故障排除,然后允许我添加一个远程跟踪分支到upstream/master。我想这是因为远程分支upstream/master在那之前并没有在我的repo中。 - Steve Buzonas
在执行remote add之后直接进行git fetch upstream是不行的,需要先执行一次该命令以便将远程跟踪分支upstream/master获取并放入本地仓库。执行git fetch并不会修改任何您本地的文件。 - VonC

1
根据您的描述,每当骨架发生变化时,您应该在分支上进行rebase操作。
$ git rebase upstream

这将会改变情况如下

initially:
1 - 2 - 3 <- upstream
        \- 4 <- fork

upstream changes:
1 - 2 - 3 - 5 - 6 <- upstream
        \- 4 <- fork

after rebase:
1 - 2 - 3 - 5 - 6 <- upstream
                \- 4 <- fork

换句话说,你的分支看起来就像是从最新版本的骨架分支派生出来的一样。
这种方法的缺点是它会改变分支的历史记录... 如果你不想这样,你可以直接将上游合并到分支中(我认为不需要挑选)。

如果在分叉之后并且在变基之前,上游删除了文件,那么当Git应用更改到这些文件时会发生什么? - Steve Buzonas
如果您没有修改文件,则它们将在变基期间被删除。如果您对其进行了修改,则会出现冲突,您需要手动解决。 - Sjlver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接