9

我知道线程说 rebase 是针对 teamMates 的小更改,而 merge 是针对大更改。

我将三个队友的三个 Git 保存在以下目录结构中,我们都有相同的初始代码:

project 
      | - I
      | - myTeamMate1
      | - myTeamMate2

分支不在同一个 Git 中。这意味着我不能使用变基和合并。我使用 vimdiff 来同步 teamMates 之间的更改。但是,这很耗时。

我没有成功尝试创建以下目录结构,其中所有分支都在一个 Git 下:

project
      | - I - myTeamMate1 - myTeamMate2

但是,我为我和我的队友运行克隆命令:

git clone <url>

我在为队友运行第二个克隆后收到错误消息

fatal: destination path 'dotFiles' already exists and is not an empty directory.

我应该与 3 人团队一起使用哪种目录结构,以便我可以使用rebasemerge命令?

4

4 回答 4

10

只是一些其他想法来完成塞缪尔的回答。

  • 与 SVN 不同,分支和目录在 Git 中是完全不相关的:拥有 3 个分支(每个团队成员一个)并不意味着 3 个目录。这不是您在问题中的意思(因为您的目录实际上是 3 个 Git 存储库的 3 个根目录),但我更愿意明确提及它以防万一;)

  • Git 是 DVCS,这 3 个存储库可以在任何地方(而不是在同一台计算机上的 3 个目录中)。如果它们可以通过 UNC 路径 ( \\desktop\path\to\repo) 访问,则可以将它们指定为远程。

  • Git clone 确实允许您获取对远程分支的引用,但不会创建跟踪本地分支以允许您获取同事的工作。ruby 模块“远程分支”可以提供帮助。

  • 小心rebase,因为它会重写你的分支的 SHA-1(因为你在另一个分支上重放你的提交):如果你的队友基于你的分支进行合并,他们每次都必须合并你的所有提交,即使是那些已经合并了!
    在这种情况下最好有 2 个分支:

    • 您用于开发和变基的工作分支(以集成同行的工作,尽管即使该操作也可以在其自己的分支中完成)
    • 一个发布公共分支,你只合并你的稳定工作,然后可以被其他远程存储库用作合并的源。
于 2009-05-25T04:09:43.073 回答
5

它们与您所说的不在同一个 git中这一事实不会以任何方式限制您。Git 是分布式的,这意味着您可以在这些存储库之间获取、合并、变基等。

查看git remote --help如何在您的团队中命名您的队友存储库,以便您可以轻松地导入他们的更改、基于它们进行变基或执行合并。无需更改目录结构,您的目录结构完全可用。

于 2009-05-24T18:25:34.017 回答
5

代码示例

跟踪远程分支

git remote add -t master Hnr git://github.com/userName/files.git

这不会下载您的分支。它只是编辑文件 .git/config 并添加几行告诉 Git 如何以及如何远程获取数据。

要获取您的队友的分支,请运行

git fetch Hnr

要查看您确实拥有您的队友的分支,请运行

git branch -a

或仅查看您朋友的分支机构

git branch -r

上面两个命令最初引起了我的困惑,因为我不知道它们。这让我尝试了其他不必要的命令来为我创建分支。

第二种方式来拥有你朋友的分支

但是请注意,您可以使用 git-clone 将您朋友的代码保存到单独的目录中,如下所示

git clone UrlAtGithub

然后,您显然可以使用上面的 Git-remote 在您的 Git 存储库中创建一个分支:

git remote add master Hnr PATH/ToYourFriendRepo.git

结论:您可以使用两种方式为您创建 teamMate 的分支,通过 git-clone 或不使用它。两种方式都需要使用git remote add. 后者的优势似乎是您需要少运行一个命令。前者然后再次将您的队友的整个回购提供给您的硬盘。

请参阅 Git 手册,了解如何更新远程分支。(NB 远程分支可以在您的计算机上。它不必在远程计算机上。您的分支也可以是远程分支,但这会限制您的工作流程。)


接下来,您可能希望将您朋友的特定文件合并到您的分支。在这种情况下,只需知道您朋友提交的 5 个首字母即可合并文件。

[我不确定您如何执行以下操作:]例如,您需要运行

git merge 76a32

您可能会得到以下输出

CONFLICT (add/add): Merge conflict in shells/externalPrograms
Auto-merging shells/smallApps/extract
CONFLICT (add/add): Merge conflict in shells/smallApps/extract
Auto-merging shells/smallApps/extract~
CONFLICT (add/add): Merge conflict in shells/smallApps/extract~
Automatic merge failed; fix conflicts and then commit the result.

在这种情况下,您的文件与您朋友的文件有很大不同,Git 无法决定采用哪个文件。您显然需要运行以下内容

git rebase

你得到

shells/smallApps/extract: needs merge
shells/smallApps/extract~: needs merge
cannot rebase: you have unstaged changes

练习 1:但是,我现在陷入困境,因为我的 tig 没有在我的 Git 树上显示我朋友的提交。 您如何将朋友的提交 76a32 提交到您的 Git 树中的哪个分支在您的 Git 中?


您现在可能已经解决了问题。问题在于我忽略了解决 Git 给我通知的冲突。谷歌在官方 Git 网站上再次拯救了这一天:

如果有冲突——例如,如果同一个文件在远程分支和本地分支中以两种不同的方式被修改——那么你会被警告——

接下来的问题是清理有问题的部分并再次合并。您会在有问题的文件中看到类似于以下内容的内容——玩得开心!(我终于遇到了真正的问题;)

替代文字 http://dl.getdropbox.com/u/175564/exampleGitProblemSolving.png


在 Mac 的 FileMerge 中区分和合并点文件的问题

我需要更新我的 Git,因为只有最新的 Git 有 difftool -command。您可以在线程中找到解决方案。

Difftool 允许您从终端启动 FileMerge 中的 dotFiles。您无法在 GUI 中访问它们。它像

git difftool master:README dev:README

添加新的远程帐户后,您在 Github 中的帐户出现问题

您的 Github 帐户可能已在 .git/config 中消失。在这种情况下,您需要运行以下代码

git remote add -f YourUserName UrlIn@form.git

然后你可能会注意到你不能正常 git-push

git push origin master

您可能会收到以下错误消息

fatal: 'origin' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

您也可以尝试以下命令来解决问题

git push Masi master

以及 Masi、master 和 origin 的所有 3 个低于 2 的排列。但是,没有一个命令不起作用。

练习 2当您的远程列表中有一个队友时,您如何提交到您的 github 帐户?

Origin 是您实际外部 git-repo 的简称,例如在 Github。您的变量来源的内容可能已被另一个远程仓库替换。在这种情况下,我建议您通过

git remote add github git@github.com:myLogin/myProject.git

请注意,您可以使用 origin2 代替 github。Origin 只是命名 repo 的约定。

然后你可以简单地运行

git push github master

您的 ssh 密钥中可能有密码。如果你有,你可能会得到一个权限被拒绝的警告。如果你这样做了,请查看线程

于 2009-05-25T19:30:12.407 回答
4

说实话,我开始努力输入一个漂亮、长、详细的回复......但我已经解释得比我在http://excess.org/article/2008/07/ogre-git-教程/。他涵盖了不同分支、远程和合并的使用。它也是在截屏中完成的,所以花一个小时,喝杯咖啡,享受讲座。

具体到您的问题:您不应该使用目录设置。Git 处理目录分支的方式与 SVN 处理分支文件夹的方式不同。git 中的分支是完全不同的东西。虽然您可能不会设置中央存储库(我推荐它),但您应该设置一个分支,每个人都提交他们最终的、干净的工作。

我的一个示例存储库在Wikimedia Commons上有一张截图。在我的示例中,“调酒师”仅以 tar 块的形式提交他的代码,因此我必须自己导入它来管理它。“master”(此处仅显示为 remotes/elf/master)是一个公共 svn 存储库,我导入并从中进行基本更改。“独裁”是我自己的代码基线,“私人”是我保存一个配置文件的地方,其中包含我想要管理但从不发布的密码。检查 private 上的时间戳,您会注意到它们与下面的分支不对齐。这是因为我将该分支重新设置为“独裁”而不是合并

您会注意到两个远程引用:elf 和 bard。这是我的两台托管软件的远程机器。我可以随意推拉我的树枝到那里。在您的情况下,您将拥有其他开发人员的远程存储库,并且他们会修改自己的分支。观看本教程将使您更好地了解它是如何工作的。祝你好运 :)

于 2009-05-25T14:36:05.630 回答