22.9 分支管理
22.10 远程分支管理
22.11 标签管理
22.12 git别名
22.9 分支管理
当某个版本的代码已经上线了正在开发新功能时,发现了此版本有bug,为了不影响新功能的开发会使用分支来处理bug,再把处理bug的分支融合到主分支上(开发新功能)。分支之间是互不影响的。
查看分支
格式:git branch
1
2
3[root@kun02 gitroot]# git branch
* master
*表示当前所在的分支
新建分支
格式:git branch 新分支名字
1
2
3
4[root@kun02 gitroot]# git branch test
[root@kun02 gitroot]# git branch
* master
test
切换分支
格式:git checkout 切换的分支名
1
2
3
4
5[root@kun02 gitroot]# git checkout test
切换到分支 'test'
[root@kun02 gitroot]# git branch
master
* test
分支之间是互不影响的,内容可以不一样
在test分支上新建文件1
2
3
4
5[root@kun02 gitroot]# echo "aaaa" > 2.txt
[root@kun02 gitroot]# ls
1.txt 2.txt
[root@kun02 gitroot]# git add 2.txt ##添加新文件并提交
[root@kun02 gitroot]# git commit -m "add 2.txt"
回去master分支上并没发现新建的文件1
2
3
4[root@kun02 gitroot]# git checkout master
切换到分支 'master'
[root@kun02 gitroot]# ls
1.txt
合并分支
格式:git merge 要合并的分支名
合并分支前提是先切换到目标分支(旧分支)上 ,在把合并的分支(新编辑分支)合并到目标分支上1
2
3
4
5[root@kun02 gitroot]# git checkout master
切换到分支 'master'
[root@kun02 gitroot]# git merge test ##把test分支合并到master分支上
[root@kun02 gitroot]# ls
1.txt 2.txt
合并分支只是合并内容,分支本身不会消失。
分支冲突
如果master分支和test分支都对2.txt进行了编辑,当合并时会提示冲突,需要先解决冲突才可以继续合并。
解决冲突的方法是在master分支下,编辑2.txt,改为test分支里面2.txt的内容。然后提交2.txt,再合并test分支。
但是这样有一个问题,万一master分支更改的内容是我们想要的呢? 可以编辑2.txt内容,改为想要的,然后提交。切换到test分支,然后合并master分支到test分支即可(倒着合并)。合并分支有一个原则,那就是要把最新的分支合并到旧的分支。也就是说merge后面跟的分支名字一定是最新的分支。
删除分支
格式:git branch -d 要删除的分支
1
[root@kun02 gitroot]# git branch -d test
强制删除分支
当分支没有合并,删除之前会提示,那就不合并,可以强制删除
格式:git branch -D 要删除的分支
1
[root@kun02 gitroot]# git branch -D test
分支的原则
- 对于分支的应用,建议大家以这样的原则来:
- master分支是非常重要的,线上发布代码用这个分支,平时我们开发代码不要在这个分支上。
- 创建一个dev分支,专门用作开发,只有当发布到线上之前,才会把dev分支合并到master
- 开发人员应该在dev的基础上再分支成个人分支,个人分支(在自己pc上)里面开发代码,然后合并到dev分支
例如dev分支合并bob分支的命令是:1
2git checkout dev //先切换到dev分支
git merge bob
22.10 远程分支管理
在远程仓库点Branch:master来创建新的分支
但到了本地要克隆仓库时 默认只把master分支克隆下来,如果想把所有分支都克隆下来,需要手动创建,在本地创建和远程分支对应的分支
克隆远程分支到本机
格式:git checkout -b 本地分支名 origin/远程分支名
1
2
3[root@kun02 test]# git checkout -b dev origin/dev ##本地和远程分支的名称要一致
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
切换到一个新分支 'dev'
查看远程分支情况
格式:git ls-remote origin
1
2
3
4[root@kun02 test]# git ls-remote origin
586eeea82f05a0ee598d344ee127eb5ba7c38b40 HEAD
d989d94cc5989bfa6c806022d33012e1f84cdcd4 refs/heads/dev
586eeea82f05a0ee598d344ee127eb5ba7c38b40 refs/heads/master
推送本地分支到远程上
格式:git push origin 本地分支名
对于推送分支有两种情况:
当本地分支和远程分支一致时,git push会把所有本地分支的变更一同推送到远程,如果想只推送一个分支,使用
git push origin branch-name
1
2
3
4
5
6
7[root@kun02 test]# git push origin dev ##几个分支都有更改,只指定推送dev分支到远程上
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 318 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:kun0769/test.git
83a8cc2..2c3ba25 dev -> dev当本地分支比远程分支多,git push只推送本地和远程一致的分支,想要把多出来的本地分支推送到远程时,使用
git push origin branch-name
1
2
3
4
5
6
7
8[root@kun02 test]# git push origin dev2 ##远程上没有dev2 这里推送本地dev2上去
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 249 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To git@github.com:kun0769/test.git
* [new branch] dev2 -> dev2
远程机器上多了dev2分支
22.11 标签管理
标签
类似于快照
功能,可以给版本库打一个标签,记录某个时刻库的状态。也可以随时恢复到该状态。一般打标签都是给master打标签。
新建标签
格式:git tag 标签名
1
2
3[root@kun02 test]# git checkout master ##先切换到master分支上
切换到分支 'master'
[root@kun02 test]# git tag v1.0
查看所有标签
格式:git tag
1
2[root@kun02 test]# git tag
v1.0
查看标签具体信息
格式:git show 标签名
1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@kun02 test]# git show v1.0
commit 292e13521e6726a733b3548748639d1d422ce8dd
Author: kun <aaa@123.com>
Date: Fri Aug 31 07:35:53 2018 +0800
add 2.txt
diff --git a/2.txt b/2.txt
new file mode 100644
index 0000000..d72af31
--- /dev/null
+++ b/2.txt
@@ -0,0 +1 @@
+asd
tag
是针对commit
来打标签的,所以可以针对历史的commit来打tag
先查看所有提交的记录1
2
3
4[root@kun02 test]# git log --pretty=oneline
292e13521e6726a733b3548748639d1d422ce8dd add 2.txt
586eeea82f05a0ee598d344ee127eb5ba7c38b40 test
74adc57a965e35c23e673d059280b7d509f20713 first commit
或者1
2
3
4[root@kun02 test]# git log --pretty=oneline --abbrev-commit ##简写记录ID号
292e135 add 2.txt
586eeea test
74adc57 first commit
针对commit打标签
格式:git tag 标签名 记录ID号
1
[root@kun02 test]# git tag v0.9 586eeea
针对commit打标签并描述
格式:git tag -a 标签名 -m "描述内容" 记录ID号
1
2
3
4
5
6
7
8
9
10[root@kun02 test]# git tag -a v0.1 -m "1st" 74adc57a
[root@kun02 test]# git show v0.1 ##查看标签v0.1的信息
tag v0.1
Tagger: kun <aaa@123.com>
Date: Fri Aug 31 20:51:22 2018 +0800
1st
commit 74adc57a965e35c23e673d059280b7d509f20713
删除本地标签
格式:git tag -d 标签名
1
2[root@kun02 test]# git tag -d v0.1
已删除 tag 'v0.1'(曾为 1a4e9c9)
推送指定标签到远程
格式:git push origin 标签名
1
2
3
4[root@kun02 test]# git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:kun0769/test.git
* [new tag] v1.0 -> v1.0
可以发现远程仓库上已经有了更改推送的标签
推送所有标签到远程
格式:git push --tag origin
1
2
3
4
5
6
7[root@kun02 test]# git push --tag origin
Counting objects: 1, done.
Writing objects: 100% (1/1), 146 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:kun0769/test.git
* [new tag] v0.1 -> v0.1
* [new tag] v0.9 -> v0.9
远程仓库也更新了其他标签
删除远程的标签
格式:git push origin :refs/tags/标签名
1
2
3
4
5[root@kun02 test]# git tag -d v0.1 ##删除本地标签
已删除 tag 'v0.1'(曾为 f6f2e61)
[root@kun02 test]# git push origin :refs/tags/v0.1
To git@github.com:kun0769/test.git
- [deleted] v0.1
远程仓库上已经没有了v0.1的标签了
22.12 git别名
git上可以用别名来提高我们的工作效率
创建别名
格式:git config --global alias.别名 用命令名
1
2
3
4
5
6
7[root@kun02 test]# git config --global alias.ci commit ##ci是commit别名
[root@kun02 test]# echo "1a" > 3.txt
[root@kun02 test]# git add 3.txt
[root@kun02 test]# git ci -m "add 3.txt"
[master a9e376d] add 3.txt
1 file changed, 1 insertion(+)
create mode 100644 3.txt
查看所有别名
格式:gif config --list |grep alias
1
2
3[root@kun02 test]# git config --list |grep alias
alias.ci=commit
alias.br=branch
别名的配置在目录/root/.gitconfig
1
2
3
4
5
6
7[root@kun02 test]# cat /root/.gitconfig
[user]
email = aaa@123.com
name = kun
[alias]
ci = commit
br = branch
取消别名
格式:git config --global --unset alias.别名
1
[root@kun02 test]# git config --global --unset alias.br
小技巧
使用颜色和别名git lg来替代git log1
[root@kun02 test]# git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
1 | [root@kun02 test]# git lg |