首先需要了解一下几个命令的作用:
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 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
合并模型:
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用来承载两个的内容
//SINCE20160116
我的博客网站:http://huyuxin.top/欢迎大家访问!评论!