1. git历史和特点
1.1 git历史
略(有兴趣自行百度)
git两大特点
- 版本控制:可以解决 多人同时开发的代码问题,也可以解决找回历史代码的问题
- 分布式:Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。(分布式: 中央服务器挂掉,还可以进行coding;集中式: 中央服务器挂掉,不可以coding)
2. 安装与配置
(1) 安装命令如下:
- ubuntu
sudo apt-get install git
- linux
yum install git
- mac
Mac自带git
(2) 安装后配置git的本地邮箱和用户名
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
3. 创建一个版本库
(1) 新建一个目录 git_test,在git_test 目录下创建一个版本库,命令如下:
[root@iZq6rpcx9fo0pxZ /]# mkdir git_test
[root@iZq6rpcx9fo0pxZ /]# cd git_test
[root@iZq6rpcx9fo0pxZ git_test]# git init
初始化空的 Git 版本库于 /git_test/.git/
初始化后,查看git_test下的文件:
[root@iZq6rpcx9fo0pxZ git_test]# ls -al
总用量 12
drwxr-xr-x 3 root root 4096 7月 31 13:27 .
dr-xr-xr-x. 22 root root 4096 7月 31 13:27 ..
drwxr-xr-x 7 root root 4096 7月 31 13:27 .git
4. 版本创建与回退
4.1 使用
(1) 在git_test目录下创建一个文件code.txt,编辑内容如下:
[root@iZq6rpcx9fo0pxZ git_test]# touch code.txt
[root@iZq6rpcx9fo0pxZ git_test]# vi code.txt
[root@iZq6rpcx9fo0pxZ git_test]# cat code.txt
this is the first line
(2) 使用如下2条命令可以创建一个版本
创建版本命令
git add 文件/目录
git commit -m '版本信息'
提交如下命令:
[root@iZq6rpcx9fo0pxZ git_test]# git add code.txt
[root@iZq6rpcx9fo0pxZ git_test]# git commit -m '版本1'
[master(根提交) 5d3efee] 版本1
1 file changed, 1 insertion(+)
create mode 100644 code.txt
(3) 查看版本记录
- a. 查看版本记录命令
git log
执行如下:
[root@iZq6rpcx9fo0pxZ git_test]# git log
commit 5d3efeec4e438f5a2e0ebff799e2cf2c16c32bbc
Author: warmsirius <2859626066@qq.com>
Date: Wed Jul 31 13:31:30 2019 +0800
版本1
- b. 将版本记录在一条展示
git log --pretty=oneline
执行如下
[root@iZq6rpcx9fo0pxZ git_test]# git log --pretty=oneline
5d3efeec4e438f5a2e0ebff799e2cf2c16c32bbc 版本1
- c. 将版本记录用图标展示
git log --graph --pretty=oneline
执行如下:
[root@iZq6rpcx9fo0pxZ git_test]# git log --graph --pretty=oneline
* 5d3efeec4e438f5a2e0ebff799e2cf2c16c32bbc 版本1
(4) 继续编辑code.txt,在里面增加一行
[root@iZq6rpcx9fo0pxZ git_test]# vi code.txt
[root@iZq6rpcx9fo0pxZ git_test]# cat code.txt
this is the first line
this is the second line
(5) 使用如下命令再创建一个版本,并查看版本记录
[root@iZq6rpcx9fo0pxZ git_test]# git add code.txt
[root@iZq6rpcx9fo0pxZ git_test]# git commit -m '版本2'
[master bdcd815] 版本2
1 file changed, 1 insertion(+)
[root@iZq6rpcx9fo0pxZ git_test]# git log
commit bdcd8152c0072afbded59d5f20afc299aac122ed
Author: warmsirius <2859626066@qq.com>
Date: Wed Jul 31 13:36:17 2019 +0800
版本2
commit 5d3efeec4e438f5a2e0ebff799e2cf2c16c32bbc
Author: warmsirius <2859626066@qq.com>
Date: Wed Jul 31 13:31:30 2019 +0800
版本1
(6) 现在想回到某一个版本,可以使用如下命令:
git reset --hard HEAD^
- HEAD: 当前最新版本
- HEAD^: 当前版本的前一个版本,相当于HEAD~1
- HEAD^^: 当前版本的前前个版本,相当于HEAD~2
- HEAD~100: 当前版本的前100版本
[root@iZq6rpcx9fo0pxZ git_test]# git reset --hard HEAD^
HEAD 现在位于 5d3efee 版本1
[root@iZq6rpcx9fo0pxZ git_test]# cat code.txt
this is the first line
执行命令后使用git log查看版本记录,发现现在只能看到版本1的记录, cat code.txt 查看文件内容,现在只有一行,也就是第一个版本中code.txt的内容
(7) 假如我们现在又想回到版本2,怎么办?
可以使用如下命令:
git reset --hard 版本号
从上面可以看到版本2的版本号为bdcd8152c0072afbded59d5f20afc299aac122ed
版本号不一定全部复制,复制前几位即可
(8) 在终端执行如下命令:
[root@iZq6rpcx9fo0pxZ git_test]# git reset --hard bdcd8152
HEAD 现在位于 bdcd815 版本2
现在发现版本2又回来了。可以cat code.txt 查看其里面的内容如下
[root@iZq6rpcx9fo0pxZ git_test]# cat code.txt
this is the first line
this is the second line
(9) 假如说上面的终端已经关了该怎么回退版本。
下面把终端关了,然后再打开终端,发现之前版本2的版本号看不到了。
[root@iZq6rpcx9fo0pxZ git_test]# git log
commit 5d3efeec4e438f5a2e0ebff799e2cf2c16c32bbc
Author: warmsirius <2859626066@qq.com>
Date: Wed Jul 31 13:31:30 2019 +0800
版本1
那么怎么再回到版本2呢?git reflog 命令可以查看我们的操作记录
git reflog
执行如下:
[root@iZq6rpcx9fo0pxZ git_test]# git reflog
5d3efee HEAD@{0}: reset: moving to 5d3ef
bdcd815 HEAD@{1}: reset: moving to bdcd8152
5d3efee HEAD@{2}: reset: moving to HEAD^
bdcd815 HEAD@{3}: commit: 版本2
5d3efee HEAD@{4}: commit (initial): 版本1
[root@iZq6rpcx9fo0pxZ git_test]# git reset --hard bdcd8
HEAD 现在位于 bdcd815 版本2
4.2 工作区和暂存区
4.2.1 工作区(Working Directory)
电脑中的目录,比如我们的git_test,就是一个工作区。
4.2.2 版本库(Repository)
工作区有一个隐藏目录.git,这个不是工作区,而是git的版本库。
git 的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
因为我们创建git版本库时,git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
git流程- 前面把文件往git版本库里添加的时候是分两步执行:
- 第一步: 用 git add 把文件添加进去,实际上就是把文件修改添加到暂存区
- 第二步: 用 git commit 提交修改,实际上就是把暂存区的所有内容提交到当前分支
举例
(1) 下面在git_test目录下再创建一个文件code2.txt,然后编辑内容如下
[root@iZq6rpcx9fo0pxZ git_test]# touch code2.txt
[root@iZq6rpcx9fo0pxZ git_test]# vi code2.txt
[root@iZq6rpcx9fo0pxZ git_test]# cat code2.txt
the code2 first line
(2) 然后再次编辑code2.txt内容,在其中加入2行,编辑后内容如下
[root@iZq6rpcx9fo0pxZ git_test]# vi code2.txt
[root@iZq6rpcx9fo0pxZ git_test]# cat code2.txt
the code2 first line
the code2 second line
the code2 third line
(3) 使用如下命令查看工作的状态
git status
执行后如下:
[root@iZq6rpcx9fo0pxZ git_test]# git status
# 位于分支 master
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# code2.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
工作区和暂存区
4.3 版本库(Repository)
git管理的文件修改,它只会提交暂存区的修改来创建版本
(1) 编辑code.txt,并使用git add命令将其添加到暂存区中
[root@iZq6rpcx9fo0pxZ git_test]# vi code.txt
[root@iZq6rpcx9fo0pxZ git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
[root@iZq6rpcx9fo0pxZ git_test]# git add code.txt
(2) 继续编辑code.txt, 并在其中添加一行
[root@iZq6rpcx9fo0pxZ git_test]# vi code.txt
[root@iZq6rpcx9fo0pxZ git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
(3) git commit 创建一个版本,并使用 git status 查看,发现第二次修改code.txt 内容之后,并没有将其添加的工作区,所以创建版本的时候并没有被提交
[root@iZq6rpcx9fo0pxZ git_test]# git commit -m '版本3'
[master dd22753] 版本3
1 file changed, 1 insertion(+)
[root@iZq6rpcx9fo0pxZ git_test]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: code.txt
#
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# code2.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@iZq6rpcx9fo0pxZ git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
4.4 撤销修改
(1) 继续上面的操作,提示我们可以使用 git checkout --<文件> 来丢弃工作区的改动。执行如下命令,发现工作区干净了,第二次的改动内容也没有了。
- 修改文件后但是文件修改并未提交到暂存区
git checkout -- <文件名>
执行如下:
[root@iZq6rpcx9fo0pxZ git_test]# git checkout -- code.txt
[root@iZq6rpcx9fo0pxZ git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
(2) 继续编辑code.txt,并在其中添加如下内容,并将其添加到暂存区,如果需要取消修改,查看git status:
[root@iZq6rpcx9fo0pxZ git_test]# vi code.txt
[root@iZq6rpcx9fo0pxZ git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
add one more line
[root@iZq6rpcx9fo0pxZ git_test]# git add code.txt
[root@iZq6rpcx9fo0pxZ git_test]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 修改: code.txt
#
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# code2.txt
- 放在暂存区的文件需要还原修改命令
git reset HEAD 文件名
git checkout -- 文件名
执行如下:
[root@iZq6rpcx9fo0pxZ git_test]# git reset HEAD code.txt
重置后撤出暂存区的变更:
M code.txt
[root@iZq6rpcx9fo0pxZ git_test]# git checkout -- code.txt
[root@iZq6rpcx9fo0pxZ git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
4.5 对比文件的不同
对比工作区和某个版本中文件的不同
(1) 继续编辑文件code.txt, 在其添加一行内容
[root@iZq6rpcx9fo0pxZ git_test]# vi code.txt
[root@iZq6rpcx9fo0pxZ git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
the new line
(2) 现在要对比工作区中的code.txt和HEAD版本中的code.txt的不同,使用如下命令
git diff HEAD --文件名
执行结果如下:
[root@iZq6rpcx9fo0pxZ git_test]# git diff HEAD -- code.txt
diff --git a/code.txt b/code.txt
index 01e1274..7696b1c 100644
--- a/code.txt
+++ b/code.txt
@@ -1,3 +1,4 @@
this is the first line
this is the second line
this is the third line
+the new line
image.png
(3) 使用如下命令丢弃工作区的改动
[root@iZq6rpcx9fo0pxZ git_test]# git checkout -- code.txt
[root@iZq6rpcx9fo0pxZ git_test]# git status
# 位于分支 master
无文件要提交,干净的工作区
对比两个版本间文件的不同:
(1) 现在要对比HEAD 和 HEAD^ 版本中 code.txt 的不同,使用如下命令:
git diff HEAD HEAD^ -- 文件名
- -: 对应第一个版本
- +: 对应第二个版本
[root@iZq6rpcx9fo0pxZ git_test]# vi code.txt
[root@iZq6rpcx9fo0pxZ git_test]# cat code.txt
this is the first line
this is the second line
this is the third line
this is the forth line
[root@iZq6rpcx9fo0pxZ git_test]# git add code.txt
[root@iZq6rpcx9fo0pxZ git_test]# git commit -m '新增第4行'
[master eda8050] 新增第4行
1 file changed, 1 insertion(+)
[root@iZq6rpcx9fo0pxZ git_test]# git diff HEAD HEAD^ -- code.txt
diff --git a/code.txt b/code.txt
index 66f9219..01e1274 100644
--- a/code.txt
+++ b/code.txt
@@ -1,4 +1,3 @@
this is the first line
this is the second line
this is the third line
-this is the forth line
image.png
4.6 删除文件
(1) 我们把目录中的code2.txt删除
[root@iZq6rpcx9fo0pxZ git_test]# ls
code2.txt code.txt
[root@iZq6rpcx9fo0pxZ git_test]# rm code2.txt
rm:是否删除普通文件 "code2.txt"?y
[root@iZq6rpcx9fo0pxZ git_test]# ls
code.txt
这个时候,git知道删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻提示哪些文件被删除了。
[root@iZq6rpcx9fo0pxZ git_test]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add/rm <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 删除: code2.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
- 丢弃工作区的改动(工作区删除文件复原)
git checkout --文件名
[root@iZq6rpcx9fo0pxZ git_test]# git checkout -- code2.txt
[root@iZq6rpcx9fo0pxZ git_test]# ls
code2.txt code.txt
- 更新要提交的内容(git同步删除)
git add/rm 文件名
[root@iZq6rpcx9fo0pxZ git_test]# rm code2.txt
rm:是否删除普通文件 "code2.txt"?y
[root@iZq6rpcx9fo0pxZ git_test]# git rm code2.txt
rm 'code2.txt'
[root@iZq6rpcx9fo0pxZ git_test]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 删除: code2.txt
#
- 查看版本信息
git log 如果版本信息过多,按q退出
[root@iZq6rpcx9fo0pxZ git_test]# git log
commit c75a88ee04a0e104774b4eecef14a6ab72e2108c
Author: warmsirius <2859626066@qq.com>
Date: Wed Jul 31 14:08:16 2019 +0800
删除code2.txt
Author: warmsirius <2859626066@qq.com>
Date: Wed Jul 31 14:08:16 2019 +0800
删除code2.txt
commit eda8050db6be11b6a8563fafd36f6d843ced2067
Author: warmsirius <2859626066@qq.com>
Date: Wed Jul 31 14:04:27 2019 +0800
新增第4行
commit 3f87b4c09101017b4c08022010324f70e6ff63dd
Author: warmsirius <2859626066@qq.com>
Date: Wed Jul 31 14:00:15 2019 +0800
新增code2文件
commit dd227534061d3ffdf17628bcd5b8afaa5de10463
Author: warmsirius <2859626066@qq.com>
Date: Wed Jul 31 13:52:42 2019 +0800
版本3
也可以使用 git log --pretty=oneline 以简短的形式展示
(2) 现在你有两个选择:
一是确实要从版本库中删除该文件,那就用命令git rm删除掉,并且git commit
[root@iZq6rpcx9fo0pxZ git_test]# git rm code2.txt
rm 'code2.txt'
[root@iZq6rpcx9fo0pxZ git_test]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 删除: code2.txt
#
[root@iZq6rpcx9fo0pxZ git_test]# git commit -m '删除code2.txt'
[master c75a88e] 删除code2.txt
1 file changed, 3 deletions(-)
delete mode 100644 code2.txt
[root@iZq6rpcx9fo0pxZ git_test]# git status
# 位于分支 master
无文件要提交,干净的工作区
另一种情况是删错了,可以直接使用git checkout -- code2.txt,这样文件code2.txt又回来了,如果已经提交到了暂存区,需要先git reset HEAD 文件名,然后再git checkout -- 文件名
小结
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
网友评论