关于Git本地分支与合并的理解

首先需要了解一下几个命令的作用:

1
2
3
4
5
git branch //创建分支
git tag //给固定的commit做标记
git checkout //在固定分支之间进行切换
git stash //切换分支之前保存本地修改
git merge //合并分支

分支:个人理解就是在当前工作区间向下衍生的一个分支,类似于继承,具有父节点的内容,不同的是,当分支修改时,原来的衍生体(父结点)不受影响。
下面拿一个简单的例子说一下就明白了:
在master下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
git init git_checkout_merge  
cd git_checkout2_merge
vim master.txt //写入以下内容
Initial commit on master
git add . //添加到暂存区
git commit –m “Initial commit on master”//提交这次写入
vim master.txt //再次编辑写入以下内容
Second commit on master
git add .
git commit –m “Second commit on master”
git branch test //创建一个叫test的分支
git checkout test //切换到test分支
ls //我们会发现里面有master.txt文件,
vim master.txt //我们会发现他的内容和master下编辑的一样。这就是为什么说类似于继承
Initial commit on test //在后边接着编辑这些内容
touch test.txt //多创建一个文件更好区分
git add .
git commit –m “Initial commit on test”

如果你返回master或者关闭git再次打开进入master,打开master.txt,你会发现里面只有
Initial commit on master
Second commit on master

1
git log --oneline  --decorate  --groph  - -all  //查看历史示意图

groph

(其中每一次的commit用20位的十六进制SHA-1 Hash值来引用)

1
2
git config  - -global  - -alias.lol “log --oneline  --decorate  --groph  - -all”
//这样将lol代替log --oneline --decorate --groph - -all,下次输入git lol就可以查看历史示意图
1
2
3
4
5
git tag v1 93fab //后面接上前几位(足以区分的位数)SHA -1 Hash 表示给哪一个commit做标记
git tag v2 //在后面不标明给哪一个commit做标记时是HEAD指向的当前commit如当前的是Second on master
git tag –a “INATIAL_COMMIT”93fa //同样可以做标记,区别在于INATIAL_COMMIT指向的是一个tag对象
git tag //查看所有的tag
git lol //再次查看历史示意图

git_lol

1
git checkout v1 //切换到指定的分支

v1
这时系统提示你,你处在于一个detached HEAD状态,HEAD引用直接指向一个commit,而不是一个分支名,再继续工作,切换到别的分支时可能造成数据丢失,同时告诉我们可以通过 git checkout –b <new-branch_name>的方式创建并切换到别的分支,其实git checkout –b <new-branch_name>就是 git branch 和git chechoutl两个命令的组合。

1
2
3
4
5
git checkout –b fix_v1  //创建并切换到fix_v1分支
vim master.txt //我们再一次打开编辑并提交
shash1 //写入这些内容(随意)
git add .
git checkout master //如果我们这时候提出切换分支到master

master1
提示需要先提交这些修改或者将这些修改stash起来

1
2
3
4
5
git stash save –a “stash1“//切换分支之前保存本地修改 –a表示将暂存区一并保存
git checkout master
/**stash之后如何再次回到之前stash的内容呢?**/
git checkout fix_v1
git stash list //查看stash列表

stash_list1

1
2
3
4
5
6
git stash pop  - -index stash@{0}  //用- -index将暂存区一并还原
git stash list //你会发现还原后stash 列表被清空了
git stash apply - -index stash@{0} //还原并不清空stash列表
git stash drop //删除stash list顶层那项
git stash drop stash@{0} //删除stash list的指定项
git stash clear //清空stash 列表

本地分支的合并

  1. fast-farword merge
    1
    2
    3
    4
    5
    6
    7
    git checkout –b test_merge
    vim master.txt
    Initial commit on test_merge //写入内容
    git add .
    git commit –m “Initial commit on test_merge”
    git checkout master
    git merge test_merge

因为test_merge衍生自master,所以这一次合并只是将HEAD引用指向test_merge
merge1

合并模型:
merge2

  1. non-fast-farword merge
    注意示意图文件结构

git_lol2

1
git merge test  //如果合并内容有冲突,可以取消在这次合并或者编辑冲突文件

merge_test

1
2
git merge – abort  //取消在这次合并
vim master.txt //编辑冲突文件,留下想要的内容

vi_master.txt

1
2
git add master.txt
git commit //这是系统提示这是merge操作,保存就可以了

合并模型:
master此时和test并没有衍生关系,git merge test 会先生成一个commit用来承载两个的内容
merge_test2

1
//SINCE20160116

我的博客网站:http://huyuxin.top/欢迎大家访问!评论!

您的一份奖励,就是我的一份激励