Git的杀手级特性 —— Git分支
文章目录
- Git分支本质是指向提交对象的可变指针。
- Git默认分支名是
master
- 在每次提交操作之后都会有一个指向最后提交对象的
master
分支 master
分支会在每次提交时自动向前移动
- 在每次提交操作之后都会有一个指向最后提交对象的
分支创建
-
使用
git branch
命令# 分支创建 git branch <分支名> # 比如创建分支dev git branch dev # 查看所有分支 git branch # 删除分支 git branch -d <分支名>
-
Git中特殊指针
HEAD
, 它指向当前所在的本地分支, 当你切换分支的时候HEAD
指针也会指向指定的分支 -
Git分支只是创建了一个可以移动的新指针
-
git branch <分支名>
命令只是创建了新分支, 并没有自动切换到新的分支中去 -
新创建的分支和当前所在的分支所指的对象都是一样的, 不一样的是HEAD指针只指向当前所在的分支
分支切换
-
使用
git checkout
命令# 切换分支 git checkout <分支名> # 比如切换到dev分支 git checkout dev # 新建分支并切换到该分支 git checkout -b <分支名>
-
分支的切换本质就是HEAD指针指向对应的分支
-
在新的分支上进行开发,分支会向后移
-
切换到主分支进行另一个版本的开发
需要注意的是两条分支的开发路线是不同的, 当然最后可以进行合并, 稍后再细说合并
-
分支的切换需要留意工作目录和暂存区里那些还没有被提交的修改, 它可能会和切换到的分支产生冲突从而阻止 Git 切换到该分支, 需要将所有修改进行提交再切换分支
-
当切换分支的时候,Git 会重置工作目录,使其变回原来那个分支上最后一次提交的样子
- Git 会自动添加、删除、修改文件以确保此时工作目录和这个分支最后一次提交时的样子一模一样
分支的合并
-
使用
git merge
命令进行合并# 先切换到合并入的分支 git checkout <分支名> # 在将要合并的分支合并到该分支 git merge <分支名> -m '提交说明' # 举个栗子将dev分支合并到master分支 # 先切换到master分支 git checkout master # 再合并dev分支 git merge dev -m '将dev分支合并到master分支'
-
假设一种情况是 master分支和dev分支在同一条开发线上
- 因为此时的master分支和dev分支是在同一条开发线上, 也就是master分支可以顺着分支走到另一个分支, 那么在合并的时候, Git只会将master指针向前推进, 这种情况下没有需要解决的分歧, 这也叫做快进(fast-forward)
-
另一种就是master分支和dev分支在不同的开发线上
-
合并分支就是
-
分支合并后, 被合并的分支并没有消失, 如果不需要该分支的话可以删除掉
# 删除的分支 git branch -d <分支名> # 比如删除dev分支 git branch -s dev
-
每次冲突合并都会记录到日志文件中, 可以通过
git log
进行查看
遇到冲突的分支合并
-
当冲突产生时, Git也会将不冲突的部分进行合并, 但是它不会自动创建一个新的合并进行提交, 而是暂停下来, 等待你解决冲突。
- 使用
git status
可以查看那些未合并文件的状态(unmerge)
- 使用
-
可以通过
cat
命令查看git为你标出的冲突文件
- 也可以通过
git mergetool
, 启动可视化的合并工具, 这个本身就是vim编辑器
- 修改完后使用
git status
进行查看是否已解决冲突 - 然后可以使用
git commit
进行提交即可完成冲突合并
分支管理
-
git branch
命令很有帮助# 列出所有分支 git branch # 查看已合并到当前分支的分支 git branch --merged # 查看未合并到当前分支的分支 git branch --no-merged # 删除分支 git branch -d # 强制删除分支 git branch -D <分支名>
远程分支
-
远程仓库的信息查看
# 查看所连接的仓库 git remote # 列出远程仓库引用的完整列表 git ls-remote <remote> # 获取远程分支的信息 git remote show <remote>
比如 :
-
推送分支
git push <remote> <branch>
-
更新远程仓库的分支(即同步数据)
# 从服务器上抓取本地没有的数据时,但并不会修改工作目录中的内容 git fetch <remote> # 从服务器中抓取你需要同步的分支, 若有冲突则需要解决冲突才能覆盖到本地的工作目录中 git pull <remote> <branch>
-
删除远程分支
git push <remote> --delete <branch>