一、git初始化操作
1.git安装
[root@guilin ~]# yum install git
2.配置当前系统的信息
开发或运维人员使用的邮箱和语法高亮
# 使用者名称 一般使用自己名字
[root@guilin ~]# git config --global user.name "chengl"
# 使用者的邮箱
[root@guilin ~]# git config --global user.email "c.gl@qq.com"
# 语法高亮显示
[root@guilin ~]# git config --global color.ui true
3.查看配置是否正确
[root@guilin ~]# git config --list
user.name=chengl
user.email=c.gl@qq.com
color.ui=true
[root@guilin ~]# cat .gitconfig
[user]
name = chengl
email = c.gl@qq.com
[color]
ui = true
4.初始化git仓库
# 创建一个目录git_data作为本地仓库
[root@guilin ~]# mkdir git_data
# 进入到目录
[root@guilin ~]# cd git_data/
# 进行初始化操作git init命令、这样git_data就是我们的本地仓库了
[root@guilin git_data]# git init
Initialized empty Git repository in /root/git_data/.git/
二、git常用命令
1.查看git状态
查看当前git的状态 一定要保持干净的区域、否则在提交或者更新代码会出现一错误提示
[root@guilin git_data]# git status
2.git创建一个普通文件
[root@guilin git_data]# touch a.txt
3.git普通文件提交到暂存区
# 如果一个代码文件想让仓库被管理必须经过暂存区域
[root@guilin git_data]# git add a.txt
# 如果发现自己提交错误还可以把暂存区的文件删除 别忘记rm前面加git
[root@guilin git_data]# git rm --cached a.txt
4.git暂存区的文件提交到本地仓库
[root@guilin git_data]# git commit -m "newfile a.txt"
5.git修改文件的内容
# 修改文件内容
[root@guilin git_data]# vim a.txt
aaaaaaaaaa
# 如果发现自己修改错了想要恢复 可以临时使用暂存区的文件覆盖工作目录的文件内容
[root@guilin git_data]# git checkout -- a.txt
# 内容被覆盖为原来的 新加入的aaaaaaaa被覆盖
[root@guilin git_data]# cat a.txt
# 继续修改文件内容
[root@guilin git_data]# echo hehe > a.txt # 修改文件 只是修改了工作目录的文件
# 修改完内容把文件重新提交到暂存区
[root@guilin git_data]# git add . # 提交所有工作区的内容 到暂存区域
# 把暂存区的内容重新提交到本地仓库
[root@guilin git_data]# git commit -m "modifile a.txt --> hehe"
# 注意: 只要文件发生变化都要执行提交到暂存区和本地仓库
# 如果是已经提交过的文件进行修改后可用一条命令直接提交到本地仓库 am a相当于-a
[root@guilin git_data]# echo bbbb >> a.txt
[root@guilin git_data]# git commit -am "modifile a.txt >> bbbb"
6.git改名
# 使用git修改名称
[root@guilin git_data]# git mv a.txt a
# 查看当前git状态 可以看到系统提示将a.txt 修改为a
[root@guilin git_data]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
# renamed: a.txt -> a
# 修改完成后别忘记提交到暂存区和本地仓库
[root@guilin git_data]# git add .
[root@guilin git_data]# git commit -m "rename a.txt > a"
7.git比对文件
git中文件比对比对的是当前工作目录和暂存区 暂存区和本地仓库的不同
# 比对工作目录和暂存区的文件
[root@guilin git_data]# git diff
# 比对暂存区和本地仓库的文件
[root@guilin git_data]# git diff --cached
8.git删除文件
# git rm删除文件
[root@guilin git_data]# git rm a
# 提交到暂存区
[root@guilin git_data]# git add .
# 提交到本地仓库
[root@guilin git_data]# git commit -m "delete file a"
9.git版本的回滚
# 查看所有的历史提交记录
[root@guilin git_data]# git log
# 一条信息显示所有历史提交记录 提交记录保存为哈希值的方式 在仓库中是无法看到具体保存的内容
# 每次提交相当于打了一个快照 快照名称是唯一的哈希值
[root@guilin git_data]# git log --oneline
e303128 newfile c.txt # 最后一次创建c.txt
3ecc85c newfile b.txt # 第六次创建b.txt
c74803f delete a file # 第五次删除文件
be3acf9 modifile a 11111 # 第四次修改文件内容
8743898 rename a.txt > a # 第三次为改名
bbd63f8 modifile a.txt --> hehe # 第二次修改文件内容添加了hehe
f2e0176 newfile a.txt # 第一次创建a文件
# 回滚到第一次创建a文件的位置
[root@guilin git_data]# git reset --hard f2e0176
# 查看当前的指针指向 指针指向哪个版本 说明我们在哪个位置
[root@guilin git_data]# git log --oneline --decorate
f2e0176 (HEAD, master) newfile a.txt
# 查看所有的历史提交记录 git reflog
[root@guilin git_data]# git reflog
be3acf9 HEAD@{0}: reset: moving to be3acf9
f2e0176 HEAD@{1}: reset: moving to f2e0176
e303128 HEAD@{2}: commit: newfile c.txt
3ecc85c HEAD@{3}: commit: newfile b.txt
c74803f HEAD@{4}: commit: delete a file
be3acf9 HEAD@{5}: commit: modifile a 11111
8743898 HEAD@{6}: commit: rename a.txt > a
bbd63f8 HEAD@{7}: commit: modifile a.txt --> hehe
f2e0176 HEAD@{8}: commit (initial): newfile a.txt
10.git分支
# 查看当前的分支 *在谁的前面当前就位于哪个分支 默认为master分支
[root@guilin git_data]# git branch
* master
# 创建testing分支
[root@guilin git_data]# git branch testing
[root@guilin git_data]# git branch
* master
testing
# 切换分支到testing分支
[root@guilin git_data]# git checkout testing
Switched to branch 'testing'
# 查看分支状态 * 在testing分支 切换成功
[root@guilin git_data]# git branch
master
* testing
11.git分支合并
# 在testing分支上开发新的功能增加代码 修改代码
[root@guilin git_data]# echo testing > c.txt
# 提交到testing分支的暂存区
[root@guilin git_data]# git add .
# 提交到testing的本地仓库
[root@guilin git_data]# git commit -m "testing mofifile c.txt > testing"
# 查看当前的版本分支是指向到testing的最后一次操作
[root@guilin git_data]# git log --oneline --decorate
ec6b0a7 (HEAD, testing) testing mofifile c.txt > testing
# 回到主干分支进行合并代码 把testing上新加的功能合并到主干master
# 切换到master分支
[root@guilin git_data]# git checkout master
Switched to branch 'master'
# 查看是否切换成功
[root@guilin git_data]# git branch
* master
testing
# 在master分支合并testing分支的内容
[root@guilin git_data]# git merge testing
Updating e303128..ec6b0a7
Fast-forward
c.txt | 1 +
1 file changed, 1 insertion(+)
[root@guilin git_data]# cat c.txt
testing
# 记得合并后删除testing分支
[root@guilin git_data]# git branch -d testing # 删除分支
# 可以使用一条命令快速创建并切换到testing分支
[root@guilin git_data]# git checkout -b testing
Switched to a new branch 'testing'
12.git的冲突合并
# 首先在testing分支上修改文件内容 在第二行增加 111
[root@guilin git_data]# git checkout -b testing
# 查看文件内容
[root@guilin git_data]# cat c.txt
testing
# 增加文件内容
[root@guilin git_data]# echo 111 >> c.txt
# 提交到缓存区
[root@guilin git_data]# git add .
# 提交到本地仓库
[root@guilin git_data]# git commit -m "modifile c.txt 111"
[testing 47581ff] modifile c.txt 111
1 file changed, 1 insertion(+)
# 回到master分支修改文件内容 在第二行增加222
# 切换到master分支
[root@guilin git_data]# git checkout master
Switched to branch 'master'
# 查看当前所在分支
[root@guilin git_data]# git branch
* master
testing
# 查看当前文件内容
[root@guilin git_data]# cat c.txt
testing
# 增加222到 c.txt文件中
[root@guilin git_data]# echo 222 >> c.txt
# 查看c.txt 文件内容
[root@guilin git_data]# cat c.txt
testing
222
# 确定修改成功后提交到暂存区
[root@guilin git_data]# git add .
# 继续将暂存区的内容提交到本地仓库
[root@guilin git_data]# git commit -m "modifle master c.txt 222"
# 接下来合并testing分支 会提示冲突
[root@guilin git_data]# git merge testing
Auto-merging c.txt
CONFLICT (content): Merge conflict in c.txt
Automatic merge failed; fix conflicts and then commit the result. # 合并失败
[root@guilin git_data]# cat c.txt
testing
<<<<<<< HEAD
222
=======
111
>>>>>>> testing
# 解决冲突 可以把两行代码都保留 也可以把没用的内容删除 留下想要的代码行即可
# 手动删除后进行提交操作
# 提交到暂存区
[root@guilin git_data]# git add .
# 提交到本地仓库
[root@guilin git_data]# git commit -m "merge testing"
13.git标签
# 给某个哈希值历史的提交做个tag标签 -m为描述信息
[root@guilin git_data]# git tag -a v1.1 -m "用户第一个版本" be3acf9
# 查看所有的tag版本号
[root@guilin git_data]# git tag
v1.1
# 默认给当前所在的位置打tag标签
[root@guilin git_data]# git tag -a v1.2 -m "第二个用户可以访问的版本"
# 查看所有的tag版本号
[root@guilin git_data]# git tag
v1.1
v1.2
# 按照tag版本方式进行回滚操作
[root@guilin git_data]# ll
total 4
-rw-r--r-- 1 root root 0 Sep 5 16:07 b.txt
-rw-r--r-- 1 root root 16 Sep 5 16:26 c.txt
# 回滚到V1.1版本
[root@guilin git_data]# git reset --hard v1.1
HEAD is now at be3acf9 modifile a 11111
[root@guilin git_data]# ll
total 4
-rw-r--r-- 1 root root 12 Sep 5 16:34 a
[root@guilin git_data]# cat a
hehe
111111
# 回滚到v1.2版本
[root@guilin git_data]# git reset --hard v1.2
HEAD is now at 785bb0e merge testing
[root@guilin git_data]# ll
total 4
-rw-r--r-- 1 root root 0 Sep 5 16:35 b.txt
-rw-r--r-- 1 root root 16 Sep 5 16:35 c.txt
# 查看v1.1的详细信息
[root@guilin git_data]# git show v1.1
# 删除tag
[root@guilin git_data]# git tag
v1.1
v1.2
[root@guilin git_data]# git tag -d v1.1
Deleted tag 'v1.1' (was cd98d0b)
[root@guilin git_data]# git tag
v1.2
三、git本地和远程仓库常用命令
1.添加github作为本地远程web仓库
# 和github或者gitlab 做免秘钥认证
# 使用ssh-keygen生成密钥对
[root@guilin ~]# ssh-keygen
# 把公钥复制到github 或者 gitlab的公钥配置页面中
# 添加github或者gitlab仓库作为本地的远程仓库
# 添加一个远程仓库名称为origin(可自定义) 后面接github或gitlab的仓库地址
[root@guilin git_data]# git remote add origin git@github.com:guilin/git_data.git
2.查看源仓库的详细信息
# 远程仓库的详细地址
[root@guilin git_data]# git remote -v
origin git@github.com:guilin/git_data.git (fetch)
origin git@github.com:guilin/git_data.git (push)
3.提交本地仓库代码到远程仓库
# 把本地仓库中的master的内容提交到名称为origin的远程仓库中
[root@guilin git_data]# git push -u origin master
4.修改远程仓库的名称
# 修改远程仓库名称为old_origin
[root@guilin git_data]# git remote rename origin old_origin
5.删除远程仓库
[root@guilin git_data]# git remote rm origin
6.下载远程仓库到本地
# 第一种方式是本地没有代码 将远程的仓库全部下载到本地 使用克隆的方式 必须做好免秘钥认证
# 进入到opt目录
[root@guilin opt]# git clone git@github.com:guilin/git_data.git
# 第二种方式是本地已经有远程仓库的代码 远程仓库代码已修改
# 更新远程代码到本地
[root@guilin git_data]# git pull
7.上传本地tag到远程仓库
# 把本地v1.1版本上传到远程仓库
[root@guilin git_data]# git push -u origin v1.1