关于Git本地分支与合并的理解
2016-01-15 20:57
357 查看
首先需要了解一下几个命令的作用:
分支:个人理解就是在当前工作区间向下衍生的一个分支,类似于继承,具有父节点的内容,不同的是,当分支修改时,原来的衍生体(父结点)不受影响。
下面拿一个简单的例子说一下就明白了:
在master下
如果你返回master或者关闭git再次打开进入master,打开master.txt,你会发现里面只有
Initial commit on master
Second commit on master
![](http://img.blog.csdn.net/20160115203514859)
(其中每一次的commit用20位的十六进制SHA-1 Hash值来引用)
![](http://img.blog.csdn.net/20160115203711832)
![](http://img.blog.csdn.net/20160115203819682)
这时系统提示你,你处在于一个detached HEAD状态,HEAD引用直接指向一个commit,而不是一个分支名,再继续工作,切换到别的分支时可能造成数据丢失,同时告诉我们可以通过 git checkout –b 的方式创建并切换到别的分支,其实git checkout –b 就是 git branch 和git chechoutl两个命令的组合。
![](http://img.blog.csdn.net/20160115204133852)
提示需要先提交这些修改或者将这些修改stash起来
![](http://img.blog.csdn.net/20160115204303136)
因为test_merge衍生自master,所以这一次合并只是将HEAD引用指向test_merge
![](http://img.blog.csdn.net/20160115204723452)
合并模型:
![](http://img.blog.csdn.net/20160115205108487)
![](http://img.blog.csdn.net/20160115205217691)
![](http://img.blog.csdn.net/20160115205324287)
合并模型:
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 //查看历史示意图
(其中每一次的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 checkout 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
提示需要先提交这些修改或者将这些修改stash起来
git stash save –a “stash1“//切换分支之前保存本地修改 –a表示将暂存区一并保存 git checkout master /**stash之后如何再次回到之前stash的内容呢?**/ git checkout fix_v1 git stash list //查看stash列表
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 列表
本地分支的合并
fast-farword mergegit 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
合并模型:
![](http://img.blog.csdn.net/20160115204907164)
2. non-fast-farword merge
注意示意图文件结构
git merge test //如果合并内容有冲突,可以取消在这次合并或者编辑冲突文件
git merge – abort //取消在这次合并 vim master.txt //编辑冲突文件,留下想要的内容
git add master.txt git commit //这是系统提示这是merge操作,保存就可以了
合并模型:
master此时和test并没有衍生关系,git merge test 会先生成一个commit用来承载两个的内容
![](http://img.blog.csdn.net/20160115205535529)
//SINCE20160116
相关文章推荐
- cocos3.5 lua项目目录
- Adapter.notifyDataSetChanged无法更新页面分析及解决方法
- ruby函数回调的实现方法
- ruby函数回调的实现方法
- 关于php编译安装扩展模块memcache的问题
- bzoj 3065 带插入区间k小值
- 点到线段的最短距离
- android 下拉菜单 Spinner
- MR程序的几种提交运行模式
- Bridging signals(DP)
- Linux写时拷贝技术(copy-on-write)
- Codeforces Round #339 (Div. 2) A.Link/Cut Tree
- Hbase与mapreduce结合使用
- Eclipse中添加文档注释快捷键
- Lua中的table函数库
- Redis的字典(dict)rehash过程源代码解析
- SQL Nexus
- Hexo系列教程(三):Hexo部署到github(Coding也差不多)
- Dollar Dayz(DP)
- Java数据结构之linkedhashset