如何与多个开发人员共享一个Git功能(或主题)分支

7
我正在遵循这里描述的工作流程,因为我发现许多参考资料都将此页面视为良好的工作流程。如文章所述,“特性”分支在开发人员之间共享,但不会进入中央代码库。
假设开发人员“A”使用git checkout -b newfeature develop开始一个新的功能分支。现在假设开发人员“B”也需要在此功能上工作。这是我的问题。
我所做的:
1. 开发人员“B”将开发人员A的机器添加为远程主机 2. 开发人员“B”运行git branch remoteA/newfeature 3. 开发人员“B”在此分支上工作,提交他的工作并将更改推送回remoteA
步骤3目前无法工作。我收到了一条消息:
``` remote: error: By default, updating the current branch in a non-bare repository is denied, because it will make the index and work tree inconsistent with what you pushed, and will require 'git reset --hard' to match the work tree to HEAD. remote: error: You can set 'receive.denyCurrentBranch' configuration variable to 'ignore' or 'warn' in the remote repository to allow pushing into its current branch; however, this is not recommended unless you arranged to update its work tree to match what you pushed in some other way. remote: error: To squelch this message and still keep the default behaviour, set receive.denyCurrentBranch' configuration variable to 'refuse'. ```
我已经设置了sharedRepository = true,但没有帮助。
我的两个问题:
1. 共享功能分支的正确方法是什么? 2. 如何将开发人员B存储库中的更改推回开发人员A的原始存储库?

1
再次强烈建议不要在非裸仓库之间推送更改,因为这只会引入你不想要的问题 :) - Tigraine
2个回答

8

分享特性分支最简单的方法是将它们推送到中央仓库,这样任何人都可以从中拉取。这样你就可以直接使用已经拥有的主仓库基础设施,并且可以轻松地共享代码。

一旦远程的特性分支不再需要,你可以通过执行删除操作来将其删除。

git push <server> :branch

我建议不要在开发者机器之间直接共享,因为这容易出现问题,比如用户连接到不同的网络(彼此没有连接)。如果可能,您还可以使用GitHub模型,在服务器上有一个中央存储库(主存储库),除了主存储库外,每个开发人员都有一个该存储库的“分支”,他具有完全的提交访问权限,并可以推送自己喜欢的分支。在这种情况下,您可以将同事的“分支”添加为您的存储库的远程,同时保持对一个集中式服务器的简单访问(节省了在每台机器上设置SSH密钥的麻烦等)。关于GitHub模型的描述可以在这里找到: http://www.eqqon.com/index.php/Collaborative_Github_Workflow
更新:正如评论者指出的那样,以下是一个很好的链接,以开始使用集中式特性分支工作流: http://nvie.com/posts/a-successful-git-branching-model/
更新2:为了回答您的第二个问题,请参考以下内容:
您试图做的是将内容推送到另一开发人员的非裸仓库。Git在之前的某个版本(我认为是1.6左右)中引入了裸仓库的概念 - 这是一个没有检出状态,只包含通常放置在.git中的数据库的仓库。
这种变化背后的原因是,每当您将内容推送到正在进行工作的同事的仓库时,您都在他的鼻子下操纵仓库。所以他检出版本featureA-1..开始工作..然后你将featureA-2推到他的仓库,当他想提交时,他遇到麻烦,因为他在开发过程中没有看到进展了一个提交的分支。
由于这相当具有破坏性 - 大多数人已经采用了本地git仓库的概念(其中您积极地进行工作),应该是私有的,而您拥有一个公共git仓库(fork),在那里您接收和共享更改。这样,您将永远不会被其他人打断工作(这就是去中心化模型的整个思想),并且只能合并您想要的更改。(没有人可以将内容推送到您当前的工作中)。

这里有一种组织中央仓库方法的方式:http://nvie.com/posts/a-successful-git-branching-model/ - tback
你指出的链接是我在问题中包含的相同链接(在第一句话中:“我正在按照这里描述的工作流程进行操作”)。单词“here”是指向同一位置的链接。在这个链接中(我同意,它很好),他们说:“但除了集中的推拉关系外,每个开发人员也可以从其他同行那里拉取更改以形成子团队。”这就是我试图复制但没有成功的内容。 - duduklein
我试图用GitHub模型来解释这一点,但我想我没有表达清楚。我再次更新了答案,并提供了关于您特定问题的信息(非裸库无法推送)。 - Tigraine

5
你可以向非裸库推送代码。但是,如果你要推送的分支已经被其他人检出,那么你就不能向这个非裸库推送代码。原因很明显,改变其他人正在处理的文件是不正确的。
通常情况下,你需要向主分支或者其他共享分支推送代码。为了避免冲突,远程非裸库的所有者应该在本地分支上进行开发工作,或者至少在其他分支上进行。然后你才能将代码推送到共享分支。
以你提供的例子为例:
1. 开发者"B"将开发者"A"的机器添加为远程仓库。 2. 开发者"B"运行git branch remoteA/newfeature - 开发者"A"在本地分支上进行工作:git checkout -b work-newfeature 3. 开发者"B"在该分支上开发工作,提交更改并将更改推送回remoteA. - 开发者"A"使用git rebase newfeature来获取新的开发工作。

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