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

news2024/11/18 23:27:50

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【哈士奇赠书活动 - 28期】- 〖产品经理就业实战〗

文章目录 ⭐️ 赠书 - 《产品经理就业实战》⭐️ 内容简介⭐️ 作者简介⭐️ 编辑推荐⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《产品经理就业实战》 ⭐️ 内容简介 本书专门为想要入行从事产品经理相关工作的零基础就业人员而编写&#xff0c;涵盖了在产品准备阶段、产品开发阶…

TipDM数据挖掘建模平台产品功能特点

TipDM数据挖掘建模平台是可视化、一站式、高性能的数据挖掘与人工智能建模服务平台&#xff0c;致力于为使用者打通从数据接入、数据预处理、模型开发训练、模型评估比较、模型应用部署到模型任务调度的全链路。平台内置丰富的机器学习、深度学习、人工智能算法&#xff0c;可覆…

桥接模式(Bridge)

定义 桥接是一种结构型设计模式&#xff0c;可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&#xff0c;从而能在开发时分别使用。 前言 1. 问题 假如你有一个几何形状&#xff08;Shape&#xff09;类&#xff0c; 从它能扩展出两个子类&#xff1a…

2023最强免费的AI生成图像工具其1

Midjourney虽然很强&#xff0c;但是要钱.Stable Diffusion也很强&#xff0c;但是对于小白来说部署起来也是很麻烦。我们整理了一些已经上线了的&#xff0c;可以直接访问和使用的AI生成图像的工具网站集合。 收录到 2023 最强免费AI生成图像工具集合系列https://www.webhub1…

STM32速成笔记—RTC

文章目录 一、RTC简介二、STM32的RTC2.1 主要特性2.2 RTC框图介绍 三、访问后备区域步骤四、RTC配置步骤五、RTC程序配置5.1 RTC结构体定义5.2 RTC初始化函数5.3 设置年月日&#xff0c;时分秒5.4 判断闰年函数5.5 获取当前年月日&#xff0c;时分秒5.6 获取星期几5.7 中断服务…

【②MySQL 】:测试数据准备、SQL语句规范与基本操作

前言 欢迎来到小K的MySQL专栏&#xff0c;本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解~✨文末送书&#xff0c;小K赠书活动第二期 目录 前言一、准备测试数据二、SQL语句规范三、数据库的基本操作四、总结&#xff1a;文末赠书 一、准备测…

智能应急疏散系统在大型建筑中的的功能与应用

安科瑞 华楠 摘 要&#xff1a;随着经济的不断发展和城市化进程的推进,城市建筑逐渐发展为高层化、大型化和功能综合化,大空间的建筑物增多。为了实现以人为本,坚持可持续发展理念,保证城市建设系统的正常运行,安全防灾系统在建筑中必不可少,而火患是一项重要的防范内容,要不断…

使用RabbitMQ死信队列关闭未支付的订单

一、什么是RabbitMQ死信队列 RabbitMQ死信队列&#xff08;Dead-Letter Exchange&#xff0c;简称DLX&#xff09;是一种特殊类型的交换机&#xff0c;用于处理在队列中无法被消费的消息。当消息无法被消费时&#xff0c;它会被转发到死信队列中&#xff0c;以便进一步处理。 …

7-WebApis-1

Web APIs - 1 掌握DOM属性操作&#xff0c;完成元素内容设置&#xff0c;元素属性设置&#xff0c;控制元素样式 DOM简介获取DOM元素操作元素内容操作元素属性定时器-间隔函数综合案例 描述属性/方法效果获取DOM对象document.querySelector()获取指定的第一个元素document.que…

nuxt 设置i18n后多语言文件不会动态更新

nuxt 设置i18n后多语言文件不会动态更新 昨天遇到的一个问题&#xff0c;然后研究了一整天&#xff0c;今天才得到解决 nuxt 设置i18n多语言时多语言文件不会动态更新 我的原始代码如下&#xff1a; {modules: [nuxtjs/i18n,],i18n: {locales: [{code: en,iso: en-US,name:…

构建可靠软件的关键步骤之单元测试

引言&#xff1a;在当今快节奏的软件开发环境中&#xff0c;构建可靠的软件是至关重要的。单元测试作为软件开发过程中的关键步骤之一&#xff0c;能够帮助开发者发现和解决代码中的错误&#xff0c;确保代码的正确性。本文将详细介绍单元测试的概念、重要性以及如何有效地进行…

impala远程连接失败排查

周一开发反馈在本地电脑上连接impala失败&#xff0c;怀疑是服务问题。测试后发现服务正常&#xff0c;故障也恢复了&#xff0c;就没追究&#xff0c;第二天又出现相似的故障。服务依然正常。怀疑是网络问题。联系网络同事排查。telnet通。网络负载也不是很高&#xff0c;搁置…

档案库房温湿度标准及措施【档案八防十防解决方案】

档案馆库房温湿度调控标准及相应的措施方案 档案库房是档案保管的基本条件&#xff0c;档案库房温湿度与保护档案&#xff0c;延长档案寿命有很大关系。 档案库房适宜温湿度标准为&#xff1a;温度14℃—24℃&#xff0c;相对湿度45&#xff05;一60 一、库房温湿度对档案的影响…

基于Arduino单片机超声波测距仪设计

文章目录 摘 要 1.课程设计任务 1.1课程设计题目 1.2设计的要求 2.设计总体方案 2.1初步设计方案 2.2各个单元电路的设计要求 2.3主要性能指标 2.4总体方案 3.单元模块设计 3.1显示模块 3.2超声波测距模块 3.3蜂鸣器模块 3.4电机模块 3.5 LED二极管模块 4.软件…

【三维编辑】Editing Conditional Radiance Fields 编辑条件辐射场

Editing Conditional Radiance Fields&#xff08;ICCV 2021&#xff09; 作者单位&#xff1a;Steven Liu, Xiuming Zhang, Zhoutong Zhang, Richard Zhang MIT, Adobe Research, CMU 代码地址&#xff1a;https://github.com/stevliu/editnerf 文章目录 摘要前言一、相关工作…

避雷器带电监测仪

一、产品特点&#xff1a; 本机采用大屏幕液晶显示&#xff0c;全中文菜单操作&#xff0c;使用简便高精度采样、处理电路&#xff0c;先进的付里叶谐波分析技术&#xff0c;确保数据更加可靠 仪器采用独特的高速磁隔离数字传感器直接采ji输入的电压、电流信号&#xff0c;保证…

HTML 全面入门教程:从基础到高级

目录 一、基本结构和标签1. HTML 文档结构2. 常用标签 二、表单和输入元素1. 表单标签&#xff08;<form>&#xff09;2. 输入元素3.实例 三、样式和布局1. 内联样式2. 内部样式表3. 外部样式表 四、多媒体和嵌入内容1. 图像2. 音频和视频3. 嵌入内容 五、语义化标签语义…

胎压计PCBA方案设计

汽车的出现极大的方便了人们的交通出行&#xff0c;随着经济社会的发展&#xff0c;人们生活水平显著提高&#xff0c;不少家庭都购买了汽车。但是车主们不仅要知道开车&#xff0c;更需要知道检测汽车胎压。气压计也称为胎压计&#xff0c;是一种检测胎压的测量仪器。电子产品…

RabbitMQ学习笔记6(小滴课堂)路由,主题模式

我们去修改我们的生产者代码&#xff1a; 我们去修改我们的消费者&#xff1a; 第一个节点&#xff1a; 我们还要去创建其它更多的节点&#xff1a; 这里第二个节点我们只绑定一个交换机队列。 我们去分别启动消费者和生产者&#xff1a; 我们可以看到第一个交换机只绑定了一…

Deepin 20.8 linux convert 一寸照 调整图片尺寸413x579 300dpi

原图 convert修改尺寸指令 convert 一寸照.jpg -resize 413x579 一寸照413x579.jpg 目标图 尺寸已调整&#xff0c;dpi太低了 图片高清修复 提升dpi https://github.com/microsoft/Bringing-Old-Photos-Back-to-Life 官方安装过程参考 Installation Clone the Synchron…