我知道这个帖子说rebase是针对teamMates的小变化,而是针对大变化进行合并.
我在以下目录结构中保留了三个队友的三个Gits,我们都有相同的初始代码:
project | - I | - myTeamMate1 | - myTeamMate2
分支机构不在同一个Git中.这意味着我不能使用rebase和merge.我使用vimdiff在teamMates之间同步更改.但是,这很费时间.
我没有成功尝试进行以下目录结构,其中所有分支都在一个Git下:
project | - I - myTeamMate1 - myTeamMate2
但是,我为我和我的队友运行了clone命令:
git clone
我为队友运行第二个克隆后收到错误消息
fatal: destination path 'dotFiles' already exists and is not an empty directory.
我应该与3人团队一起使用哪种目录结构,以便我可以使用rebase
和merge
命令?
只是其他一些想法来完成塞缪尔的答案.
与SVN不同,分支和目录在Git中完全不相关:拥有3个分支(团队中每个成员一个)并不意味着3个目录.这不是你在你的问题中的意思(因为你的目录实际上是3个Git存储库的3个根),但我更愿意明确提到它以防万一;)
Git是DVCS,3个存储库可以在任何地方(不在同一台计算机上的3个目录中).如果可以通过UNC路径(\\desktop\path\to\repo
)访问它们,则可以将它们指定为远程.
Git clone确实允许您获取对远程分支的引用,但不会创建跟踪本地分支,以便您获得同事的工作.ruby模块" 远程分支 "可以提供帮助.
在重写你的分支机构的SHA-1时要警惕rebase(因为你在另一个分支上重放你的提交):如果你的队友将你的合并基于你的分支,他们将不得不每次都合并你的所有提交,甚至那些已经合并了!
在这种情况下,最好有2个分支:
您正在使用的工作分支用于开发和rebase(以集成同行的工作,尽管即使该操作也可以在其自己的分支中完成)
一个发布公共分支,在其上只合并您的工作稳定,并且然后可以通过其他远程仓库被用作合并源.
事实上,他们不在你所声明的同一个git中并不以任何方式限制你.Git是分布式的,这意味着您可以在这些存储库之间进行获取,合并,转换等等.
查看git remote --help
如何在您的队友中命名您的队友存储库,以便您可以轻松导入他们的更改,重新绑定到他们或执行合并.无需更改目录结构,您的目录结构完全可用.
代码示例
跟踪远程分支
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 repo上有一个分支:
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网站上再次挽救了这一天:
如果存在冲突 - 例如,如果在远程分支和本地分支中以两种不同的方式修改了同一文件 - 那么您会收到警告 -
下一个问题是清理有问题的部分并再次合并.您可以在有问题的文件中看到与以下类似的内容 - 玩得开心!(我终于遇到了真正的问题;)
alt text http://dl.getdropbox.com/u/175564/exampleGitProblemSolving.png
在Mac的FileMerge中衍生和合并dotFiles时出现问题
我需要更新我的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
以及玛西,大师和血统的所有3种2种排列.但是,没有一个命令不起作用.
练习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中可能有一个密码.如果有,您可能会获得拒绝许可 - 警告.如果你这样做,请看线程.