在裸仓库中合并Git分支

17

我想为我的git仓库创建以下设置:

我目前拥有一个本地的git仓库,里面存放着所有的工作文件。 我想设置一个中央的裸仓库以及另外两个非裸仓库 - 一个用于实时应用程序,另一个用于测试版本。

我希望能够将本地更改推送到测试分支的中央裸仓库上。然后,在我的测试仓库上,总是从裸仓库的测试分支拉取。

准备好进行更改并上线时,我希望能够在中央裸仓库中合并我的测试分支和主分支。然后实时仓库可以从主分支拉取。

因此,在这个方案中,测试仓库将始终从测试分支拉取,而实时仓库将始终从主分支拉取。

然而,我无法弄清楚如何在裸仓库中合并分支。 git-merge和git-checkout似乎没有不适用于没有工作树的情况。

那么,我的问题有两个:

  1. 是否有标准方法可以在裸仓库中合并分支?
  2. 这不是很直截了当,因为我的仓库设置很差吗?(如果是这样,您将如何修改此体系结构以获得最佳实践?)

这正是我的情况,你所描述的情形是最常见的。 - Jose Manuel Gomez Alvarez
3个回答

19
注意,实际上可以在裸仓库上完成这个操作,但是你需要绕过正常的界面来进行。
$ git read-tree -i -m branch1 branch2
$ COMMIT=$(git commit-tree $(git write-tree) -p branch1 -p branch2 < commit message)
$ git update-ref mergedbranch $COMMIT

更新:自 git 2.38 版本以来,“git merge-tree” 新增了一种模式,使用与“git merge”相同的机制来实现此功能。从manpage的使用部分可以看到:

NEWTREE=$(git merge-tree --write-tree $BRANCH1 $BRANCH2)
test $? -eq 0 || die "There were conflicts..."
NEWCOMMIT=$(git commit-tree $NEWTREE -p $BRANCH1 -p $BRANCH2)
git update-ref $BRANCH1 $NEWCOMMIT 

1
这个答案看起来非常有用,但它也非常难懂它在做什么。当你运行它时,高层次的解释是什么?branch1branch2-i-m-pmergedbranch是什么? - CervEd

15

git checkout 命令将分支检出到工作树中 - 如果没有工作树,您认为这应该如何运作?而 git merge 和大多数其他命令不起作用,因为裸仓库中没有 HEAD。

回答您的问题:您不能在裸仓库内工作。裸仓库只是用于保存数据;如果要使用它,可以使用非裸克隆进行工作。

因此,您可以从任何其他仓库中拉取裸仓库的内容,在本地进行合并,并将更改推回到裸仓库中。顺便说一下,您应该从开发仓库中执行此操作,以便实时和测试仓库仅从其分支中拉取。


谢谢!我会在我的本地仓库中进行合并。 - user480029
实际上,裸仓库中确实有一个“HEAD”:它用于向其他“git clone”命令推荐分支名称。但除此之外,是的。 - torek

2
你需要先从裸仓库(bare repository)克隆代码,合并你的分支,然后再次推送到裸仓库。因为在裸仓库中没有工作树来解决冲突。

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