查看分支:
[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仓库中有两个分支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
注意: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抓取远程仓库新提交的文件
给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
推送单个标签到远程仓库:
[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中所有命令都支持设置别名,使命令可以简写,提高使用效率
设置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:
[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