您的位置:首页 > 其它

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

2016-01-15 20:57 357 查看
首先需要了解一下几个命令的作用:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: