Pro Git 第三章 Git 分支

Git 分支

创建分支

1
git branch test
  • HEAD 指针,指向当前所在的分支(当前分支的别名)。

切换分支

1
git checkout test

此时, HEAD 指向 test 分支。 HEAD 分支随着提交操作自动向前移动。

切换分支的操作会改变你工作目录中的文件

创建并切换分支

1
git checkout -b bugfix

删除分支

1
git branch -d bugfix

分支合并

首先需要切换到你想要合并入的分支,然后执行 git merge 命令

1
2
3
git checkout master
git merge bugfix
  • 处理合并冲突,文件内容类似于这种

    1
    2
    3
    4
    5
    6
    7
    <<<<<<< HEAD:index.html
    <div id="footer">contact : email.support@github.com</div>
    =======
    <div id="footer">
    please contact us at support@github.com
    </div>
    >>>>>>> iss53:index.html

此时, ======= 是分割线,上面的是 HEAD 的内容, 下面的是 bugfix 的内容。要解决冲突,必须选择其中的一个,并且将上面的那个符号去掉, 执行 git add 命令来标记已解决。

分支管理

  • 查看所有分支

    1
    git branch

    查看每个分支的最后一次提交

    1
    git branch -v

    查看所有远程分支

    1
    git branch -a

    查看已合并到当前分支

    1
    git branch --merged

    查看未合并到当前分支

    1
    git branch --no-merged

    如果对未合并的分支执行 git branch -d 命令,会提示失败。如果真要删除分支,应该执行 git branch -D 命令。

    远程分支

    推送

    共享分支,推送本地分支到远程,执行 git push (remote) (branch) 命令。

    1
    git push origin fix748

    本质上执行过程是 Git 将 fix748 分支名字展开为 refs/heads/fix748:refs/heads/fix748 , 意味着“推送本地的 fix748 分支来更新远程仓库上的 fix748 分支”。 该命令可以达到同样的效果,如下:

    1
    git push origin fix748 : fix748

    如果要更改远程仓库的名字,执行如下命令:

    1
    git push origin fix748 : ifeng748

    拉取数据

    git fetch origin 会拉取远程分支,但本地并不会生成一个可编辑的副本, git merge origin/fix748 命令会将该分支合并到当前分支。

    跟踪分支

    从一个远程跟踪分支检出一个本地分支会自动创建一个叫做 “跟踪分支”(有时候也叫做 “上游分支”)。 跟踪分支是与远程分支有直接关系的本地分支。

    如果要以远程分支为节点开展工作,执行

    1
    git checkout -b fix748 origin/fix748

    会在本地生成一个用于工作的分支。

    • 修改本地分支的上游分支,执行如下命令:
    1
    git branch -u origin/fix748
    • 查看所有跟踪分支

      1
      2
      git branch -vv
      git branch -v

拉取

1
git pull origin master

git pull 命令相当于 git fetch origingit merge 命令的结合。

删除远程分支

1
git push origin --delete fix748

这个命令只是从服务器上移除指针。

变基

rebase :将提交到某一个分支的所有修改都移动到另一个分支上。

  • 合并

    下面列出了两个分支合并的示意图,能够很清楚的看到不同的节点。

    分支提交

    1
    git merge master

    分支合并

  • 变基

1
2
git checkout experiment
git rebase master

变基

1
2
git checkout master
git merge experiment

变基合并

两者执行的结果都是一样的,只是变基 rebase 操作使提交历史更加的简洁。

  • 变基是将一系列提交按照原有次序依次应用到另一个分支上。
  • 合并是把最终结果结合到一起。

变基的扩展

现有三个分支,节点示意图如下:

现在想把 client 分支的修改合并到 master 分支,命令如下:

1
git rebase --onto master server client

选中在 client 分支里但不在 server 分支里的修改(即 C8C9),将它们在 master 分支上重放,合并到 master 分支,

1
2
git checkout master
git merge client

接着将 server 分支的修改合并到 master 分支上来,如下:

1
2
3
git rebase master server
git checkout master
git merge server

变基有风险

谨记一条准则:

不要对在你的仓库外有副本的分支执行变基

说白了就是不要对远程仓库执行变基操作,在本地随便弄。

只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别人的提交执行变基操作。

参考文献:Git 分支 - 变基