1 分支简介

有人把 Git 的分支模型称为它的‘必杀技特性’。 Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之 后,你其实已经有一个指向最后那个提交对象的 master 分支。 它会在每次的提交操作中自动向前移动。

Git 的 “master” 分支并不是一个特殊分支。它就跟其它分支完全没有区别。 之所以几乎每 一个仓库都有 master 分支,是因为 git init 命令默认创建它,并且大多数人都懒得去改 动它。

2 分支创建

2.1 git branch testing

这会在当前所在的提交对象上创建一个指针。指向最新的提交。 并且使用 HEAD 指针指向当前所在的本地分支

2.2 git log –oneline –decorate

查看各个分支所指的对象

3 分支切换

3.1 git checkout testing

  • HEAD 会指向 testing 分支
  • 再次提交会使 testing 分支向前移动,并且 master 分支指向原地

3.2 git checkout master

  • 将 HEAD 指回 master 分支
  • 将工作目录切换到 master 分支所指向的快照内容

3.3 项目分叉历史

  • 上述两次改动针对的是不同分支:你可以 在不同分支间不断地来回切换和工作,并在时机成熟时将它们合并起来。

    $ git log --oneline --decorate --graph --all 
    \* c2b9e (HEAD, master) made other changes
    | * 87ab2 (testing) made a change
    |/ *
    f30ab add feature #32 - ability to add new formats to the
    \* 34ac2 fixed bug #1328 - stack overflow under certain conditions
    \* 98ca9 initial commit of my project

3.3.1 合并分支

git merge <branch_name>

  • 当你试图合并两个分 支时,如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,
  • 只会简单的将指针向前推进 (指针右移),
  • 因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。

3.3.2 删除分支

git branch -d hotfix

4 分支管理

  1. git branch 查看分支 * 代表当前分支
  2. git branch -v 查看每个分支最近的提交
  3. git branch –merged 查看已经合并的分支
  4. git branch –no-merged 查看没有合并的分支 删除未合并的分支时会提示 必要时使用 -D 选项删除

5 远程分支

5.1 查看分支状态

  1. git remote
  2. git remote show <remote-name>

5.2 获取远程分支的数据

  1. git clone
  2. git fetch <remote-name>

5.3 推送数据

  1. git push <remote-name> <branch>
  2. git push origin serverfix:awesomebranch 推送serverfix分支到远程的awesomebranch分支

5.4 避免输入密码

git config –global credential.helper [cache|store] // cache/store 二选一

5.5 跟踪分支

从一个远程跟踪分支检出一个本地分支会自动创建一个叫做 “跟踪分支”(有时候也叫做 “上游分支”)。 跟踪分支是与远程分支有直接关系的本地分支。 如果在一个跟踪分支上输入 git pull,Git 能自动地识别去哪个 服务器上抓取、合并到哪个分支。

  1. git clone clone 的同时会设置为本地分支的跟踪分支
  2. git checkout -b serverfix origin/serverfix 以origin/serverfix创建本地分支
  3. git checkout –track origin/serverfix 与上条一样
  4. git checkout -b sf origin/serverfix
  5. git branch -u origin/serverfix 显示设置上游分支,–set-upstream-to 同样 git merge @{u} @{u}代表上游分支
  6. git branch -vv 查看所有跟踪分支情况
  7. git fetch –all;git branch -vv 查看最新的领先与落后情况
  8. git pull git pull 都会查找当前分支所跟踪的服务器与分支,从服务器上抓取数据然后尝 试合并入那个远程分支。

5.6 删除远程分支

git push origin –delete serverfix

5.7 变基(rebase)

  • 与merge的最终结果一样,但是变基使提交历史成了串行的
  • git checkout experiment
  • git rebase master
    • 将在experiment上做的修改放到 master 分支上,并且将experiment的指针指到master的前面
  • git checkout master
  • git merge experiment

5.7.1 复杂的变基

  • git rebase –onto master server client
    • 取出 client 分支,找出处于 client 分支和 server 分支的共同祖先之后的修改,然 后把它们在 master 分支上重演一遍
  • git checkout master
  • git merge client
  • git rebase master server
    • 将 server 中的修改变基到 master 上
  • git checkout master
  • git merge server
  • git branch -d client
  • git branch -d server

不要对在你的仓库外有副本的分支执行变基。 只要你把变基命令当作是在推送前清理提交使之整洁的工具,并且只在从未推送至共用仓库的提交上执行变基命 令,你就不会有事。 假如你在那些已经被推送至共用仓库的提交上执行变基命令,并因此丢弃了一些别人的开发 所基于的提交,那你就有大麻烦了,*你的同事也会因此鄙视你*。 总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变 基操作,这样,你才能享受到两种方式带来的便利。

6 参考文献

[1]git 官方中文文档 https://git-scm.com/book/zh/v2

Last Updated 2017-03-31 五 20:58.
Render by hexo-renderer-org with Emacs 25.1.1 (Org mode 9.0.2)