无法理解Git分支,合并和rebase

时间:2009-05-24 18:17:34

标签: git branch rebase

我知道thread表示rebase适用于teamMates的小更改,而合并适用于大的更改。

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

project 
      | - I
      | - myTeamMate1
      | - myTeamMate2

分支机构不在同一个Git中。这意味着我不能使用rebase和merge。 我使用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 个答案:

答案 0 :(得分:10)

完成塞缪尔答案的其他一些想法。

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

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

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

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

    • 您正在使用工作分支进行开发和rebase(以整合同行的工作,尽管即使该操作也可以在自己的分支中完成)
    • 发布公共分支,您只需合并稳定的工作,然后其他远程存储库可以将其用作合并源。

答案 1 :(得分:5)

事实上,他们不是在你所声明的同一个git 中并不以任何方式限制你。 Git是分布式的,这意味着您可以在这些存储库之间进行获取,合并,变换等等。

查看git remote --help,了解如何命名您的队友存储库,以便您可以轻松导入他们的更改 rebase 加入或执行合并。无需更改目录结构,您的目录结构完全可用。

答案 2 :(得分:5)

代码示例

跟踪远程分支

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

这不会下载你的分支。它只是编辑文件.git / config并添加了一些行,告诉Git如何远程获取数据的位置和方式。

要获得teamMate的分支,请运行

git fetch Hnr

要确定您确实拥有teamMates的分支,请运行

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。后者的优点似乎是你需要少运行一个命令。前者然后再次向你的teamMates提供你的硬盘的整个回购。

请参阅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给我通知的冲突。 Google会在official Git site

再次保存这一天
  

如果存在冲突 - 例如,   如果同一文件被修改为两个   远程分支中的不同方式   和当地分公司 - 那你就是   警告 -

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

alt text http://dl.getdropbox.com/u/175564/exampleGitProblemSolving.png


在Mac的FileMerge中衍生和合并dotFiles的问题

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

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

一样
git difftool master:README dev:README

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

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

git remote add -f YourUserName UrlIn@form.git

然后你可能会注意到你不能通过

正常推送
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的2种排列中的所有3种。 但是,没有一个命令不起作用。

Exercise 2如果您的远程列表中有teamMate,您如何提交您的github帐户?

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

创建一个新变量
git remote add github git@github.com:myLogin/myProject.git

请注意,您可以将origin2替换为github。 Origin只是命名repo的惯例。

然后您可以直接运行

git push github master

您的ssh-key中可能有密码。如果有,您可能会获得拒绝许可 - 警告。如果您这样做,请参阅thread

答案 3 :(得分:4)

说实话,我开始尝试输入一个很好的,详细的响应......但是我已经比http://excess.org/article/2008/07/ogre-git-tutorial/更好地解释了这一点。他介绍了不同分支,遥控器和合并的使用。这也是在截屏视频中完成的,所以花一个小时,喝点咖啡,然后享受演讲。

特定于您的问题:您不应使用目录设置。 Git不像SVN使用分支文件夹那样处理目录分支。 git中的分支是完全不同的东西。虽然您可能没有设置中央存储库(我推荐它),但您应该设置一个分支,以便每个人都将最终的,干净的工作提交给。

我的一个示例存储库在Wikimedia Commons处有一个屏幕截图。在我的例子中,“bartender”仅在tar块中提交他的代码,所以我必须自己导入它来管理它。 “master”(此处仅显示为remotes / elf / master)是一个公共的svn存储库,我导入并基于更改。 “专制”是我自己的代码基准,而“私有”是我保存配置文件的地方,其中包含我想要管理但从不发布的密码。检查私人的时间戳,您会发现他们没有与下面的分支对齐。这是因为我将分支转换为“专制”而不是合并

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