分布式版本控制-Git(二)

时间:2022-04-05 06:12:19

七、分支管理

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

分布式版本控制-Git(二)


当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
分布式版本控制-Git(二)
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
分布式版本控制-Git(二)


案例:
第一步:创建dev分支,然后切换到dev分支:
$ git checkout -b dev
等价于:$ git branch dev
$ git checkout dev
第二步:查看当前分支:
$ git branch
第三步:在当前dev分支上,编写文件test.txt,并提交到dev分支:
$ git add test.txt
第四步:切换分支到master:
$ git checkout master
此时,在master分支上并不能看到test.txt文件
分布式版本控制-Git(二)
第五步:把dev分支的工作成果合并到master分支上:
$ git merge dev
第六步:删除dev分支:
$ git branch -d dev

八、解决冲突

第一步:创建新分支,并在此分支上修改test.txt文件,然后提交:
$ git checkout -b feature1
修改test.txt文件
$ git add test.txt -m "change text on feature1"
第二步:切换到master分支,修改test.txt文件,然后提交:
$ git checkout master
修改test.txt文件
$ git add text.txt -m "change text on master"
第三步:将feature1分支合并到master
$ git merge feature1
此时,由于冲突报错了,现需要修改其中一分支下的文件,然后重新提交,合并!

查看分支合并情况:
$ git log --graph --pretty=oneline --abbrev-commit

$ git merge --no-ff -m "merge with no-ff" dev
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而默认的fast forward合并就看不出来曾经做过合并。

九、BUG分支

当正在dev分支上开发新任务时,测试组给提了一个线上的bug需及时修复,这是就需要在master分支上创建新分支来进行修复,但是开发的现场又需要保存下来!
第一步:查看当前分支信息,当前分支dev上还有未完成待提交的文件,并保存现场:
	$ git status
	$ git stash
第二步:切换到master分支,并创建bug分支,进行bug修复:
	$ git checkout master
	$ git checkout -b issue-bug001
	$ git add text.txt
	$ git commit -m "resolve bug001"
第三步:切换到master分支,合并提交,然后删除临时分支:
        $ git checkout master
	$ git merge --no--ff -m "merge bug001" issue-bug001
	$ git branch -d issue-bug001
第四步:切换到dev分支,恢复现场,继续工作:
	$ git checkout dev
	$ git status
	$ git stash list
	$ git stash apply
	$ git stash drop
恢复现场的两种方式:
1. 恢复现场:$ git stash apply
   删除现场:$ git stash drop
2. 恢复的同时删除:$ git stash pop
恢复指定的stash:$ git stash apply stash@{0}
没有被合并的分支,删除时会报错:
$ git branch -d <name>
使用-D进行强行删除:
$ git branch -D <name>

十、多人协作

1. 当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin
查看远程库的信息:git remote
查看详细远程库信息:git remote -v
2. 推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上
推送master分支:$ git push origin master
推送dev分支:$ git push origin dev
3. 抓取分支,
获取远程分支:$ git clone git@github.com:381510688/learningGit.git
创建远程origin的dev分支到本地:$ git checkout -b dev origin/dev
把dev分支修改的文件push到远程:$ git commit -m "add modify file"
			       $ git push origin dev
如本地没有与远程dev建立连接,需建立连接:
指定本地dev分支与远程origin/dev分支的链接:$ git branch --set-upstream dev origin/dev
把最新的提交从origin/dev抓下来:$ git pull
然后手动修改冲突,合并后再提交

十一、标签管理

Git的标签是版本库的快照,其本质是指向某个commit的指针。
1. 创建标签
切换到需要打标签的分支上:$ git checkout master
打标签:$ git tag v1.0
查看所有标签:$ git tag
2. 在历史的commit id上打标签
查看历史commit id:$ git log --pretty=oneline --abbrev-commit
指定commit id打标签:$ git tag v1.1 6224966
带说明的标签:$ git tag -a v1.2 -m "version 1.2 released" 6224967
3. 查看标签信息:
$ git show v1.1
4. 用PGP签名标签:
git tag -s <tagname> -m "blablabla..."
5. 推送某个标签到远程:
$ git push origin v1.0
    推送全部标签到远程:
$ git push origin --tags
6. 删除本地标签:
$ git tag -d v1.2
    删除远程标签:
$ git tag -d v1.1
$ gti push origin :refs/tags/v1.1