git分支管理、标签管理、别名设置、搭建git服务器

git本地仓库分支管理

查看分支:

[root@linux ~]# cd /data/git2/
[root@linux git2]# git branch 
* master
[root@linux git2]# ls
a.log

#当前分支下存在a.log文件

创建分支:

[root@linux git2]# git branch test

切换分支:

[root@linux git2]# git checkout test 
切换到分支 'test'
[root@linux git2]# git branch 
  master
* test
[root@linux git2]# ls
a.log

#前面的*号表示当前所在分支,新建的分支会包含master分支的文件,因为该分支是在master下创建

在test分支创建的文件提交本地仓库后不会在master分支显示:

[root@linux git2]# echo "1" > a.txt
[root@linux git2]# git add a.txt
[root@linux git2]# git commit -m "add a.txt"
[root@linux git2]# ls
a.log  a.txt
[root@linux git2]# git checkout master 
切换到分支 'master'
[root@linux git2]# ls
a.log

合并分支:

[root@linux git2]# git checkout master 
切换到分支 'master'
[root@linux git2]# git merge test 
Merge made by the 'recursive' strategy.
 a.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt

#将test分支合并到master,需要先切换到master分支

合并后即可显示test分支创建的文件:

[root@linux git2]# ls
a.log  a.txt

合并后继续在test分支下修改a.txt,可以再次合并将更新后的文件同步到master分支:

[root@linux git2]# git checkout test 
切换到分支 'test'
[root@linux git2]# echo "123" >> a.txt 
[root@linux git2]# git add a.txt
[root@linux git2]# git commit -m "ch"
[test 4ae67ad] ch
 1 file changed, 1 insertion(+)
[root@linux git2]# git checkout master 
切换到分支 'master'
[root@linux git2]# git merge test 
Merge made by the 'recursive' strategy.
 a.txt | 1 +
 1 file changed, 1 insertion(+)
[root@linux git2]# ls
a.log  a.txt
[root@linux git2]# cat a.txt 
1
123

但是当两个分支分别对a.txt文件修改了不同的内容时,合并就会冲突:

[root@linux git2]# echo "aaa" >> a.txt 
[root@linux git2]# git add a.txt
[root@linux git2]# git commit -m "ch"
[master 81e7666] ch
 1 file changed, 1 insertion(+)
[root@linux git2]# git checkout test 
切换到分支 'test'
[root@linux git2]# echo "bbb" >> a.txt 
[root@linux git2]# git add a.txt
[root@linux git2]# git commit -m "ch"
[test 48b6f53] ch
 1 file changed, 1 insertion(+)
[root@linux git2]# git checkout master 
切换到分支 'master'
[root@linux git2]# git merge test 
自动合并 a.txt
冲突(内容):合并冲突于 a.txt
自动合并失败,修正冲突然后提交修正的结果。
[root@linux git2]# cat a.txt 
1
123
<<<<<<< HEAD
aaa
=======
bbb
>>>>>>> test

#两个分支的不同会在<<<<<<< HEAD和>>>>>>> test之间显示,而<<<之前或>>>之后的部分是两个分支都相同的地方,处理冲突的方法:当master分支的新内容aaa被需要时,将master分支的a.txt文件添加一行bbb后再合并,如果aaa是不需要的内容,可以直接将a.txt文件内容改为与test分支的a.txt文件内容相同即可解决合并的冲突

注意:合并分支有一个原则,那就是要把最新修改的分支合并到旧的分支,也就是说merge后面跟的分支名字一定是最新修改过的分支

删除分支:

[root@linux git2]# git branch -d test 

如果分支未合并,使用 -D参数强制删除:

[root@linux git2]# git branch -D test 

补充:
1.master分支是非常重要的,线上发布代码用这个分支,平时我们开发代码不要在这个分支上
2.创建一个dev分支,专门用作开发,只有当发布到线上之前,才会把dev分支合并到master
3.开发人员应该在dev的基础上再分支成个人分支,在自己的个人分支里面编写代码,然后合并到dev分支

GitHub远程分支管理

当前GitHub仓库中有两个分支master和dev:
在这里插入图片描述
克隆GitHub仓库到本地:

[root@linux ~]# cd /data/
[root@linux data]# git clone [email protected]:AsnFy/git_test.git

查看GitHub远程仓库上的所有分支:

[root@linux data]# cd git_test/
[root@linux git_test]# git ls-remote origin 
d18f952dd7450648f97b4d79c71c6cf9af235798	HEAD
d18f952dd7450648f97b4d79c71c6cf9af235798	refs/heads/dev
d18f952dd7450648f97b4d79c71c6cf9af235798	refs/heads/master

查看本地仓库分支:

[root@linux git_test]# git branch 
* master

#git clone默认只克隆master分支,如果想把所有分支都克隆下来,需要手动创建

在本地创建和远程分支对应的分支,分支名需对应:

[root@linux git_test]# git checkout -b dev origin/dev
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
切换到一个新分支 'dev'
[root@linux git_test]# git branch 
* dev
  master

在dev分支创建新文件:

[root@linux git_test]# echo "test" > 1.txt
[root@linux git_test]# git add 1.txt
[root@linux git_test]# git commit -m "add 1.txt"

推送到GitHub:

[root@linux git_test]# git push

查看GitHub仓库:
在这里插入图片描述
#新文件已显示在dev分支中

注意:git push 命令是推送所有分支到GitHub,如果只想推送单个分支(dev),使用:git push origin dev

在本地创建的分支,远程仓库没有时,使用git push也不会推成功,需要单独指定:

[root@linux git_test]# git branch dev2
[root@linux git_test]# git checkout dev2

#新建本地分支dev2

推送到远程仓库:

[root@linux git_test]# git push origin dev2

#如果推送失败,先执行git pull抓取远程仓库新提交的文件

查看GitHub:
在这里插入图片描述
#dev2分支已显示

git标签管理

给master分支创建标签:

[root@linux git_test]# git checkout master 
切换到分支 'master'
[root@linux git_test]# git tag v1.0

查看所有标签:

[root@linux git_test]# git tag 
v1.0

查看标签信息:

[root@linux git_test]# git show v1.0 
commit d18f952dd7450648f97b4d79c71c6cf9af235798
Author: AsnFy <[email protected]>
Date:   Tue Dec 24 20:53:54 2019 +0800

    Create README.md

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1e523a5
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# git_test

tag是针对commit来打标签的,所以可以针对历史的commit来打tag,查看历史的commit:

[root@linux git_test]# git log --pretty=oneline --abbrev-commit 
d18f952 Create README.md
f460772 Create abc.sh
2b99b7b add file 1.txt

针对历史commit打标签:

[root@linux git_test]# git tag v0.9 f460772

还可以使用-m参数添加标签的描述:

[root@linux git_test]# git tag -a v0.1 -m "first tag" 2b99b7b

描述会在标签的详情中显示:
在这里插入图片描述
删除指定标签:

[root@linux git_test]# git tag -d v0.1

推送所有标签到远程仓库:

[root@linux git_test]# git push --tags origin 
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:AsnFy/git_test.git
 * [new tag]         v0.9 -> v0.9
 * [new tag]         v1.0 -> v1.0

查看GitHub:
在这里插入图片描述
#标签已显示

推送单个标签到远程仓库:

[root@linux git_test]# git push origin v1.0

如果本地删除了一个标签v1.0,也需要删除远程仓库标签:

[root@linux git_test]# git push origin :refs/tags/v1.0

通过git show tagname查看标签信息中的commit,即可使用git reset --hard xxxxx恢复该标签对应的版本

设置git命令别名

git中所有命令都支持设置别名,使命令可以简写,提高使用效率

设置branch命令别名为b:

[root@linux git_test]# git config --global alias.b branch
[root@linux git_test]# git b
  dev
  dev2
* master

设置checkout命令别名为c:

[root@linux git_test]# git config --global alias.c checkout
[root@linux git_test]# git c dev
切换到分支 'dev'

查看git别名使用命令:

[root@linux git_test]# git config --list |grep alias
alias.b=branch
alias.c=checkout

也可以通过用户目录下的隐藏文件.gitconfig查看:

[root@linux git_test]# cat /root/.gitconfig 
[user]
	email = [email protected]
	name = zhangsan
[alias]
	b = branch
	c = checkout

取消别名:

[root@linux git_test]# git config --global --unset alias.b

补充:日志别名

[root@linux git_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"

查看日志:

[root@linux git_test]# git lg
* 103fd08 - (HEAD, origin/dev2, origin/dev, dev2, dev) add 1.txt (76 分钟之前) <zhangsan>
* d18f952 - (tag: v1.0, origin/master, origin/HEAD, master) Create README.md (66 分钟之前) <AsnFy>
* f460772 - (tag: v0.9) Create abc.sh (30 小时之前) <AsnFy>
* 2b99b7b - add file 1.txt (30 小时之前) <zhangsan>

#从左到右分别是commit、描述、时间、操作用户

git服务器搭建

在服务端安装git:

[root@linux02 ~]# yum -y install git

创建git用户:

[root@linux02 ~]# useradd git -s /usr/bin/git-shell

#指定shell为了避免该用户远程登录服务器

在git用户家目录创建authorized_keys文件,用于存储客户端公钥:

[root@linux02 ~]# cd /home/git/
[root@linux02 git]# mkdir .ssh
[root@linux02 git]# touch .ssh/authorized_keys
[root@linux02 git]# chown -R git.git .ssh/
[root@linux02 git]# chmod 600 .ssh/authorized_keys 

创建git仓库目录:

[root@linux02 git]# mkdir /data/gitroot

初始化仓库:

[root@linux02 gitroot]# git init --bare test.git

#bare选项会创建一个裸仓库test.git,裸仓库没有工作区,因为服务器上的git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的git仓库通常都以.git结尾

更改所属主/组为git:

[root@linux02 gitroot]# chown -R git:git test.git/

#git服务器已搭建完成

在客户端生成秘钥:

[root@linux ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:i84mpMSKfrLMFT1xndEO14Zj/Jms9ss/JRjOJYhbOrg root@linux
The key's randomart image is:
+---[RSA 2048]----+
|         .o o    |
|        ..oB o   |
|     . . +=.= o  |
|    . o . o.o=.  |
| . . o .S+ o.=   |
|  o o o.+. o+ . .|
|.o +  ..... .  ..|
|=.o..oE     .. . |
|.=+  oo      oo..|
+----[SHA256]-----+

将公钥的内容添加到客户端的/home/git/.ssh/authorized_keys文件中:

[root@linux ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDxobP7gsY9dVH8QtZnhLVlBO74YFE7vyyt6iG2udFqOnQkT9seb6CCNjxjkKk+ky0Rp/oQ8xlXnLEEF5yrwY7MxT3xp2F5J/2Qi3ChciV1NCbLTTyfsDZ7KiYLia98RFfTAjPH0+NbHmmNqD82QnDzsyEXZ9xG7E7+u15IkgNePwT9raeyOo+E4mGIm3a1XrgijqZqUDC5NeFGAPpXGydmjzobLS/VCHGSdHTRHeEGaTIh/fzypLkImJi81jg1Kn2lD9ktTKGYFO+62GJ8o1JvG2M5RYQ6xjs/fPiHsLzJ0yA84Hu+TpH1cSzPezYP3pCDlj23J11D+VtRBGSg/pV9 root@linux

克隆远程仓库到客户端:

[root@linux ~]# git clone [email protected]:/data/gitroot/test.git

创建新文件:

[root@linux ~]# cd test/
[root@linux test]# git branch 
[root@linux test]# echo "12345" > 1.txt
[root@linux test]# git add 1.txt
[root@linux test]# git commit -m "add 1.txt"
[master(根提交) 2674040] add 1.txt
 1 file changed, 1 insertion(+)
 create mode 100644 1.txt

推送到git服务器:

[root@linux test]# git push origin master 
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/data/gitroot/test.git
 * [new branch]      master -> master

#第一次推送需要指定分支名称,因为git服务器是空的,还没有分支,之后推送master分支下的新文件直接git push即可

换个目录再次克隆git服务器的远程仓库:

[root@linux test]# cd /home/
[root@linux home]# git clone [email protected]:/data/gitroot/test.git

客户端推送到git服务器的文件已显示:

[root@linux home]# ls test/
1.txt
[root@linux home]# cat test/1.txt 
12345
发布了114 篇原创文章 · 获赞 851 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Powerful_Fy/article/details/103683623