1、分支的基础知识
1-1、分支的介绍
分支其实就是指针,执行commit对象
1-2、创建一个分支
git branch testing ,可以创建一个新的分支,此时这个分支的指针会指向当前你所在的分支所指向的commit object 上。
如何查看各个分支指向哪个commit object 呢?使用 git log --oneline --decorate 命令即可,会给你显示出来
1-3、切换分支
git checkout testing,此时就可以切换到 testing 分支,此时 HEAD 指针会指向 testing 分支。
git checkout -b testing ,这是一个组合命令,创建分支的时候就切切换到该分支了。
此时如果在 testing 分支上提交代码,那么 commit 树就会长出一个新的 commit object ,而 testing 分支指针会指向最新的 commit object ,HEAD继续指向 testing 分支指针,而master 指针还是指向之前的那个 commit object。
git checkout master ,会切回到 master 分支,此时 HEAD 指针会指向 master 指针,同时将 master 指针指向的那个 commit object ,对应的 tree 和 其中的 blob,也就是对应文件快照恢复到工作区中。
2、远程分支
在你本地你可以创建一个分支,然后开发代码,但是后续的话,你肯定是要将本地分支推送到远程仓库里面去的。
git push -u origin 分支名称
这个命令执行,表示将当前所在的分支同后面远程的分支名称关联起来,这样后面执行 git push 或者 git pull的时候,就直接代表拉取或者推送到相应的远程分支上面去了,一般这个分支名称就是写当前所在的分支名称。
如果其他人要将某个远程仓库的分支拉取下来,应该执行一个命令,叫做git fetch origin,就会抓取下来远程仓库新增了哪些分支。
接下来可以执行一个命令 git checkout -b 本地分支 origin/远程分支,然后这个命令一执行,就是在本地创建了一个远程分支对应的本地分支,互相关联起来。以后呢,每次如果别人更新了那个分支的代码,push 到了远程仓库,你可以执行 git pull 命令,将这个分支在远程仓库的代码拉取下来,跟本地分支的代码进行合并。
举个栗子:假设我们公司 git 服务器地址是 git.leslie.com ,然后我们如果用git clone命令,从这个服务器克隆一个版本库下来,git默认会将远程版本库名为 origin,同时在本地创建一个指向远程版本库的 master 分支的本地分支,叫做 origin/master。此外,git也会在本地创建一个 master 分支,内容就是跟 origin/master 分支一样的。从git 服务器克隆版本库下来的时候,远程版本库的commit 树会一同拷贝下来,然后 origin/master 指向的 commit,就是远程版本库的master指向的commit,同时给本地创建的 master 也是指向这个commit。
此时,如果你在本地做了不少开发,然后本地 master 移动了好几个 commit ,同时 origin/master 还是指向最开始的那个 commit,而同时,远程版本库上,其他同事也提交了几次代码,因此远程版本库上的 commit 也移动了几个 commit,此时如果要让本地和远程保持同步,需要使用 git fetch origin 命令,该命令会将远程版本库的 commit 树和所有的分支都拉取下来,跟本地的 commit 树进行合并,此时可能就会在本地形成一颗有两个分叉的 commit树,本地 origin/master 会指向远程版本库的master 指向的那个 commit ,本地的master 继续指向之前本地最新的那个 commit。
3、分支命令管理
git branch | 直接执行,会显示出当前所有分支列表,以及你在哪个分支上工作 |
---|---|
git branch -v | 可以显示出每个分支当前所指向的commit object |
git branch -vv | 在 -v 的基础上可以显示本地分支跟踪的远程分支 |
git branch --merged | 可以看到哪些分支被merge 进了当前分支 |
git branch --no-merged | 可以看到哪些分支还没有merger 进当前分支 |
git branch -d 分支名 | 删除一个分支,可能会提示你被删除的分支还没有被merge到当前分支,<br />不让你删除该分支,此时可以使用git branch -D 分支名,强制删除一个分支 |