Git 工具原理及使用 – 基本使用
文章目录
- Git 工具原理及使用 -- 基本使用
- 1.创建本地仓库
- 2.配置本地仓库
- 3.认识工作区、暂存区、版本库
- 4.添加文件 -- 场景一
- 5.查看`.git`文件
- 6.添加文件 -- 场景二
- 7.修改文件
- 8.版本回退
- 9.撤销修改
- **情况一:对于工作区的代码,还没有add**
- **情况二:已经add,但没有 commit**
- 情况三:已经add,并且也commit了
- 10.删除文件
1.创建本地仓库
git init
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git init
Initialized empty Git repository in /home/Lxy/gitcode/.git/
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ la
bash: la: command not found
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ ll -a
total 12
drwxrwxr-x 3 Lxy Lxy 4096 Jun 25 20:52 .
drwx------ 13 Lxy Lxy 4096 Jun 25 20:52 ..
drwxrwxr-x 7 Lxy Lxy 4096 Jun 25 20:52 .git
2.配置本地仓库
增加配置name 和 email地址,如果没有这两个配置可能会报错
添加配置name和email
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git config user.name "Lxy"
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git config user.email "2357246060@qq.com"
查看配置
git config -l
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git config -l
user.email=2357246060@qq.com
user.name=Yaulixingyu
push.default=current
credential.helper=store
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.name=Lxy
user.email=2357246060@qq.com
重置/删除 某个配置
git config --unset ...
git config --unset user.name
global属性
添加global属性表示:在这台服务器内这个配置项在所有本地仓库都会生效
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git config --global user.name "Lxy"
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git config --global user.email "2357246060@qq.com"
删除global属性
git config --global --unset [属性字段]
3.认识工作区、暂存区、版本库
我们在当前gitcode
文件内创建一个ReadMe
文件,那么这个ReadMe
可以被git管理吗?答案是不行的 !
为了搞懂这个道理 我们就要搞清楚几个概念。
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ touch ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ ll
total 0
-rw-rw-r-- 1 Lxy Lxy 0 Jun 25 21:07 ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ ll -a
total 12
drwxrwxr-x 3 Lxy Lxy 4096 Jun 25 21:07 .
drwx------ 13 Lxy Lxy 4096 Jun 25 21:01 ..
drwxrwxr-x 7 Lxy Lxy 4096 Jun 25 21:03 .git
-rw-rw-r-- 1 Lxy Lxy 0 Jun 25 21:07 ReadMe
我们也不运行在 .git
下手动修改文件的(增加删除等)。因此只能只能把ReadMe
文件写在当前路径下。那么这个区域我们称作工作区。而 .git
称作版本库。
工作区:是在你电脑上你要写代码或文件的目录
版本库:又名仓库,工作区有一个隐藏目录
.git
,他不算工作区,而是Git的版本库。这个版本库里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时候都可以追踪历史,或者在将来某个时刻可以还原暂存区:一般存放在
.git
目录上的index文件中,我们把暂存区有时候也叫索引
-- 不允许在.git下手动修改
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ tree .git
.git
├── branches
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs
├── heads
└── tags
9 directories, 13 files
这个图展示了工作区、暂存区和版本库之间的关系。
-
图中左侧为⼯作区,右侧为版本库。Git的版本库⾥存了很多东西,其中最重要的就是暂存区。
-
在创建Git版本库时,Git会为我们⾃动创建⼀个唯⼀的master分⽀,以及指向master的⼀个指针叫HEAD。
-
当对⼯作区修改(新增、删除)的⽂件执⾏git add 命令时,暂存区⽬录树的⽂件索引会被更新。
-
当执⾏提交操作 git commit 时,master分⽀会做相应的更新,可以简单理解为暂存区的⽬录 树才会被真正写到版本库中。
git add的本质是将工作区的代码加到暂存区中;git commit的本质是将暂存区的目录树添加到master中。
**注意:**通过新增或粘贴进目录的文件,并不能称之为向仓库内新增文件,而只是在工作区新增了文件。必须要通过使用
git add 和 git commit
命令才能将文件添加到仓库中进行管理!!!
暂存区和master存的都是目录索引,修改的工作区内容会写入对象库(.git/objects
)的一个新的git对象中。
4.添加文件 – 场景一
现在我们想让git管理一下ReadMe
文件,我们使用git add命令将文件添加到暂存区:
- 添加一个或者多个文件到暂存区:
git add [file1] [file2]...
- 添加指定目录到暂存区,包括子目录:
git add [dir]
- 添加当前目录下的所有文件改动到暂存区:
git add .
再使用git commit
命令将暂存区内容添加到本地仓库中:
- 添加暂存区全部内容到本地仓库中:
git commit -m "message"
- 提交暂存区的指定文件到仓库中:
git commit [file1] [file2] ... -m "message"
注意:
git commit
后⾯的 -m 选项,要跟上描述本次提交的message,由⽤⼾⾃⼰完成,这部分内 容绝对不能省略,并要好好描述,是⽤来记录你的提交细节,是给我们⼈看的。
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git add ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git commit -m 'add first file'
[master (root-commit) 3b64204] add first file
1 file changed, 1 insertion(+)
create mode 100644 ReadMe
git commit
命令执行成功后会告诉我们,1个文件被改动(就是我们新添加的ReadMe
文件)。我们也可以多次add不同的文件,而只commit一次便可以提交所有的文件,是因为需要提交的文件通通被add到暂存区中,然后一次性commit暂存区的所有修改。
git log
可以使用git log
命令来查看历史提交记录
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git log
commit 3b64204395259ee23740455b39ef6282195666d7
Author: Lxy <2357246060@qq.com>
Date: Sun Jun 25 21:36:12 2023 +0800
add first file
该命令显示从最近到最远的提交日志,并且可以看到我们commit时的日志消息。如果嫌输出信息太多,可以试试加上--pretty=oneline
参数。
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git log --pretty=oneline
3b64204395259ee23740455b39ef6282195666d7 add first file
说明一下:
我们看到的类似
3b64204395259ee23740455b39ef6282195666d7
的是每次提交的commit id
(版本号),Git的commit id
不是1、2、3…的递增的数字,而是一个SHA1(安全哈希算法)
计算出来的一个非常大的数字,用十六进制表示。
5.查看.git
文件
我们使用tree .git看看.git的目录结构:
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ tree .git
.git
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ └── master
├── objects
│ ├── 0e
│ │ └── 6b1780b73cd9220ec5073dc64b42f7ad4bd945
│ ├── 3b
│ │ └── 64204395259ee23740455b39ef6282195666d7
│ ├── 8d
│ │ └── 0e41234f24b6da002d962a26c2495ea16a425f
│ ├── info
│ └── pack
└── refs
├── heads
│ └── master
└── tags
15 directories, 21 files
index
就是暂存区,add后的内容都是添加到这里的HEAD
就是默认指向master分支的指针
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ cat .git/HEAD
ref: refs/heads/master
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ cat .git/refs/heads/master
3b64204395259ee23740455b39ef6282195666d7
找到这个⽂件之后,我们⼀般不能直接看到⾥⾯是什么,该类⽂件是经过sha
(安全哈希算法)加密过的 ⽂件,好在我们可以使⽤git cat-file
(-p 选项是输出格式更便于查看)命令来查看版本库对象的内容:
打印的3b64204395259ee23740455b39ef6282195666d7
就是当前最新的commit id
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git cat-file -p 3b64204395259ee23740455b39ef6282195666d7
tree 0e6b1780b73cd9220ec5073dc64b42f7ad4bd945
author Lxy <2357246060@qq.com> 1687700172 +0800
committer Lxy <2357246060@qq.com> 1687700172 +0800
add first file
tree的内容是 commit id
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git cat-file -p 0e6b1780b73cd9220ec5073dc64b42f7ad4bd945
100644 blob 8d0e41234f24b6da002d962a26c2495ea16a425f ReadMe
而8d0e41234f24b6da002d962a26c2495ea16a425f
这一行又是什么呢? 我们发现就是最近的一次修改内容
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git cat-file -p 8d0e41234f24b6da002d962a26c2495ea16a425f
hello git
objects
为Git的对象库,⾥⾯包含了创建的各种版本库对象及内容。当执⾏git add 命令 时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的 对象中,就位于".git/objects"⽬录下,让我们来看看这些对象有何⽤处:
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ ls .git/objects/
0e 3b 8d info pack
总结一下:在本地的git仓库中,有几个文件或者目录很特殊
- index:暂存区,git add 后会更新该内容
- HEAD:默认指向master分支的一个指针
- refs/heads/master:文件里保存当前
master
分支的最新commit id
- objects:包含了创建的各种版本库对象及内容,可以简单理解为放了git维护的所有修改。
6.添加文件 – 场景二
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ touch file1
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git add file1
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ touch file2
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git commit -m "add file"
[master cfd11ac] add file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1
首先,我们新增file1
文件,将file文件add到暂存区;再新增file2
文件,此时我们commit提交修改。我们发现提交后打印1 file changed, 0 insertions(+), 0 deletions(-)
,意思是只有一个文件改变了,这时我们不是新增了两个文件嘛?
其实这个问题也比较好理解,因为
git add
是将文件添加到暂存区,git commit
是将暂存区的内容添加到本地仓库中,由于我们并没有使用git add file2,file2
就不在暂存区中,因此我们commit的时候其实只是把已经在暂存区的file1
提交了,而遗漏了工作区的file2
。而我们要想再提交file2
,只需要再次add,commit即可。
7.修改文件
什么是修改?
比如我们新增了一行,删除了一行,更改了某些字符,甚至创建了一个新文件,这都属于修改。
Git跟踪管理的是修改,而不是文件
比如我们向ReadMe
文件进行一次修改(添加)
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
此时,仓库中的ReadMe
和我们工作区的ReadMe
是不同的,我们可以使用git status
命令来查看在你上次提交之后是否对文件进行再次修改。
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ReadMe
#
no changes added to commit (use "git add" and/or "git commit -a")
上面的结果告诉我们,ReadMe
被修改过,但还没有完成添加与提交。
目前我们只知道文件被修改了,如果能知道具体那些地方被修改了,就更好了。
因此我们可以使用git diff [file]
命令可以显示暂存区和工作区文件的差异,显示的格式是Unix通用的diff格式,也可以使用git diff HEAD -- [file]
命令来查看版本库和工作区文件的区别。
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git diff ReadMe
diff --git a/ReadMe b/ReadMe
index 8d0e412..8c2b72f 100644
--- a/ReadMe
+++ b/ReadMe
@@ -1 +1,3 @@
hello git
+hello world
+hello ReadMe
其中前有+的就是我们这一次新增的内容
知道对ReadMe
做了什么修改后,再把它提交到本地仓库就放心多了。
8.版本回退
Git能够管理文件的历史版本,这也是版本控制器的重要能力。如果有一天我们发现之前的工作出现了很大的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本回退的功能了。
执行git reset
命令用于回退版本,可以指定退回某一次提交的版本。
‘回退’ 的本质是要将版本库中的内容进行回退,工作区或暂存区是否回退由命令参数决定:
git reset
命令语法格式:git ret [--soft | --mixed | --hard] [HEAD]
--mixed
:为默选项,使用时可以不用带该参数,该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。--soft
:参数对于工作区和暂存区的内容都不变,只是将版本回退到某个指定版本。--hard
:参数将暂存区与工作区都退回到指定版本。切记工作区由未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用要慎重。- HEAD 说明:
- 可直接携程commit id,表示指定回退的版本
- HEAD 表示当前版本
- HEAD ^ 上一个版本
- HEAD ^^ 上上一个版本
- 以此类推…
- 可以使用 ~ 数字表示:
- HEAD ~ 0 表示当前版本
- HEAD ~ 1 上一个版本
- HEAD ~ 2 上上一个版本
- 以此类推…
为了方便表述,便于 测试回退功能,我们先做一些准备工作:更新3个版本的ReadMe
,并分别进行3次提交,如下所示:
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git log --pretty=oneline
2f86525112a4c8d08431fbf0c66110169acc28f7 第三次修改ReadMe
02716a930c61d73454ca22e8096af38c6059aab2 修改ReadMe
0c3e2b8c6d56bb935a38692d958ea21bf983aa4a add file2
cfd11ac69dd517ec96fff4d1119b617a1f90f55d add file
3b64204395259ee23740455b39ef6282195666d7 add first file
现在,如果我们想回退到上一个版本,重新基于上一个版本进行编写,由于这里我们希望工作区的内容也回退到上一个版本,因此我们这里使用--hard
参数。
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git log --pretty=oneline
2f86525112a4c8d08431fbf0c66110169acc28f7 第三次修改ReadMe
02716a930c61d73454ca22e8096af38c6059aab2 修改ReadMe
0c3e2b8c6d56bb935a38692d958ea21bf983aa4a add file2
cfd11ac69dd517ec96fff4d1119b617a1f90f55d add file
3b64204395259ee23740455b39ef6282195666d7 add first file
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git reset --hard 02716a930c61d73454ca22e8096af38c6059aab2
HEAD is now at 02716a9 修改ReadMe
此时我们发现ReadMe
文件的内容已经回退了。
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
我们再次使用git log
查看一下日志,发现HEAD
指向了上一个版本。
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git log --pretty=oneline
02716a930c61d73454ca22e8096af38c6059aab2 修改ReadMe
0c3e2b8c6d56bb935a38692d958ea21bf983aa4a add file2
cfd11ac69dd517ec96fff4d1119b617a1f90f55d add file
3b64204395259ee23740455b39ef6282195666d7 add first file
至此我们回退功能就演示完了,但是如果我现在后悔了,又想回到最新的那一个版本,我们怎么办呢?我们可以继续使用git reset
命令,回退到 最新的版本,但是我们必须要拿到他的commit id.但是我们看到git log
并不能打印出那一次的commit id
,运气好的化我们可以从终端之前的记录找找,但是运气不好的话,这个commit id就已经被我们搞丢了。
因此,Git还提供了一个git reflog
命令能补救一下,该命令用来记录本地的每一次命令:
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git reflog
02716a9 HEAD@{0}: reset: moving to 02716a930c61d73454ca22e8096af38c6059aab2
2f86525 HEAD@{1}: commit: 第三次修改ReadMe
02716a9 HEAD@{2}: commit: 修改ReadMe
0c3e2b8 HEAD@{3}: commit: add file2
cfd11ac HEAD@{4}: commit: add file
3b64204 HEAD@{5}: commit (initial): add first file
这样,我们就可以方便的找到所有的操作记录了。但是2f86525
时什么东西呢?这个是最新版本的commit id的一部分。因此,Git版本回退的时候,也可以使用部分commit id
来代表目标版本。
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git reset --hard 2f86525
HEAD is now at 2f86525 第三次修改ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git log --pretty=oneline
2f86525112a4c8d08431fbf0c66110169acc28f7 第三次修改ReadMe
02716a930c61d73454ca22e8096af38c6059aab2 修改ReadMe
0c3e2b8c6d56bb935a38692d958ea21bf983aa4a add file2
cfd11ac69dd517ec96fff4d1119b617a1f90f55d add file
3b64204395259ee23740455b39ef6282195666d7 add first file
值得说的是,Git
的版本回退速度⾮常快,因为Git在内部有个指向当前分⽀(此处是master
)的 HEAD
指针,refs/heads/master
⽂件⾥保存当前master
分⽀的最新commit id
。当我们 在回退版本的时候,Git
仅仅是给refs/heads/master
中存储⼀个特定的版本。示意图如下:
9.撤销修改
如果我们再我们的工作区写了很长时间代码,对于这份代码不满意,想恢复到上一个版本。那我们我们就要进行撤销操作。
情况一:对于工作区的代码,还没有add
你当然可以直接删掉你目前在工作区新增的代码。但是如果我们写了很久,一直都没有提交,该怎么删掉呢?
Git 给我们提供了更好的方式,我们可以使用git checkout -- [file]
命令让工作区的文件回到最近一次add或commit时的状态。要注意 git checkout -- [file]
命令中的 – 很重要,切记不要省略。
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ vim ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
git --version 2 # 新增的一行代码
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$
我们使用git checkout -- ReadMe
恢复到上一次add或者commit
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git checkout -- ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
情况二:已经add,但没有 commit
add后还是到了暂存区呢?怎么撤销呢?
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ vim ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
git --version 2 #新增了一行代码
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git add ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: ReadMe
#
我们可以使用git reset
回退命令,该命令如果使用--mixed
参数,可以将暂存区的内容退回未指定的版本内容,但工作区文件保持不变,那我们可以回退下暂存区的内容了!
--mixed
是默认参数,使用时可以省略
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git reset HEAD ReadMe
Unstaged changes after reset:
M ReadMe
用git status
查看一下,发现现在暂存区是干净的,工作区有修改
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ReadMe
#
no changes added to commit (use "git add" and/or "git commit -a")
至此已经恢复了,我们的修改只存在于工作区,如果想恢复工作区的内容,就返回了情况一了。
情况三:已经add,并且也commit了
这种情况下,我们可以git reset --hard HEAD^
回退到上一个版本! 不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。Git是分布式版本控制系统,一旦你推送到远程版本库,就很难办了… [commit之后没有push操作]
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git add ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git commit -m "新增ReadMe"
[master 5bc172f] 新增ReadMe
1 file changed, 2 insertions(+)
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git status
# On branch master
nothing to commit, working directory clean
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git reset --hard HEAD^
HEAD is now at 2f86525 第三次修改ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ cat ReadMe
hello git
hello world
hello ReadMe
git --version
撤销的目的 :是不影响远程仓库。
10.删除文件
在Git中,删除也是一个修改操作,如果我们要删除ReadMe
文件,怎么搞呢?如果我们通过rm ReadMe
命令,我们只是把工作区中的ReadMe
文件删掉了,而版本库中的并没有删掉.因此这样直接删除是没有用的,反而徒增烦恼,git status
命令辉立刻告诉你那些文件被删除了。
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ rm ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ 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
#
no changes added to commit (use "git add" and/or "git commit -a")
此时,工作区和版本库就不一致了,要删文件,目前除了要删工作区的文件,还要清楚版本库的文件。一般有两种情况:
- 确实要从版本库中删除文件
- 不小心删错了
对于第二种情况,很明显是误删了,需要使用git 来进行恢复,我们直接使用git checkout -- ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git checkout -- ReadMe
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ ll
total 4
-rw-rw-r-- 1 Lxy Lxy 0 Jun 26 12:19 file1
-rw-rw-r-- 1 Lxy Lxy 0 Jun 26 12:19 file2
-rw-rw-r-- 1 Lxy Lxy 50 Jun 26 13:46 ReadMe
对于第一种情况,很明显我们没有删完,我们只是删除了工作区的文件,这时候我们需要使用git rm
将文件从暂存区和工作区中删除,并且commit:
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git rm file1
rm 'file1'
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: file1
#
这里我们假如要删除file1
文件,最后我们只需要commit即可
[Lxy@iZ0jl0hb8whfvf16k6pumcZ gitcode]$ git commit -m "delete file1"
[master 7804665] delete file1
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 file1
现在,文件就从版本库中被删除了。