学新通技术网

【Git 入门系列】修改管理、撤销操作、命令及区间关系

juejin 3 1
【Git 入门系列】修改管理、撤销操作、命令及区间关系

 

前言

在上一篇中,介绍了 Git 、Git 的安装以及基本使用 用 git add 将修改的文件添加到 暂存区,用 git commit 将暂存区的内容提交到 Git 管理,使用 git push 将本地内容同步到远端仓库中。使用 git status 来查看当前文件状态,git log 来看提交记录,git diff 用来查看修改内容。

如果已经 add 了,怎么取消呢?

已经 commit 了,该如何撤回呢?

本篇来解决这个问题 ↓↓

丢弃工作区修改(取消修改内容)

首先先说明下修改的概念,修改是什么? 比如添加了一行,修改了一行,或者删除一样都是修改,加个换行符一个空格也都是修改,创建一个新文件,或删除一个文件都是修改。

假设小王在 test 文档中不小心撒了欢儿,打出了lalala,如果发现了可以手动恢复到上一个状态。

当然通过 Git 也完成这一操作。

image.png 如果用 status 看一下,Git 会提示有两种操作

  • 使用 git add 添加
  • 使用git checkout -- <file>丢弃工作区修改

git checkout -- <file> 就是我们要使用的

image.png

再来看下 test.txt, 已经恢复了改动之前的内容

image.png

git checkout用来丢弃工作区修改,回退到上一次commit

  • git checkout -- <file>舍弃某个文件的改动,注意一定要有“--” checkout 还可以对分支进行操作,后续再了解
  • git checkout .注意有“.” 舍弃工作区当前全部改动

移除暂存区(针对add)

小王改了 test 文件,打算提交了,就用 add 放在了暂存区,然后发现 test 还有要修改的地方,怎么办?

这时候有两种方法

  • 如果想继续修改再提交,那么继续修改再 add 就可以
  • 如果是多个文件,有其中一两个文件,或者全部文件都不想提交了,就需要把暂存区的文件撤回到工作区 目的就是使得 暂存区的文件都是可以提交的内容,如果不需要就要移出暂存区

上面我们修改了 test 文件,还没有添加到暂存区,如果添加到暂存区的文件怎么撤回呢? 修改下文件,并 add

image.png

Git 会提示使用 git reset HEAD <file> 将 stage 状态改为 unstage,也就是移出暂存区到工作区

image.png

可以看到此时并不会丢弃修改的内容,而是将暂存区的文件撤回到工作区,这就是 git reset HEAD <file>的用法,reset 也可以像 add 和 checkout 一样有全部操作,git reset . 即可

举个例子,现在有多个文件修改了,有部分文件需要提交,但是add . 全都提交了,就可以使用 reset 将待提交的文件撤回到工作区。

撤销上一次提交(针对commit)

先看一组操作,修改 test 内容,并进行一次提交 ,说明一下 commit123

image.png

现在修改的文件被提交了并且 commit 了,现在发现提交的有问题,不想提交了,怎么办?

git reset --soft HEAD^不删除工作区的改动,撤销commit,将内容存放在暂存区(add 之后),HEAD^ 或 HEAD~ 1 表示上一次 commit(HEAD~2就是上上次commit), 也可以接commitid,如 git reset --soft 8f1fe9,撤销commit 到 「github commit」 那一次提交,之后修改的内容都在暂存区

image.png

reset 命令的其他参数及比较 git reset -- soft撤销commit,保留修改内容到暂存区(index) git reset --mixed撤销commit,保留修改内容到工作区(working dir) git reset --hard 撤销commit,直接丢弃修改,回退到指定的 commit,也可以理解成,强制回退到某一版本

删除文件

在 Git 中,删除也是一个修改操作,如果需要删除操作方式和前面所说的修改是一致的

我们先新建一个文件 test2.txt,并提交

image.png 现在要删除 test2 文件

可以直接删除, 也可以用命令 git rm <file> 进行删除

确认删除也就是 delete之后提交,那么这个文件就被删除,且改动记录在版本库中了

image.png

如果一个文件已经被提交到版本库,那么你永远不用担心误删

上面是一个已经添加到版本库的文件删除,如果是一个未监视的文件(untracked file),一般是创建新文件或文件夹,你会发现 checkoutrm 都不起作用

我们再新建一个test2.txt, 同时建立一个文件夹 new

image.png

这时候如果要删除,可以手动删除,或者使用git clean ,上面的图中可以看出,status 查看,文件是可以显示出来的,但是新建的目录并没有显示

git clean 有些常见参数

git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>

  • -d,移除未监视目录和文件
  • -f(--force),表示强制删除
  • -n (--dry-run),只显示将要做什么 详情可参考 git-scm.com/docs/git-cl…

参数比较多,但是常用主要有下面几个

  • git clean -f 删除 untracked files (仅删除未监视文件,不包含目录)

    image.png 上面只删除了 test2,如果要删除某一个文件 git clean -f <file>

  • git clean -fd 会删除 untracked 的文件和目录

    又新建了test2 文件,使用 -fd 会将未监视的目录也删掉

    image.png

    同样,删除某一个文件夹 git clean -fd <dir>

  • git clean -xfd 连 gitignore 的 untracked 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)

直接删除可能会有风险,可能删除我们不想删掉的内容,所以在用上述 git clean 前,建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删

  • git clean -nf(或 git clean -f -n
  • git clean -nfd(或 git clean -fd -n
  • git clean -nxfd(或 git clean -xfd -n

再新建 test2 和 new文件夹

image.png 使用 添加 -n 先查看,这样可以避免误删操作

回顾总结

  • 撤销工作区修改,使用git checkout --<file>git checkout .

  • 撤销暂存区提交,使用 git reset HEAD^git reset .

  • 撤销 commit,使用 git reset [--soft | --mixed | --hard] HEAD^git reset [--soft | --mixed | --hard] commitId, 默认为 mixed

  • 删除已提交的文件 git rm <file>

  • 删除 untracked files 使用 git clean

  • git clean -f删除 untracked files

  • git clean -fd (或 git clean -f -d)删除 untracked files 和目录

  • git clean -xfd 连 gitignore 的 untracked 文件/目录也一起删掉(不常用) 加 -n 可以先查看将会删除的内容 如 git clean -nf(或git clean -f -n

结合上一篇内容在 Git 管理中涉及到的命令以及区间关系

Git 区间和命令关系.png

能够熟练掌握 Git 工作区及其相关指令的关系,那么恭喜你,已经成功入门了!

本文出至:学新通技术网

标签: