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

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

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

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

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

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

groph

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

git config  - -global  - -alias.lol “log --oneline  --decorate  --groph  - -all”
//这样将lol代替log --oneline  --decorate  --groph  - -all,下次输入git lol就可以查看历史示意图
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

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

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

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

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

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

stash_list1

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
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
2. non-fast-farword merge
注意示意图文件结构

git_lol2

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

merge_test

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

vi_master.txt

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

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

//SINCE20160116

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值