赞
踩
1. 假设工作目录中有三个文件,暂存后提交,那么现在仓库中就有五个对象:三个表示文件内容的blob对象;一个记录目录树及其中各个文件对应的blob对象索引的tree对象;一个包含指向tree对象的索引和其他提交信息元数据的commit对象。
2. 每次提交对象都会包含一个指向上次提交对象的指针,Git 会使用master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的master 分支,它在每次提交的时候都会自动向前移动。
3. 新建分支:git branch [branc-name],git中有个HEAD指针,指向正在工作中的本地分支,gitbranch 仅仅是新建分支,不会自动切换到这个分支去。
4. 切换分支:git checkout [branch-name], gitcheckout –b [branch-name],这条命令做了两件事。它把HEAD 指针移回到[branch-name]分支,并把工作目录中的文件换成了[branch-name]分支所指向的快照内容。
5. 分支的合并:
1) git merge [branch-name],如果顺着一个分支走下去可以到达另一个分支的话,那么 Git在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fastforward)。
2) git branch 的 -d 选项执行删除操作
3) 如果不是简单的合并过程,如下图所示:这次,Git 没有简单地把分支指针右移,而是对三方合并后的结果重新做一个新的快照,并自动创建一个指向它的提交对象(C6)。这个提交对象比较特殊,它有两个祖先(C4和C5)。
4) 遇到冲突时的分支合并,如果在不同的分支中都修改了同一个文件的同一部分,Git就无法干净地把两者合到一起,gitmergetool进行人工解决
5) 在合并之后再做一次合并,尽管分支之间的文件不一致,但是会提示”Alreadyup-to-date”,无法继续进行合并,stackoverflow答案:Themessage “Already up-to-date” means that all the changes from the branch you’retrying to merge have already been merged to the branch you’re currently on.More specifically it means that the branch you’re trying to merge is a parentof your current branch. Congratulations, that’s the easiest merge you’ll everdo.
6. 分支管理:
1) 列出当前所有的分支清单:git branch
2) 查看各个分支最后一个提交对象的信息:git branch –v
3) 查看已经合并以及未合并的分支:git branch--merged/--no-merged
4) 删除未合并的分支:由于这些分支中还包含着尚未合并进来的工作成果,所以简单地用git branch -d 删除该分支会提示错误,因为那样做会丢失数据,”If you are sure you want to delete it, run 'git branch -D testing' ”
7. 推送本地分支:git push origin [local-branch]:[remote-branch]
8. 远程分支的内容合并到当前分支,可以运行 git mergeorigin/[remote-branch]
9. 将远程分支新建到本地分支(二者等价,只是后者不能重命名):
1) git checkout -b [local-branch] origin/[remote-branch]
2) git checkout --track origin/[remote-branch]
10. 删除远程分支:git push [remote-name]:[remote-branch], git push [远程名][本地分支]:[远程分支] 语法,如果省略[本地分支],那就等于是在说“在这里提取空白然后把它变成[远程分支]”。
11. rebase(衍合):开发进程分叉到两个不同分支,又各自提交了更新,如下图:
最容易的整合分支的方法是 merge 命令,它会把两个分支最新的快照(C3 和 C4)以及二者最新的共同祖先(C2)进行三方合并,合并的结果是产生一个新的提交对象(C5),如下图所示:
另外一个选择:你可以把在 C3 里产生的变化补丁在 C4 的基础上重新打一遍。在git里,这种操作叫做衍合(rebase)。
git checkout experiment
git rebase master
它的原理是回到两个分支最近的共同祖先,根据当前分支(也就是要进行衍合的分支experiment)后续的历次提交对象(这里只有一个C3),生成一系列文件补丁,然后以基底分支(也就是主干分支master)最后一个提交对象(C4)为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象(C3'),从而改写experiment 的提交历史,使它成为master 分支的直接下游,如图所示:
现在回到 master 分支,进行一次快进合并
12. git rebase –onto master server client,这好比在说:“取出 client 分支,找出client 分支和server 分支的共同祖先之后的变化,然后把它们在master 上重演一遍”
此时,快进master分支,git checkoutmaster 以及gitcheckout client:
git rebase [主分支] [特性分支] 命令会先取出特性分支 server,然后在主分支master 上重演。gitrebase master server就可以把server加进来
13. 衍合的风险:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。