读git书籍笔记(精通git - 第二版)第二节:Git的分支机制

2.1 创建新分支:git branch testing

git branch testing:创建一个名为testing 的新分支(基于当前分支master分支建立新的分支)
实际上Git维护着一个名为HEAD的特殊指针,HEAD指向当前所在的本地分支的指针。
可以通过git log --oneline --decorate来产看各个分支当前所指向的对象。

$git log --oneline --decorate
1f40fa9 (HEAD -> master, tag: v1.3, tag: v1.1, testing) xx
e9b0c95 xx
0fcdd63 init project

可以看到本地分支就是HEAD所指向的master分支。

2.2切换分支:git checkout
切换并创建新的分支 git checkout -b new_branch

git checkout testing:切换到 testing 分支—>HEAD指向testing分支

// 对两个分支msater&testing分别进行变更。
$git log --oneline --decorate --graph --all
//通过以上命令会输出提交历史,显示出分支的指向以及项目历史的分叉情况。
* ef85a7d (HEAD -> master, origin/master) 新的提交
| * a02a7a4 (origin/testing, testing) 新的
|/  
* 1f40fa9 (tag: v1.3, tag: v1.1) 新提交
* e9b0c95 新的
* 0fcdd63 init project
2.3基本的分支与合并操作

一个模拟工作切换分支的例子。
(1)在网站展开工作;
(2)为新需求创建分支:
(3)在新分支上展开工作;
突然有临时需求/bug
(1)切换到生产环境分支
(2)创建新的分支解决bug
(3)通过测试之后,合并热修补分支并推送到生产环境中
(4)切换回之前的分支继续进行工作

// 切换并创建新的分支
$ git checkout -b new_branch
// 继续工作并提交了几次
// 突然有临时需求/bug,切回到生产环境分支
$ git checkout master
// 切换并创建新的分支
$ git checkout -b hotfix
//继续工作并提交了几次,测试通过,切回到生产环境分支
$ git checkout master
// 合并hotfix分支到master分支
$ git  merge hotfix
// 会看到fast-forward
// 删除该hotfix分支
$ git branch -d hotfix
2.4基本的合并操作git merge hotfix

git merge hotfix当前在master分支,将hotfix分支合并到master分支

2.5删除分支 git branch -d hotfix

git merge hotfix当前在master分支,将hotfix分支合并到master分支

2.6基本的合并冲突处理

如果在两个分支上同时改了一个文件,分支合并就会又冲突。
可以通过 git status来查看冲突,例如

git status                                                              1 ↵
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add ..." to mark resolution)

    both modified:   README.md

可以看到未合并的文件README.md,解决办法:
*可以通过打开文件,手动解决冲突,提交代码即可解决。

  • 可以通过图形化工具解决冲突,可以执行git mergetool
$ git mergetool

This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
tortoisemerge emerge vimdiff
Merging:
README.md

Normal merge conflict for 'README.md':
  {local}: modified file
  {remote}: modified file
Hit return to start merge resolution tool (vimdiff):
// 以下自己探索吧!
2.7查看分支列表 git branch
$git branch
* master
  testing
// * 所在的分支,为当前工作分支,即HEAD分支

git branch -v:可以看到每个分支上的最新提交
git branch --merged:筛选已并入当前分支的分支

$git branch -v

* master  1a67967 new1
  testing 0c28926 new2

git branch --no-merged:筛选未并入当前分支的分支

$git branch --no-merged
testing
// 由于testing并未合并到主分支,则git branch -d testing不能删除它
2.7创建与远程分支不同的本地分支 git checkout -b newHead origin/master
2.8给本地已存在的分支设置跟踪分支,或者要更改本地分支对应的远程分支git branch -u origin/master
2.9 查看本地分支跟踪的远程分支

git branch -vv

2.10删除远程分支 git push origin --delete testing

变基 (合并分支的另一种方法)

把某个分支上的所有提交的更改在另一个分支上重现一遍git rebase master

编辑操作的工作原理:首先找到两个要整合的分支的共同祖先,然后取到当前分支的每次提交引入的更改(diff),并把这些提交保存为临时文件,然后将当前分支重置为要整合的分支,最后在该分支上一次引入之前要保存的每个更改,

$git checkout testing
$git rebase master

然后回到要整合的分支

$git checkout master
$git merge testing

你可能感兴趣的:(读git书籍笔记(精通git - 第二版)第二节:Git的分支机制)