likes
comments
collection
share

后悔药-git操作中的回退

作者站长头像
站长
· 阅读数 26

git的4个区域

日常开发中离不开代码管理工具git。 git是分布式管理代码的工具,分为4个工作区域。

后悔药-git操作中的回退

  • 工作区: 日常开发操作的区域
  • 暂存区: 通过命令git add将工作区的内容添加到暂存区
  • 本地仓库: 通过命令git commit将暂存区的内容添加到本地仓库,本地仓库可以在.git目录下查看,git的所有数据信息都保存在该目录下
  • 远程仓库: 通过git push可以将本地仓库的修改提交到远程仓库,达到可以团队成员共享代码的目的。

reset回退代码

HEAD指针

git仓库初始化之后,默认会创建一个master分支,即主分支。分支是git对版本进行管理的时间线,记录着每次提交,自动把它们串成一条时间线。 在master这条分支时间线上有很多版本的时间节点【commit-id】,而HEAD指针指向的是当前分支最新一次的版本时间节点。

* 63cd517 (HEAD -> master) v3
* 678c5a5 v2
* c34a6ba v1

后悔药-git操作中的回退

HEAD可以表示相对位置:

  • 单独HEAD表示当前工作分支的最新提交版本
  • 使用^表示前一个版本,例如HEAD^ ,如果要表示前2个版本,HEAD^^,依此类推。
  • 如果版本跨度大,使用 ^就不科学,可使用 ~ 加数字表示当前版本之前的第几个版本。使用HEAD~10表示为最新版本往前第10个版本。
  • 也可以使用HEAD@{num}的方式表示。HEAD@{0}就相当于HEAD,HEAD@{1}相当于HEAD^。

后悔药-git操作中的回退

reset版本回退,有soft、mixed、hard三种类型回退方式

soft软回退

git reset --soft commit-id, 回退到指定的版本。soft软回退,仅仅修改分支中HEAD指针的位置,不改变工作区和暂存区代码。实际只是移动了本地仓库HEAD指针的指向。

在本地创建测试项目,并添加readme.md文件,添加内容并提交,目的是回退到该版本。

# 使用git log查看历史版本记录
shuais-MacBook-Pro:reset shuai$ git log --oneline
* 63cd517 (HEAD -> master) v3
* 678c5a5 v2
* c34a6ba v1

# 使用reflog查看历史版本记录
shuais-MacBook-Pro:reset shuai$ git reflog
63cd517 (HEAD -> master) HEAD@{0}: commit: v3
678c5a5 HEAD@{1}: commit: v2
c34a6ba HEAD@{2}: commit (initial): v1

# 查看readme.md文件内容
shuais-MacBook-Pro:reset shuai$ cat readme.md 
v3

向readme文件添加一行数据,并提交到本地仓库

shuais-MacBook-Pro:reset shuai$ echo "new line" >> readme.md
shuais-MacBook-Pro:reset shuai$ cat readme.md 
v3new line
shuais-MacBook-Pro:reset shuai$ git commit -a -m "commit new line v4"
[master a5e5191] commit new line v4
 1 file changed, 1 insertion(+), 1 deletion(-)
shuais-MacBook-Pro:reset shuai$ git log --oneline
a5e5191 (HEAD -> master) commit new line v4
63cd517 v3
678c5a5 v2
c34a6ba v1

可以对比工作区、暂存区、本地仓库中代码的差异。此时他们三个并无差异

# 对比工作区和暂存区中,差异
shuais-MacBook-Pro:reset shuai$ git diff readme.md 

# 对比 暂存区 和本地仓库中内容差异
shuais-MacBook-Pro:reset shuai$ git diff --cached readme.md 

执行reset回退

# 回退到上一个提交记录
shuais-MacBook-Pro:reset shuai$ git reset --soft HEAD^

回退后对比文件内容

# 对比工作区和暂存区文件差异,此时并无差异
shuais-MacBook-Pro:reset shuai$ git diff readme.md 

# 对比暂存区和仓库中文件差异
shuais-MacBook-Pro:reset shuai$ git diff --cached readme.md 
diff --git a/readme.md b/readme.md
index 04d0d54..6f67266 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1 @@
-v3
\ No newline at end of file
+v3new line

# 对比工作区和仓库中文件的差异
shuais-MacBook-Pro:reset shuai$ git diff HEAD readme.md 
diff --git a/readme.md b/readme.md
index 04d0d54..6f67266 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1 @@
-v3
\ No newline at end of file
+v3new line

对比后发现,三者之前文件的差异

  • 工作区和暂存区无差异
  • 暂存区 和 仓库中有差异
  • 工作区和仓库中 有差异

说明: 使用soft参数工作区和暂存区中内容没有回退,只有仓库中内容回退

查看提交日志

# 使用log查看历史版本记录
shuais-MacBook-Pro:reset shuai$ git log --oneline
63cd517 (HEAD -> master) v3
678c5a5 v2
c34a6ba v1

# 使用reflog查看历史记录
shuais-MacBook-Pro:reset shuai$ git reflog
63cd517 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
a5e5191 HEAD@{1}: commit: commit new line v4
63cd517 (HEAD -> master) HEAD@{2}: commit: v3
678c5a5 HEAD@{3}: commit: v2
c34a6ba HEAD@{4}: commit (initial): v1

可以看到log和reflog命令的区别:

  • 使用git log命令查看历史记录,已经看不到a5e5191这次提交记录
  • 使用git reflog命令查看历史记录,可以看到a5e5191记录还在

恢复到回退前版本

# 查看工作目录中文件状态
shuais-MacBook-Pro:reset shuai$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   readme.md
# 此时将文件退回了暂存区中,通过commit提交即可。

# 提交记录
shuais-MacBook-Pro:reset shuai$ git commit -m "append newline v5"
[master d352dd8] append newline v5
 1 file changed, 1 insertion(+), 1 deletion(-)
 
 # 查看目录中文件状态
shuais-MacBook-Pro:reset shuai$ git status
On branch master
nothing to commit, working tree clean

# 使用log查看历史记录
shuais-MacBook-Pro:reset shuai$ git log --oneline
d352dd8 (HEAD -> master) append newline v5
63cd517 v3
678c5a5 v2
c34a6ba v1
# 已经看不到第4次提交

# 使用reflog查看历史记录,可以查看到所有历史记录
shuais-MacBook-Pro:reset shuai$ git reflog
d352dd8 (HEAD -> master) HEAD@{0}: commit: append newline v5
63cd517 HEAD@{1}: reset: moving to HEAD^
a5e5191 HEAD@{2}: commit: commit new line v4
63cd517 HEAD@{3}: commit: v3
678c5a5 HEAD@{4}: commit: v2
c34a6ba HEAD@{5}: commit (initial): v1

# 通过回退 a5e5191,还有回退到第4次提交
shuais-MacBook-Pro:reset shuai$ git reset --soft a5e5191

shuais-MacBook-Pro:reset shuai$ git log --oneline
a5e5191 (HEAD -> master) commit new line v4
63cd517 v3
678c5a5 v2
c34a6ba v1

# 会生成一条新的commit提交日志,可以看出a5e5191和第4次提交的commit一样,说明已经回退到第4次
shuais-MacBook-Pro:reset shuai$ git reflog
a5e5191 (HEAD -> master) HEAD@{0}: reset: moving to a5e5191
d352dd8 HEAD@{1}: commit: append newline v5
63cd517 HEAD@{2}: reset: moving to HEAD^
a5e5191 (HEAD -> master) HEAD@{3}: commit: commit new line v4
63cd517 HEAD@{4}: commit: v3
678c5a5 HEAD@{5}: commit: v2
c34a6ba HEAD@{6}: commit (initial): v1

mixed混合回退

mixed是混合的,中等的回退。该命令不仅修改仓库的HEAD指针,还将暂存区的数据进行了回退。但是工作区的代码状态不变

创建本地测试文件,新建readme.md文件,并添加内容

# 使用log查看提交历史记录
shuais-MacBook-Pro:rest shuai$ git log --oneline
c45fa60 (HEAD -> master) v3
86d8436 v2
d5030ef v1

# 使用reflog查看历史记录
shuais-MacBook-Pro:rest shuai$ git reflog
c45fa60 (HEAD -> master) HEAD@{0}: commit: v3
86d8436 HEAD@{1}: commit: v2
d5030ef HEAD@{2}: commit (initial): v1

新增一行数据,并提交到仓库中

# 新增一行数据
shuais-MacBook-Pro:rest shuai$ echo "new line " >> readme.md 

# 提交数据
shuais-MacBook-Pro:rest shuai$ git commit -a -m "第4次提交,add new line"
[master 7bce542] 第4次提交,add new line
 1 file changed, 1 insertion(+)
 
 # 查看此时仓库的日志
shuais-MacBook-Pro:rest shuai$ git log --oneline
7bce542 (HEAD -> master) 第4次提交,add new line
c45fa60 v3
86d8436 v2
d5030ef v1

现在对比工作区、暂存区、本地仓库中文件的差异。此时3者并无差异

# 对比工作区和暂存区文件差异
shuais-MacBook-Pro:rest shuai$ git diff readme.md 
# 对比暂存区和仓库文件的差异
shuais-MacBook-Pro:rest shuai$ git diff --cached readme.md 
# 对比工作区和仓库文件的差异
shuais-MacBook-Pro:rest shuai$ git diff HEAD readme.md 

执行回退操作,退回v3版本

shuais-MacBook-Pro:rest shuai$ git reset --mixed HEAD^
Unstaged changes after reset:
M       readme.md
  • Unstaged changes after reset: 说明回退后,有未被追踪的文件
  • M readme.md:表示readme.md文件修改后,未被追踪。即修改后,文件未添加到暂存区的状态
  • 此时文件被退回到了工作区的状态

回退后,对比文件差异

# 对比工作区和暂存区中文件差异
shuais-MacBook-Pro:rest shuai$ git diff readme.md 
diff --git a/readme.md b/readme.md
index 46b68dc..36125a4 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1,2 @@
 hello world v3
+new line 

# 对比暂存区和仓库中文件差异
shuais-MacBook-Pro:rest shuai$ git diff --cached readme.md 

#对比工作区和仓库中文件差异
shuais-MacBook-Pro:rest shuai$ git diff HEAD readme.md 
diff --git a/readme.md b/readme.md
index 46b68dc..36125a4 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1,2 @@
 hello world v3
+new line 

通过对比可以发现:

  • 工作区和暂存区的内容出现了差异
  • 暂存区和仓库中没有差异
  • 工作区和仓库中 出现了差异

查看提交日志

# 使用log查看历史提交记录
shuais-MacBook-Pro:rest shuai$ git log --oneline
c45fa60 (HEAD -> master) v3
86d8436 v2
d5030ef v1

# 使用reflog查看提交记录
shuais-MacBook-Pro:rest shuai$ git reflog
c45fa60 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
7bce542 HEAD@{1}: commit: 第4次提交,add new line
c45fa60 (HEAD -> master) HEAD@{2}: commit: v3
86d8436 HEAD@{3}: commit: v2
d5030ef HEAD@{4}: commit (initial): v1
  • log查看时,第4次提交记录已经不存在
  • reflog查看提交记录,第4次提交记录仍然存在

恢复到回退之前版本

git reset --mixed commit-id命令回退,做了2个操作

  • 移动HEAD指针,即回退仓库中的代码
  • 回退暂存区中的内容,将暂存区内容退到HEAD指针指向的版本
shuais-MacBook-Pro:rest shuai$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   readme.md

no changes added to commit (use "git add" and/or "git commit -a")

readme.md文件是修改未暂存状态。接下来要先添加到暂存区【add】,然后在提交【commit】

# 添加到暂存区
shuais-MacBook-Pro:rest shuai$ git add .
#提交到仓库
shuais-MacBook-Pro:rest shuai$ git commit -m "append new line v5"

# 使用log查看提交历史
shuais-MacBook-Pro:rest shuai$ git log --oneline
ead44f4 (HEAD -> master) append new line v5
c45fa60 v3
86d8436 v2
d5030ef v1

#使用reflog查看提交历史
shuais-MacBook-Pro:rest shuai$ git reflog
ead44f4 (HEAD -> master) HEAD@{0}: commit: append new line v5
c45fa60 HEAD@{1}: reset: moving to HEAD^
7bce542 HEAD@{2}: commit: 第4次提交,add new line
c45fa60 HEAD@{3}: commit: v3
86d8436 HEAD@{4}: commit: v2
d5030ef HEAD@{5}: commit (initial): v1
# 执行回退到第四次提交7bce542
shuais-MacBook-Pro:rest shuai$ git reset --mixed 7bce542
# 查看文件状态
shuais-MacBook-Pro:rest shuai$ git status
On branch master
nothing to commit, working tree clean

# log查看版本提交历史
shuais-MacBook-Pro:rest shuai$ git log --oneline
7bce542 (HEAD -> master) 第4次提交,add new line
c45fa60 v3
86d8436 v2
d5030ef v1

# 使用reflog查看提交的历史
shuais-MacBook-Pro:rest shuai$ git reflog
7bce542 (HEAD -> master) HEAD@{0}: reset: moving to 7bce542
ead44f4 HEAD@{1}: commit: append new line v5
c45fa60 HEAD@{2}: reset: moving to HEAD^
7bce542 (HEAD -> master) HEAD@{3}: commit: 第4次提交,add new line
c45fa60 HEAD@{4}: commit: v3
86d8436 HEAD@{5}: commit: v2
d5030ef HEAD@{6}: commit (initial): v1

hard强回退

git reset --hard commit-id回退到指定版本,hard强硬的,严格的回退。该参数的回退,会把工作区和暂存区中的数据都回退到指定版本。【该命令谨慎使用】

本地创建测试代码库,创建出readme.md文件,git init初始化项目

# 使用log查看历史记录
shuais-MacBook-Pro:reset shuai$ git log --oneline
229cc1f (HEAD -> master) v3
be516b5 v2
04b38f8 v1

#使用reflog查看历史记录
shuais-MacBook-Pro:reset shuai$ git reflog
229cc1f (HEAD -> master) HEAD@{0}: commit: v3
be516b5 HEAD@{1}: commit: v2
04b38f8 HEAD@{2}: commit (initial): v1

# 向readme.md文件新增数据new line
$ echo "new line" >> readme.md 

# 提交到本地仓库
shuais-MacBook-Pro:reset shuai$ git commit -a -m "第4次提交,新增内容new line "
[master 6804892] 第4次提交,新增内容new line
 1 file changed, 1 insertion(+), 1 deletion(-)

# 查看历史日志
shuais-MacBook-Pro:reset shuai$ git log --oneline
6804892 (HEAD -> master) 第4次提交,新增内容new line
229cc1f v3
be516b5 v2
04b38f8 v1

对比工作区、暂存区、本地仓库中代码的差异。此时他们三个并无差异。

执行回退操作,退回到v3版本

# 回退到前一个提交记录的版本
shuais-MacBook-Pro:reset shuai$ git reset --hard HEAD^
HEAD is now at 229cc1f v3

HEAD is now at 229cc1f v3 意思是HEAD现在位于 229cc1f 提交记录,可以看到就是v3的版本记录。

回退后对比文件差异

# 对比工作区和暂存区
shuais-MacBook-Pro:reset shuai$ git diff readme.md 
# 对比暂存区和仓库
shuais-MacBook-Pro:reset shuai$ git diff --cached readme.md 
# 对比工作区和仓库
shuais-MacBook-Pro:reset shuai$ git diff HEAD readme.md 

工作区、暂存区、仓库都退回到了执行版本

查看提交日志记录

# 使用log查看提交历史记录
shuais-MacBook-Pro:reset shuai$ git log --oneline
229cc1f (HEAD -> master) v3
be516b5 v2
04b38f8 v1

# 使用reflog查看提交历史记录
shuais-MacBook-Pro:reset shuai$ git reflog
229cc1f (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
6804892 HEAD@{1}: commit: 第4次提交,新增内容new line
229cc1f (HEAD -> master) HEAD@{2}: commit: v3
be516b5 HEAD@{3}: commit: v2
04b38f8 HEAD@{4}: commit (initial): v1
  • log命令查看时,第4次提交已经不存在
  • reflog命令查看时,第4次提交仍然存在

恢复到回退前版本

git reset --hard 命令回退,做了3个操作

  • 移动HEAD执行,回退仓库中的记录
  • 暂存区内容的回退到HEAD指针指向的版本
  • 工作区内容,回退到HEAD指针指向的版本
# 查看文件状态,工作目录是非常干净
shuais-MacBook-Pro:reset shuai$ git status
On branch master
nothing to commit, working tree clean

如果要恢复到回退之前的版本,也只能使用git reset --hard命令操作。

# 1查看下可以回退的历史版本
shuais-MacBook-Pro:reset shuai$ git reflog
229cc1f (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
6804892 HEAD@{1}: commit: 第4次提交,新增内容new line
229cc1f (HEAD -> master) HEAD@{2}: commit: v3
be516b5 HEAD@{3}: commit: v2
04b38f8 HEAD@{4}: commit (initial): v1

# 2,执行回退,回退到第4次提交,即6804892
shuais-MacBook-Pro:reset shuai$ git reset --hard 6804892
HEAD is now at 6804892 第4次提交,新增内容new line

# 3 查看文件状态
shuais-MacBook-Pro:reset shuai$ git status
On branch master
nothing to commit, working tree clean

# 4使用log命令查看版本历史
shuais-MacBook-Pro:reset shuai$ git log --oneline
6804892 (HEAD -> master) 第4次提交,新增内容new line
229cc1f v3
be516b5 v2
04b38f8 v1

#5使用reflog命令查看可回退的版本历史
shuais-MacBook-Pro:reset shuai$ git reflog
6804892 (HEAD -> master) HEAD@{0}: reset: moving to 6804892
229cc1f HEAD@{1}: reset: moving to HEAD^
6804892 (HEAD -> master) HEAD@{2}: commit: 第4次提交,新增内容new line
229cc1f HEAD@{3}: commit: v3
be516b5 HEAD@{4}: commit: v2
04b38f8 HEAD@{5}: commit (initial): v1

reset使用总结

关于reset版本回退。当在v4版本中,回退到v3版本

后悔药-git操作中的回退 在工作区、暂存区,仓库中文件的状态

后悔药-git操作中的回退

分别执行3中回退方式

  • git reset --soft HEAD^ :软性回退
  • git reset --mixed HEAD^ :混合回退
  • git reset --hard HEAD^ :硬性回退

revert回退代码

revert 命令会在历史中增加一条commit记录,用来撤销之前的commit提交记录。 git revert命令用来撤销之前提交的版本记录,来达到修改的目的。

后悔药-git操作中的回退 新建一个测试代码git仓库,提交记录如下

shuais-MacBook-Pro:revert shuai$ git alog
* ec2ab45 (HEAD -> master) v4 w
* 00e34c1 v3 w
* cb4a3c0 v2
* 6988773 v1

后悔药-git操作中的回退 此时head指针在v4,即ec2ab45的commit上。需要把head指向v2即可达到目的。

根据之前的reset,可以很容易操作git reset --hard ec2ab45但是这样存在弊端,会把v3和v4的提交给隐藏掉,如果有天突然觉得v3和v4版本是正确的需要恢复,就不那么容易操作,【当然也可通过reflog可以查看,然后恢复】 由于会撤销掉一些commit记录,很多公司是禁止使用reset命令。这时就必须是revert。

# 撤销v4提交记录,然后会出现一个编辑文本框,如下面编辑框
shuais-MacBook-Pro:revert shuai$ git revert ec2ab45
[master cf8a19a] Revert "v4 w"
 1 file changed, 1 insertion(+), 2 deletions(-)
 
# 撤销v3提交记录,然后会出现一个编辑文本框,如下面编辑框
shuais-MacBook-Pro:revert shuai$ git revert 00e34c1
[master 1788aaa] Revert "v3 w"
 1 file changed, 1 insertion(+), 2 deletions(-)

# 查看历史,可以看到新增了revert v4和revert v3
shuais-MacBook-Pro:revert shuai$ git log --oneline
1788aaa (HEAD -> master) Revert "v3 w"
cf8a19a Revert "v4 w"
ec2ab45 v4 w
00e34c1 v3 w
cb4a3c0 v2
6988773 v1

revert命令后的编辑弹出框,可以进行编辑后保存 revert命令的作用是通过创建一个新的版本commit,来回退到目标版本,HEAD指针指向了新生成的commit,而不是原来的目标commit。

对比revert和reset的示意图

后悔药-git操作中的回退

一次revert多个记录

在上面的例子中,只是回退了2次,如果需要进行多次回退的话

  • 第一种方式:git revert ,顺序是从后向前,否次会多次冲突。
  • 第二种方式:git revert ...,该操作只是回退了5和6,不包括开头的4。并且要注意中间是3个点
  • 第三种方式:git revert ^.., 该操作回退了4、5、6三个提交记录。中间使用2个点。

假如当前 git commit 链是 A -> B -> C -> D

如果想把B,C,D都给revert,除了一个一个revert之外,还可以使用range revert git revert B^..D 等价于 git revert A...D

用法:

B^..D 代表区间[B,D],包括B也包括D,其中B提交在前,D提交在后,D为起点commit。

A...D 代表一个左开右闭区间(A,D],不包括A,包括D. 其中D为起点commit,A为终点commit的下一个commit

注意⚠️:都是闭区间时,中间2个点。前开后闭时,中间有3个点。

这样就把B,C,D都给revert了,变成:

A-> B ->C -> D -> D'-> C' -> B'

用法就是:

git revert BEFORE_COMMIT^..AFTER_COMMIT

如果我们想把这三个revert不自动生成三个新的commit,而是用一个commit完成,可以这样:

$ git revert -n BEFORE_COMMIT^..AFTER_COMMIT  
$ git commit -m "revert BEFORE_COMMIT to AFTER_COMMIT"

restore回退代码

  • git restore <filename> 撤销 工作区的内容
  • git restore --staged <filename> 撤销 暂存区的内容回退到工作区

从暂存区回退内容

创建一个项目,新建readme.txt文件。新建readme.txt文件

# log查看提交历史记录,进行了4次提交
MacBook-Pro:restore shuai$ git log --oneline
d9531bd (HEAD -> master) add file
4cff528 v3
bdaa5d3 v2
2688ed0 v1

然后又在readme.txt文件中增加一行

# 1.对文件readme新增一行内容,这是错误内容。操作目的是从暂存区撤销,并在本地也撤销
shuais-MacBook-Pro:restore shuai$ echo "this is wrong!  " >> readme.txt

# 2.将内容添加到暂存区。【因为这时还不知道是错的内容】
shuais-MacBook-Pro:restore shuai$ git add .

# 3.查看文件状态,以及提交到了暂存区
shuais-MacBook-Pro:restore shuai$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   readme.txt

# 4.通过restore --staged可以将暂存区内容回退到工作区
shuais-MacBook-Pro:restore shuai$ git restore --staged .

# 5.查看文件状态,已经把添加的错误内容退回到了工作区
shuais-MacBook-Pro:restore shuai$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

# 6. 将工作区的内容撤销
shuais-MacBook-Pro:restore shuai$ git restore .

从仓库中回退内容

仓库分为本地仓库和远程仓库,撤销本地仓库相对还比较简单。

撤销本地仓库内容

使用reset命令

# 1.对文件readme新增一行内容,这是错误内容。
shuais-MacBook-Pro:restore shuai$ echo "this is wrong!  " >> readme.txt

# 2.将内容添加到暂存区
shuais-MacBook-Pro:restore shuai$ git add .

# 3.将暂存区的内容,提交到本地仓库
shuais-MacBook-Pro:restore shuai$ git commit -m "add wrong content"
[master cda7c9b] add wrong content
 1 file changed, 1 insertion(+)
 
# 4.查看git状态
shuais-MacBook-Pro:restore shuai$ git status
On branch master
nothing to commit, working tree clean

# 5.查看提交记录
shuais-MacBook-Pro:restore shuai$ git log --oneline
cda7c9b (HEAD -> master) add wrong content
d9531bd add file
4cff528 v3
bdaa5d3 v2
2688ed0 v1

# 使用reset 默认参数【--mixed】,可以回退暂存区和本地仓库内容,这样还可以在工作区继续修改编辑
# 也可使用--soft参数,只回退暂存区内容
# 也可使用--hard参数,同时回退工作区,暂存区,本地仓库的内容。把修改的内容全部清空回退,无法再次编辑
# 6.使用reset可以回退本地仓库的记录,git reset head~n,表示回退n个提交记录
shuais-MacBook-Pro:restore shuai$ git reset HEAD^
Unstaged changes after reset:
M       readme.txt

撤销远程仓库内容

操作远程仓库的撤销,最好使用revert回滚操作,这个操作可以新增一次commit提交记录,以免后边出现问题,能够进行查看修复。

使用reset回退操作,会把以前的提交commit记录给重置掉,且不会新增commit提交记录。该操作之后进行push操作无法正常进行,如果一定要同步远程仓库内容,可以使用git push -f强制操作。 但是注意⚠️,该操作只能作用在自己的分支中,对公共分支进行此操作后,会造成其它人无法更新代码。

清理untracked files未追踪的文件

事件起因:使用git stash进行暂存的时候,会有些是新增的文件,新增的文件无法使用上面3个命令将工作区的内容回退到原始位置。

新增的这些文件就是 【untacked files】

# 1.删除 untracked files
git clean -f

# 2.删除 untracked files,连 untracked 的目录也一起删掉[常用]
git clean -fd

# 3.连 .gitignore 的untrack 文件/目录也一起删掉
git clean -xfd

总结对比

命令操作
revert新增一个提交记录commit,用来撤销之前的commit
reset回退到指定的commit历史,不会新增提交记录。包括三种模式:--soft:只回退本地仓库的代码,工作区和暂存区的内容不回退; --mixed:回退本地仓库和暂存区,工作区的内容不回退;--hard:工作区、暂存区、本地仓库都进行回退。
restore默认是撤销工作区的内容修改; --staged 撤销工作区的内容修改