7

我正在遵循此处描述的工作流程,因为我发现许多指向此页面的参考资料都是一个很好的工作流程。正如文章中提到的,“功能”分支在开发人员之间共享,但不要转到中央存储库。

假设开发人员“A”使用git checkout -b newfeature develop. 现在假设开发人员“B”也需要处理此功能。这是我的问题。

我做了什么:

  1. 开发人员“B”将开发人员 A 的机器添加为远程
  2. 开发人员“B”运行git branch remoteA/newfeature
  3. 开发人员“B”在这个分支上工作,提交他的工作并将更改推送回 remoteA。

步骤 3 不工作,现在。我收到一条消息:

远程:错误:默认情况下,在非裸存储库中更新当前分支是被拒绝的,因为它会使索引和工作树与您推送的内容不一致,并且需要'git reset --hard'来匹配工作树到头。

远程:错误:您可以在远程存储库中将“receive.denyCurrentBranch”配置变量设置为“忽略”或“警告”,以允许推送到其当前分支;但是,除非您安排更新其工作树以匹配您以其他方式推送的内容,否则不建议这样做。

远程:错误:要压制此消息并仍保持默认行为,请将 receive.denyCurrentBranch 配置变量设置为 'refuse'。

我已经设置了sharedRepository = true,但它没有帮助。

我有两个问题:

  1. 在开发人员之间共享功能分支的正确方法是什么?
  2. 如何将开发人员 B 存储库中的更改推回开发人员 A 的原始存储库?
4

2 回答 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/

Update2:扩展您的第二个问题:

您正在尝试做的是推送到另一个开发人员的非裸存储库。Git 在以前的一些版本(我认为是 1.6 左右)中引入了裸存储库的概念——这是一个没有签出状态但只包含通常进入.git.

这种变化背后的原因是,每当你推送到你的同事存储库(他目前正在做某事)时——你就是在他的眼皮底下操纵存储库。所以他检查了版本 featureA-1 .. 开始工作 .. 然后你将 featureA-2 推送到他的仓库中,当他想要提交时,他遇到了麻烦,因为他所在的分支已经推进了一次他在期间没有看到的提交发展。

因为这非常具有破坏性 - 大多数人都采用了本地 git 存储库(您积极工作的那些)应该是私有的,而您有一个公共 git-repo(fork),您可以在其中接收和共享更改。这样一来,您在工作期间将永远不会被其他任何人打断(无论如何,这就是去中心化模型背后的全部想法),并且只能合并您想要的更改。(没有人可以在你当前的工作中加入一些东西)。

于 2011-12-13T21:31:07.530 回答
5

您可以推送到非裸仓库。你不能做的是推送到一个非裸仓库,其中包含你要推送的分支。这样做的原因应该是有道理的。更改其他人可能正在处理的文件是不正确的。

通常你会想要推送到 master 或其他一些常见的共享分支。为了避免这种冲突,远程非裸仓库的所有者应该在本地分支或至少其他一些分支上工作。然后你可以推送到共享分支。

要使用您的示例:

  1. 开发人员“B”将开发人员 A 的机器添加为远程
  2. 开发人员“B”运行git branch remoteA/newfeature
    1. 开发人员“A”确实在本地分支上工作。git checkout -b work-newfeature
  3. 开发人员“B”在这个分支上工作,提交他的工作并将更改推送回 remoteA。
    1. 开发人员“A”变基以获得新作品:git rebase newfeature
于 2011-12-15T04:44:49.663 回答