参考
常用命令
-
新建分支并切换
git checkout -b featureB origin/master
相当于执行
git branch featureB
git checkout featureB -
git commit -am ‘add limit’
git commit -a -m ‘add limit’
-
branch
-
删除分支
git branch -d hotfix
-
新建分支
git branch hotfix
-
当前所有分支清单
git branch
-
显示各分支最后一个提交对象的信息
git branch -v
-
筛选已经与当前分支合并的分支
git branch --merged
-
筛选尚未与当前分支合并的分支
git branch --no-merged
- 推送本地分支:git push (远程仓库名)(分支名)
- git push origin hotfix
取出我在本地的 hotfix 分支,推送到远程仓库的 hotfix 分支中去,相当于
git push origin hotfix:hotfix - 若想把远程分支叫做hot
git push origin hotfix:hot - 使用 -f 选项(译注:表示 force,不作检查强制重写)替换远程已有的 featureA 分支(因为新的 commit 并非原来的后续更新)
git push -f myfork featureA - 在远程分支的基础上分化出一个新的分支来(从远程分支 checkout 出来的本地分支,称为 跟踪分支 (tracking branch))
git checkout -b serverfix origin/serverfix
也可写为:
git checkout --track origin/serverfix
为本地分支设定不同于远程分支的名字:
git checkout -b sf origin/serverfix
在跟踪分支里输入 git push,Git 会自行推断应该向哪个服务器的哪个分支推送数据。同样,在这些分支里运行 git pull 会获取所有远程索引,并把它们的数据都合并到本地分支中来。
- git status
- 远程仓库相关
- 查看当前远程仓库
git remote
git remote -v (显示对应的克隆地址) - 添加远程仓库
git remote add pb git://github.com/paulboone/ticgit.git
现在可以用字符串 pb 指代对应的仓库地址了。比如说,要抓取所有 Paul 有的,但本地仓库没有的信息,可以运行
git fetch pb
现在,Paul 的主干分支(master)已经完全可以在本地访问了,对应的名字是 pb/master,你可以将它合并到自己的某个分支,或者切换到这个分支,看看有些什么有趣的更新。 - 查看远程仓库信息
git remote show origin - 删除远程仓库
git remote rm pb - 重命名远程仓库
git remote rename pb paul - 从远程仓库抓取数据
git fetch [remote-name]
此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟。
如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。所以,git fetch origin 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。
如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。
实际上,默认情况下 git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运行 git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。
- 分支的合并
- git checkout master
gir mergr hotfix - git merge --no-commit --squash featureB
–squash 选项将目标分支上的所有更改全拿来应用到当前分支上,而 --no-commit 选项告诉 Git 此时无需自动生成和记录(合并)提交。这样,你就可以在原来代码基础上,继续工作,直到最后一起提交。 - 快进(fast forward)
当前 master 分支所在的提交对象是要并入的 hotfix 分支的直接上游,Git 只需把 master 分支指针直接右移,此时不存在需要解决的分歧 - 三方合并(Merge made by recursive)
Git 会用两个分支的末端(C4 和 C5)以及它们的共同祖先(C2)进行一次简单的三方合并计算,对三方合并后的结果重新做一个新的快照,并自动创建一个指向它的提交对象(C6)。这个提交对象比较特殊,它有两个祖先(C4 和 C5)
- 分支的衍合
- git checkout experiment
git rebase master
它的原理是回到两个分支最近的共同祖先,根据当前分支(也就是要进行衍合的分支 experiment)后续的历次提交对象(这里只有一个 C3),生成一系列文件补丁,然后以基底分支(也就是主干分支 master)最后一个提交对象(C4)为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象(C3’),从而改写 experiment 的提交历史,使它成为 master 分支的直接下游。 - git rebase --onto master server client
取出 client 分支,找出 client 分支和 server 分支的共同祖先之后的变化,然后把它们在 master 上重演一遍 - 直接把 server 分支衍合到 master,而不用手工切换到 server 分支后再执行衍合操作:git rebase [主分支] [特性分支],命令会先取出特性分支 server,然后在主分支 master 上重演
git rebase master server
- 挑拣(cherry-pick)
挑拣类似于针对某次特定提交的衍合。它首先提取某次提交的补丁,然后试着应用在当前分支上。如果某个特性分支上有多个提交,但你只想引入其中之一就可以使用这种方法。
如果你希望拉取e43a6到你的主干分支,可以这样:
git cherry-pick e43a6fd3e94888d76779ad79fb568ed180e5fcdf
- git diff
- 当前分支同其他分支合并时的完整内容差异
git diff master
虽然能得到差异内容,但请记住,结果有可能和我们的预期不同。一旦主干 master 在特性分支创建之后有所修改,那么通过 diff 命令来比较的,是最新主干上的提交快照。显然,这不是我们所要的。比方在 master 分支中某个文件里添了一行,然后运行上面的命令,简单的比较最新快照所得到的结论只能是,特性分支中删除了这一行。 - 实际上我们真正想要看的,是新加入到特性分支的代码,也就是合并时会并入主干的代码。所以,准确地讲,我们应该比较特性分支和它同 master 分支的共同祖先之间的差异。
可以手工定位它们的共同祖先,然后与之比较
git merge-base contrib master
36c7dba2c95e6bbb78dfa822519ecfec6e1ca649
git diff 36c7db
但这么做很麻烦,所以 Git 提供了便捷的 … 语法。对于 diff 命令,可以把 … 加在原始分支(拥有共同祖先)和当前分支之间
git diff master...contrib