Git基础操作
1.安装Git
本节主讲Linux上的Git安装
1.1 查看本机是否安装Git
命令:git
[root@admin ~]# git
usage: git [--version] [--help] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [args]
最常用的 git 命令有:
add 添加文件内容至索引
bisect 通过二分查找定位引入 bug 的变更
branch 列出、创建或删除分支
checkout 检出一个分支或路径到工作区
clone 克隆一个版本库到一个新目录
commit 记录变更到版本库
diff 显示提交之间、提交和工作区之间等的差异
fetch 从另外一个版本库下载对象和引用
grep 输出和模式匹配的行
init 创建一个空的 Git 版本库或重新初始化一个已存在的版本库
log 显示提交日志
merge 合并两个或更多开发历史
mv 移动或重命名一个文件、目录或符号链接
pull 获取并合并另外的版本库或一个本地分支
push 更新远程引用和相关的对象
rebase 本地提交转移至更新后的上游分支中
reset 重置当前HEAD到指定状态
rm 从工作区和索引中删除文件
show 显示各种类型的对象
status 显示工作区状态
tag 创建、列出、删除或校验一个GPG签名的 tag 对象
命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些指南。参见
'git help <命令>' 或 'git help <指南>' 来查看给定的子命令帮助或指南。
出现以上语句则证明Linux系统GIt已经安装完毕
1.2 安装Git
命令:yum install git
安装完成后还需要最后一步设置,设置使用者的名字和E-mail
写法:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
使用了 git config
表示这台Linux机器所有的Git库都会使用该配置
2. Git初始操作
2.1 创建版本库
命令:git init
建立版本库的顺序:
- 先创建一个目录(文件夹):
mkdir repository
- 进到该目录里使用
git init
出现以下语句则证明版本库建立完毕
多了一个.git目录,这个目录时Git用来管理和跟踪版本库的
[root@admin repository]# git init
初始化空的 Git 版本库于 /GitDepository/repository/.git/
2.2 把文件添加到版本库
命令:
- git add
- git commit -m
范例:
流程:
1.我们先创建一个readme.txt文件,必须要放在repository
目录下(其子目录也行),一定要放在Git仓库中
在里面随便写入东西
Git is a version control system.
Git is free software.
[root@admin repository]# vi readme.txt
2.用命令git add
告诉Git,把文件添加到仓库也就是stage暂存区(下面会说)
[root@admin repository]# git add readme.txt
使用git status
查看Git当前状态
[root@admin repository]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
# (使用 "git rm --cached <file>..." 撤出暂存区)
#
# 新文件: readme.txt
#
3.用命令git commit
,将文件提交到仓库,记录版本
-m:后面接说明文字
[root@admin repository]# git commit -m "first version"
[master(根提交) 287645f] first version
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
使用git log
查看当前节点之前的版本
[root@admin repository]# git log
commit 287645f971bc8115fa2b2a3c3ba328c3c3b3d834
Author: BunnyDuudu <562139661@qq.com>
Date: Wed Jul 28 09:09:43 2021 +0800
first version
3. 文件管理
命令:git status
可以让我们实时掌控库当前的状态
我们往readme.txt
当中添加一条新的语句Git is a distributed version control system.
使用git status
[root@admin repository]# git add readme.txt
[root@admin repository]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 修改: readme.txt
#
上面语句告诉我们,我们已经把readme.txt
添加到了库当中,并显示了修改了的文件,但是没有进行提交
命令:
如何查看工作区与暂存区,暂存区 与库,工作区与库的不同(三个命令,最好画图说明)
git diff 文件名 (工作区与暂存区的差异)
git diff HEAD 文件名 (查看工作区和库的差异)
git diff --cached 文件名 (暂存区与库的差异)
3.1 文件版本的回退
命令:git log
命令显示从最近到最远的提交日期
最近的一次是append GPL
,上一次是add distributed
,最早的一次是wrote a readme file
输出信息太多,可以添加--pretty=oneline
参数
命令:git log --pretty=oneline
[root@admin repository]# git log --pretty=oneline
553415edfb703fbbc9dd5e07fd4daec5cef00415 Second version
287645f971bc8115fa2b2a3c3ba328c3c3b3d834 first version
553415edfb703fbbc9dd5e07fd4daec5cef00415为版本号
我们现在要将文件从当前版本append GPL
,退回上一个版本 add distributed
在Git中,HEAD表示当前版本,HEAD^ 上一个版本,HEAD^^上上一个版本
命令:git reset --hard
git reset --hard HEAD^后面不能接文件名
[root@admin repository]# git reset --hard HEAD^ readme.txt
fatal: 不能带路径进行硬性重置。
[root@admin repository]# git reset --hard HEAD^
HEAD 现在位于 287645f first version
这时候再查看git log
,会发现“Second version”消失了
[root@admin repository]# git log
commit 287645f971bc8115fa2b2a3c3ba328c3c3b3d834
Author: BunnyDuudu <562139661@qq.com>
Date: Wed Jul 28 09:09:43 2021 +0800
first version
若退回到某个版本以后,后悔了,我们就可以使用git reflog
查看我们用过的每一次命令
[root@admin repository]# git reflog
287645f HEAD@{0}: reset: moving to HEAD^
553415e HEAD@{1}: commit: Second version
287645f HEAD@{2}: commit (initial): first version
可以查看我们使用Git的每一次操作
再使用git reset --hard 版本号ID(不用完全输完,截取一点就可以)
[root@admin repository]# git reset --hard 55341
3.2 工作区,暂存区,分支master
工作区(Working Directory):
Linux系统中电脑上你能看到的目录,就比如先前创建的额repository
版本库(Repository):
版本库中有暂存区(stage)和分支master,还有一个指向分支的HEAD
从工作区中使用git add
则把工作区中的文件添加到暂存区(stage)中
再使用 git commit
则把暂存区中的文件提交到master分支上
查询工作区与暂存区(stage)的关系,工作区与库的关系,暂存区与库的关系
命令:
git diff:工作区与暂存区关系
git diff HEAD:工作区与库关系
git diff --cached:暂存区与库的关系
3.3 撤销修改
- 情况一:此时文件在工作区中
将readme.txt修改之后返回,想撤回刚才的修改
[root@admin repository]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
命令:git checkout -- filename
撤销工作区中刚才的修改
撤销前:
[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is free software.
GIt tracks changes of files.
撤销后:
[root@admin repository]# git checkout -- readme.txt
[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is free software.
- 情况二:此时文件在暂存区中,我们要先把文件从暂存区中撤回,然后在工作区中再进行撤回
[root@admin repository]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 修改: readme.txt
#
先使用 git reset HEAD filename
从stage暂存区中撤回
[root@admin repository]# git reset HEAD readme.txt
重置后撤出暂存区的变更:
M readme.txt
然后再使用 git checout -- filename
[root@admin repository]# git checkout -- readme.txt
[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is free software.
3.4 删除文件
在Linux系统中通常直接使用rm
删除文件rm readme.txt
删除之后,Git知道你删除了文件,工作区和版本库就不一致了
使用git status
会告诉你什么文件发生了更改
git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
此时有两种情况
- 情况一:
确实要删除版本库中的文件:
使用git rm filename
删掉,并且git commit
$ git rm readme.txt
rm 'readme.txt'
$ git commit -m "remove readme.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
- 情况二:
误删除文件git checkout -- test.txt
一键还原
4. 分支控制
4.1 创建分支
命令:git branch name
创建分支并切换:git checkout -b name
加上 -b
表示创建并切换
等于:
创建分支git branch name
切换分支git checkout name
4.2 合并分支
命令:git merge name
将name分支与当前分支合并
查看分支合并情况:git log --graph --pretty=oneline --abbrev-commit
4.3 删除分支
命令:git branch -d name
强制删除一个未进行合并的分支:git branch -D name
4.4 Bug分支
命令:git stash
:把当前工作区暂存起来git stash list
:查看保存的工作场景git stash apply stash@{0}
:恢复保存的stashgit stash pop
:恢复并删除保存的stash场景
范例:创建一个分支,并在分支上修改readme.txt之后使用fast merge与master分支合并
[root@admin repository]# git checkout -b dev
切换到一个新分支 'dev'
[root@admin repository]# git branch
* dev
master
[root@admin repository]# vi readme.txt
[root@admin repository]# git add readme.txt
[root@admin repository]# git commit readme.txt
终止提交因为提交说明为空。
[root@admin repository]# git commit -m "Third test" readme.txt
[dev 03d6b2a] Third test
1 file changed, 1 insertion(+)
[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is free software.
Branch test.
[root@admin repository]# git checkout master
切换到分支 'master'
[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is free software.
[root@admin repository]# git merge dev
更新 553415e..03d6b2a
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is free software.
Branch test.
[root@admin repository]# git branch -d dev
已删除分支 dev(曾为 03d6b2a)。
范例2:若两个分支都对同一个文件进行了修改,且使用了git commit,分支无法快速合并,那怎么修改?
此时readme.txt文件中为这样
Git is a version control system.
Git is a distributed version control system.
Git is free software.
Branch test.
<<<<<<< HEAD
Branch third test.
=======
Branch second test.
>>>>>>> dev
~
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
将不同的内容删除更改,之后在进行git add,git commit就可以完成合并了
范例3:修复Bug
若我们在dev分支上进行操做,已经在dev的工作区上工作了很久,突然要去修改master分支上的bug,该怎么做?
[root@admin repository]# vi readme.txt
[root@admin repository]# git stash
Saved working directory and index state WIP on dev: bd1c2da conflict fix
HEAD 现在位于 bd1c2da conflict fix
使用git stash
保存当前工作区工作状态
切换到需要修改的分支master,创造一个新分支issue-101来辅助修改bug
修改完bug,使用git add,git commit
修改完毕后将两个分支合并,并且删除新分支issue-101
[root@admin repository]# git checkout master
[root@admin repository]# git checkout -b issue-101
切换到一个新分支 'issue-101'
[root@admin repository]# vi readme.txt
[root@admin repository]# git add readme.txt
[root@admin repository]# git commit -m "fix bug 101"
[issue-101 e74c85b] fix bug 101
1 file changed, 1 insertion(+), 1 deletion(-)
[root@admin repository]# git checkout master
切换到分支 'master'
您的分支领先 'origin/master' 共 4 个提交。
(使用 "git push" 来发布您的本地提交)
[root@admin repository]# git merge --no-ff -m "merged bug fix 101" issue-101
Merge made by the 'recursive' strategy.
readme.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[root@admin repository]# git branch -d issue-101
已删除分支 issue-101(曾为 e74c85b)。
查看刚才的操作:
[root@admin repository]# git log --pretty=oneline
3a605834a8d719630c534fe1231d676c050e0d6e merged bug fix 101
e74c85b3a0bb50327062c946fb4f4c7c260850ff fix bug 101
bd1c2da9efe53c1187580de8263c26b413f68af9 conflict fix
98a1bca1a0edec0ada07a4d79eec420c9d9947f3 fifth test
ff8cd74f519fc74ef12e3a5ae318e46c9ffe1a81 Fourth test
03d6b2af248d690f1885a5dd374e29d7f57717c6 Third test
553415edfb703fbbc9dd5e07fd4daec5cef00415 Second version
287645f971bc8115fa2b2a3c3ba328c3c3b3d834 first version
删除后bug修复完毕,切换到刚才工作的dev分支,因为刚才把master的bug修改后版本更新了,导致了dev和master版本不同,dev身上的那个bug还没有删除,此时我们可以把master的操作复制到dev上
使用语句:git cherry-pick
操作的ID号
[root@admin repository]# git cherry-pick e74c85b3a
[dev 88582ad] fix bug 101
1 file changed, 1 insertion(+), 1 deletion(-)
[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is a free software.
Branch test.
Branch second and third test.
使得readme.txt的数据与master的数据同步
之后便可以使用到我们刚才使用的保存工作区命令
查看刚才保存的工作区:git stash list
[root@admin repository]# git stash list
stash@{0}: WIP on dev: bd1c2da conflict fix
有两种还原方式:
还原不删除保存的数据:git stash apply 可以接保存数据的IDstash@{0}
还原后删除保存的数据:git stash pop 可以接保存数据的IDstash@{0}
[root@admin repository]# git stash pop stash@{0}
自动合并 readme.txt
# 位于分支 dev
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
丢弃了 refs/stash@{0} (566f2351e65f2b2289295e60b6ea5ee312a68e90)
[root@admin repository]# cat readme.txt
Git is a version control system.
Git is a distributed version control system.
Git is a free software.
Branch test.
Branch second and third test.
Stash test
完成语句之后,dev分支和master分支里的bug修改完毕,且没有耽误dev的工作