0x0 Git常用命令速查表
0x1 Git是什么?
Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git的主要功能:
1、查看邮件或者通过其它方式查看一般开发者的提交状态。
2、打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
3、向公共服务器提交结果,然后通知所有开发人员。
0x2、基于CentOS7安装git服务
主机规划
名称 | 主机规划 | 内存 | 安装软件 | 系统 |
---|---|---|---|---|
git_server | 10.0.0.11 | 4G | yum install -y git | Centos7.6 1810 |
git_client | 10.0.0.12 | 4G | yum install -y git | Centos7.6 1810 |
git_client | 10.0.0.13 | 64G | Git+XShell | Windows10 64 |
Step 1 安装git服务
yum install -y git
[root@gitServer ~]# git --version
git version 1.8.3.1
Step 2 创建一个git用户组和用户,用来运行git服务
#查看git用户是否存在
[root@gitServerhome]#id git
id: git: no such user #提示git用户不存在
groupadd git #创建用户
useradd git -g git
#方法一设置git用户的密码
passwd git
#方法二也可以设置密码
echo git:123456|chpasswd
Step3 创建代码仓库git的拥有者
#进入home目录
cd /home
#现有仓库导出为裸仓库——即一个不包含当前工作目录的仓库
git init --bar project.git
#把仓库所属用户改为git
#-R : 处理指定目录以及其子目录下的所有文件
#将目前目录下的所有文件与子目录的拥有者皆设为 git 群体的使用者 git :
chown -R git:git project.git
#以后每创建一个新的仓库.都需要执行上面的命令(修改仓库所属用户为git)
这一步很重要,如果没有这一步,提交代码的时候报权限错误。
———————————————————————————
0x3、客户端通过终端或GUI工具迁代码
这里为了安全性我们没有设置客户端的免密登陆!!!如果觉得每次输入密码比较繁琐,可以设置免密登陆。
步骤 | 命令 | 实例 | 协议 |
---|---|---|---|
第一步 | git clone | git clone [email protected]:/home/git/project.git | SSH |
第一步 | git clone | http://git.kernel.org/pub/scm/virt/kvm/kvm.git | HTTP |
第一步 | git clone | https://git.kernel.org/pub/scm/virt/kvm/kvm.git | HTTPS |
第二步 | cd 项目目录 | cd project | 无 |
第三步 | git add | git add index.html或git add . | 无 |
第四步 | git commit | git commit -m "备注" | 无 |
第四步 | git config | git config --global user.email "[email protected]" | 无 |
第四步 | git config | git config --global user.name "xxxx" | 无 |
第五步 | git remote | git remote add origin [email protected]:/home/git/project.git | SSH |
第六步 | git push | git push -u origin master | SSH |
【注意】这里第一步我们给出了三种方式,这几种方式都可以,都是基于不同协议的克隆项目的方式。除了我们在终端下或GUI的环境中添加项目以外,我们常见的IDE集成开发环境中也集成了Git的应用。比如XCode、PHPStrom等。如下图
以下是在终端中命令行方式操作
git clone [email protected]:/home/git/project.git
#开发人员进入到项目目录
cd project
#添加修改以后的代码源文件
echo "readme">>readme.md
#添加到git中
git add .
#提交日志
git commit -m "add readme.md"
#全局配置git信息
git config --global user.email "[email protected]"
git config --global user.name "xxxx"
git config --global color.ui true #带颜色的显示
#同步远程库
git remote add origin [email protected]:/home/git/project.git
#提交代码
git push -u origin master #-u指定默认主机
第一次push提交需要-u指定主机,以后就直接push即可
git push origin master #将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
注意:git config的配置信息
名称 | 主要参数 |
---|---|
git config用户信息 | --global user.name |
git config用户信息 | --global user.email |
git config文本编辑 | --global core.editor |
git config差异分析 | --global merge.tool |
git config颜色显示 | --global color.ui |
git config配置信息 | --list |
0x4、通过Git log查看日志记录
名称 | 主要参数 | 例子 |
---|---|---|
git log | 查看提交的历史记录 | git log |
git log | --oneline 显示简洁的版本 | git log --oneline |
git log | --oneline 显示简洁的版本 | git log --oneline -5 |
git log | --reverse逆序输出 | git log --reverse --oneline |
git log | --author查找指定作者 | git log --author=xxxxx --oneline |
git log | --befire --after时间段查找 | git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges |
#查看提交的历史记录
git log
#可以用 --oneline 选项来查看历史记录的简洁的版本
git log --oneline
9cc3008 add a.txt
c01d88c add index.html
#用 --reverse 参数来逆向显示所有日志
git log --reverse --oneline
#如果只想查找指定用户的提交日志可以使用命令:git log --author
git log --author=xxxxx --oneline -5
#如果你要指定日期,可以执行几个选项:--since 和 --before,但是你也可以用 --until 和 --after。
git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
5、分支管理
git branch 分支管理
名称 | 主要参数 |
---|---|
git branch | 查看分支 |
git branch 分支名称 | 创建分支 |
git checkout 分支名称 | 切换分支 |
git merge 要合并的分支 | 分支合并(可能产生冲突)注意:切换分支再合并 |
5.1企业分支管理使用案例
需求分析:前端开发部门或后台开发部门需要下班以后在家或周末在家进行代码的开发,主分支保存在公司的服务器上。
查看当前的分支 只有master
[root@kvm03 projiect_bare]# git branch
* master
创建一个一个分支dev (开发的分支)
git branch dev
再次查看分支情况,已经有dev分支
[root@kvm03 projiect_bare]# git branch
dev
* master
切换分支注意分支之前的星号
[root@kvm03 projiect_bare]# git checkout dev
Switched to branch 'dev'
[root@kvm03 projiect_bare]# git branch
* dev
master
合并master和dev分支
[root@kvm03 projiect_bare]# git merge master
Already up-to-date.
开发创建新的文件内容或修改代码内容
[root@kvm03 projiect_bare]# touch readme.md
[root@kvm03 projiect_bare]# git add .
[root@kvm03 projiect_bare]# git commit -m "add readme.md"
[dev a1af437] add readme.md
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 readme.md
[root@kvm03 projiect_bare]# git push origin dev
[email protected]'s password:
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 276 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To [email protected]:/home/git/projiect_bare.git
* [new branch] dev -> dev
5.2下班或周末在家里进行开发
开发人员不管是在家里工作还是在公司工作,不需要每次都git clone项目,通过checkout dev切换分支,通过git pull拉取最新的项目代码。然后正常从事开发工作。
切换到dev分支
[root@kvm03 projiect_bare]# git checkout dev
Already on 'dev'
拉代码
[root@kvm03 projiect_bare]# git pull origin dev
[email protected]'s password:
From 10.0.0.158:/home/git/projiect_bare
* branch dev -> FETCH_HEAD
Already up-to-date.
[root@kvm03 projiect_bare]# touch b.txt
[root@kvm03 projiect_bare]# git add .
[root@kvm03 projiect_bare]# git commit -m "add b.txt"
[dev 300b6ed] add b.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 b.txt
[root@kvm03 projiect_bare]# git push origin dev
[email protected]'s password:
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 219 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
To [email protected]:/home/git/projiect_bare.git
a1af437..300b6ed dev -> dev
5.2 到公司以后开发流程
开发人员不管是在家里工作还是在公司工作,不需要每次都git clone项目,通过checkout dev切换分支,通过git pull拉取最新的项目代码。然后正常从事开发工作。注意上线过程。
切换到dev分支
[root@kvm03 projiect_bare]# git checkout dev
Already on 'dev'
拉代码
[root@kvm03 projiect_bare]# git pull origin dev
[email protected]'s password:
From 10.0.0.158:/home/git/projiect_bare
* branch dev -> FETCH_HEAD
Already up-to-date.
[root@kvm03 projiect_bare]# touchc.txt
[root@kvm03 projiect_bare]# git add .
[root@kvm03 projiect_bare]# git commit -m "add c.txt"
[dev 300b6ed] add c.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 c.txt
[root@kvm03 projiect_bare]# git push origin dev
[email protected]'s password:
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 219 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
To [email protected]:/home/git/projiect_bare.git
a1af437..300b6ed dev -> dev
#切换分支到master
[root@kvm03 projiect_bare]# git checkout master
Switched to branch 'master'
#合并分支dev与master
[root@kvm03 projiect_bare]# git merge dev
Updating 9cc3008..300b6ed
Fast-forward
c.txtt | 0
b.txt | 0
readme.md | 0
3 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 c.txt
create mode 100644 b.txt
create mode 100644 readme.md
#dev分支合并master分支代码上线
[root@kvm03 projiect_bare]# git push origin master
[email protected]'s password:
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:/home/git/projiect_bare.git
9cc3008..300b6ed master -> master
5.3 因为疲劳加班/约妹子....忘了提交代码!!!!(企业真实开发案例)
在公司上班期间操作忙着给妹子调bug,手把手辅导。。妹子为了回报。请吃饭。。。看电影。。。带身份证!!!然后得意忘形。。。忘了push今天的代码。悲剧开始了。
情景再现
在公司上班的场景
git chenckout dev
开发些了N多代码
git add .
git commit -m "xxxxx"
为了给妹子手把手辅导!忘记了push......
回家以后继续写代码的场景
git chenckout dev
开发些了N多代码
git add .
git commit -m "xxxxx"
git push origin dev #正常提交
第二天上班以后
git chenckout dev
git status #看一下冲突的位置和内容 手动修改后再次开发
有合并可能出现冲突,如有冲突需要手动解决冲突以后
继续开发些了N多代码
git add .
git commit -m "xxxxx"
git push origin dev #正常提交
总结 git冲突的场景
情景一:多个分支代码合并到一个分支时;
情景二:多个分支向同一个远端分支推送代码时;
解决情景一:在当前分支上,直接修改冲突代码--->add--->commit。
解决情景二:在本地当前分支上,修改冲突代码--->add--->commit--->push
Git官方文档可以参考
https://git-scm.com/book/zh/v2