的思路,继续进行下一步的研究。
前言
昨天进行了一些基本的GIT的功能以及模式的探讨。今天深入了解一下其高级用法。即高级篇。仍旧是以命令行为基本方式。
继承之前的做法。
主题:分支
阐述:分支(branch)是为了将修改记录的这个繁体流程分叉保存。分叉后的分支不受其他分支的影响,所以在同一个数据库里可以进行多次的修改。
在软件开发时,可能有很多人同时为同一个软件进行多个功能的开发和版本管理。
分叉的分支可以合并。
为了不受其他开发人员的影响,可以在主分支上建立自己专用的分支。完成工作后将自己分支上的修改合并到主分支。因为每一次提交的历史记录都会被保存。所以当发生问题时,定位和修改造成的问题就容易多了。
master分支:在数据库进行最初的提交后,git会创建一个名为master的分支。因此之后的提交,在切换分支之前都会添加到master分支里。
分支的运用
在git中可以自由地建立分支。但是,首先要确定运用规则才可以有效地利用分支。以下为两种分支merge和topic的规则。
merge分支
merge分支是为了可以随时发布release而创建的分支。它还能作为topic分支的源分支使用。保持分支稳定的状态是十分重要的。如果啊哟进行更改,通常先创建topic分支,然后对该分支,使用工具进行自动化编译以及测试。
topic分支
topic分支是为了开发新的功能 或者修复bug而建立的分支。若要同时进行多个的任务,应该创建多个topic分支。
topic分支是从稳定的merge分支创建的。完成作业后,要将topic分支合并回merge分支。
分支的切换
若雅切换作业的分支,需要进行checkout操作。进行checkout时,git会从工作树中还原向目标分支提交修改的内容。checkout之后的修改记录将会被追加到分支。
HEAD:指向现在使用的分支的最后一次更新。
stash:还未提交的修改内容以及新添加的文件,留在索引区域或工作树的情况线下切换到其他的分支时,修改啊内容胡从原来的分支移动到目标分支。
stach是保存文件修改的临时区域。可以同时保存工作树和索引里还没有提交的修改内容,可以在事后再取出暂存的修改,应用到原先的分支或是其他的分支。
分支的合并
完成作业后的topic分支,最后要合并到merge分支。合并分支有两种方法:使用merge或rebase。使用这两种方法,合并后分支的历史记录会有很大的差别。
merge:可以合并多个历史记录的流程。即为加和并将最终结果作为当前的head。
rebase:可以将记录添加到master的分支之后。在master分支已有的基础上重新加入topic分支的内容,将topic分支的最近的一个修改内容作为head
主题:操作分支(命令行)
阐述:在命令行中进行相关操作。
mkdir new0517
cd new0517
git init
touch myfile.txt
git add myfile.txt
git commit -m "first commit"
建立分支
git branch issue1
git branch
切换分支
#若要在新建的分支issue1提交,则需要进入新建的issue1分支
#要执行checkout命令以退出分支
git checkout issue1
#查看当前分支可以用命令git branch
#在checkout命令中指定-b选项则执行创建分支并进行切换
git checkout -b issue2
#在切换到issue1的分支的状态下提交,历史记录会被记录到issue1中,在myfile.txt添加add命令的说明后再提交。
合并分支
#执行merge命令以合并分支
git merge issue1
#将更改合并到issue1
删除分支
#issue1的内容已经合并到master了,因此可以将其删除了
git branch -d <branchname>
并行操作
#尝试创建两个分支进行并行操作
git branch issue2
git branch issue3
git checkout issue2
git branch
#在issue2中修改muyfile.txt并将其提交
git add myfile.txt
git commit -m "forth commit"
git checkout issue3
git add myfile.txt
git commit -m "fifth commit"
解决合并的冲突
把issue2分支和issue3分支的修改合并到master
切换master分后,与issue2合并,接着合并issue3分支。然后提交。结果是合并出错。之后会出现问题文档,然后需要手动解决。
如图。
但是将其更改到自己希望的样子后继续提交即可。
用rebase合并。
git reset ---hard HEAD ~
#暂时取消刚才的合并
切换到issue3分支后,对master进行rebase
主题:远端数据库
阐述:执行pull可以缺德远程数据库的历史记录,执行pull可以自动完成合并
执行pull,远程数据库会自动进行合并。但是,有时只是想确认本地数据库的内容而不想合并。在这种情况下,应该使用fetch。执行fetch会得到远程数据库最新的历史记录。
其实,pull是fetch+merge完成的。
push,从本地数据库push到远程数据库时,如果发生冲突,push数据库也会拒绝的。不会给远程数据库产生任何影响。
主题:标签
阐述:标签是为了更方便地参考提交而给它标上易读的名称。
可以使用两种标签:轻标签和注解标签。打上的标签是固定的,不能改变。
轻标签:
添加名称
注解标签:
添加名称
添加注解
添加签名
一般情况下,添加标签是采用注解标签来添加注解或签名的。轻标签是为了在本地一次性使用的。
主题:标签(命令行)
阐述:建立测试目录,进行相关的git操作。
mkdir new-hello
cd new-hello
git init
vim hello.txt
git add hello.txt
git commit -m "hello world"
git tag apple
#对当前的HEAD进行标签标注
git tag
git log --decorate
git tag -a <tagname>
#进行详细标注
git tag -am "hello" banana
git tag -n
删除标签
git tag -d <tagname>
主题:改写提交
阐述:指定amend选项进行提交的话,可以修改同一个分支最近的修改内容和注解。
主要使用的场合是添加最近提交时漏掉的档案;修改最近提交的注解
改写提交:取消过去的提交
在revert可以取消指定的修改内容,使用后面要提到的rebase -i 或reset也可以删除提交。但是,不能随便删除已经发布的提交,这时需要通过revert创建要否定的提交。
主要的使用场合:安全地取消过去的提交
改写提交:遗弃提交
在reset中可以遗弃已经不需要的提交,需要根据影响的范围而指定不同的模式。可以指定是否复原索引或工作树的内容。
除了默认的mixed模式,还有soft和hard模式。
主要使用场合:复原修改过的索引的状态;彻底取消最近的提交(hard),只取消提交(soft)。
改写提交:提取提交
在cherry-pick中,可以从其他分支复制指定的提交,然后导入到现在的分支。
主要使用场合:把弄错分支的提交移动到正确的地方;
把其他分支的提交添加到现在的分支。
改写提交的历史记录
在rebase指定选项,可以改写、替换‘删除或合并提交。
主要使用场合:
在push之前,重新输入正确的提交注解;
清楚地汇合内容含义相同的提交;
添加最近提交时漏掉的档案。
汇合分支上的提交,然后一同合并到分支
merge的特殊选项,squash
用这个选项指定分支的合并,就可以把所有汇合的提交添加到分支上。
主要场景:呼和主题分支的提交,并提交到目标分支。
主题:改写提交(命令行)
阐述:将修改最近一次的提交。
#用log命令确定历史记录
git log
#修改myfile.txt内容
#添加--amend选项,然后提交
git add myfile.txt
git commit --amend
#编辑会显示最近一次提交的提交消息,把消息修改并进行保存
rvert命令取消提交
git log
git revert HEAD
git log
reset
用reset删除master分支最前面的两个提交。
git log
git reset ==hard HEAD~~
git log
git reset --hard ORIG_HEAD
cherry-pick
git checkout master
git cherry-pick 99daed2
#若有冲突,则打开文件,修改冲突部分
git add myfile.txt
git commit
rebase -i 汇合提交
git rebase -i HEAD~~
#######
git commit --amend
git rebase --continue
git checkout master
git merge --squash issue1
git add myfile.txt
git commit