Git 工具原理及使用 -- 基本使用

Git 工具原理及使用 – 基本使用

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 "[email protected]"

查看配置

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 "[email protected]"

删除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

现在,文件就从版本库中被删除了。

猜你喜欢

转载自blog.csdn.net/qq_58325487/article/details/131395903