Featured image of post Git入门之日志和版本回退

Git入门之日志和版本回退

2980 words

回到前一次提交

强大的git log

在之前,我们已经介绍了git log的基本使用方法,这里我们要进一步介绍git log的使用。

  • 查看提交的内容差异 git log提供了-p参数,用于查看每次提交之间的内容差异,如下:   

  git log -p 即可显示每次提交之间的变化:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
commit 92f972422350ef603beb2740a78f57d0f98c1738 (HEAD -> master, origin/mast
Author: educoder <user@sample.com>
Date:   Sat Jan 6 15:57:52 2018 +0800
    第一次提交
diff --git a/7-1.sh b/7-1.sh
new file mode 100644
index 0000000..fa7cc9c
--- /dev/null
+++ b/7-1.sh
@@ -0,0 +1 @@
+###
\ No newline at end of file
diff --git a/7-2.sh b/7-2.sh
new file mode 100644
index 0000000..fa7cc9c
--- /dev/null
+++ b/7-2.sh
@@ -0,0 +1 @@
+###
\ No newline at end of file
diff --git a/7-3.sh b/7-3.sh
new file mode 100644
index 0000000..fa7cc9c
--- /dev/null
+++ b/7-3.sh
@@ -0,0 +1 @@
+###
\ No newline at end of file
diff --git a/7-4.sh b/7-4.sh
new file mode 100644
index 0000000..fa7cc9c
--- /dev/null
+++ b/7-4.sh

而如果想限制显示的范围,则可以再添加参数用于限定:

  git log -p -2

如上,则仅显示最近的两次更新。

如上所示,这一选项附带了每次commit的内容变化,这就为代码审查或者浏览某个搭档的修改内容,提供了很好的参考。

其他git log选项:

1.单词层面对比

Git提供了–word-diff选项,可以显示单词层面的差异。当需要在书籍、论文这种很大的文本文件上,进行对比的时候,这个功能就非常有用。

2.显示简要的增改行数

Git提供了–stat选项,则可以仅显示增加或者减少了多少行。

3.pretty选项

使用–pretty 选项选项,可以指定不同的显示属性,如oneline 将每个提交放在一行显示。 short,full 和 fuller 可以指定展示的信息的多少。

git revert实现版本回退

版本回退可以用git revert命令。git revert撤销提交时,会保留所撤销的提交的记录和历史,并将撤销操作做为一次新的提交。即提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。其具体的使用方法如下:

  • git revert HEAD 撤销前一次 commit
  • git revert HEAD^ 撤销前前一次 commit
  • git revert commit (比如:fa042ce57ebbe5b)撤销指定的版本,撤销也会作为一次提交进行保存

git reset实现版本回退

git reset也能实现版本回退,但是git revert 和 git reset也存在一定的区别 :

  • git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit;

  • 在回滚这一操作上看,效果差不多。但是,在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit,“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现。但是git reset是把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入;

  • git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。 git reset用法如下:

  • git reset HEAD 回到前一次 commit。也可以用于将错误的文件添加进暂存区后,想回退取消,如:   git reset HEAD 文件名

  • git reset HEAD^ 回到前前一次 commit。

  • git reset commit 比如:commit = fa042ce57ebbe5b,回到指定的版本,撤销也会作为一次提交进行保存。

另外git reset也可以指定reset的模式:hard、soft、mixed、merged、keep。 这几种模式的差别如下:

  • –soft 缓存区和工作目录都不会被改变;
  • –mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响;
  • –hard – 缓存区和工作目录,都同步到你指定的提交。 几种模式的具体使用方法如下:
1
2
3
4
5
6
#直接丢弃工作区和暂存区的修改
git reset --hard HEAD
#暂存区内容保留,工作区修改丢弃
git reset --mixed HEAD
#暂存区和工作区内容都保留
git reset --soft HEAD

回到指定提交

git revert实现版本回退

版本回退可以用git revert命令。使用git revert撤销提交时,会保留所撤销的提交的记录和历史,并将撤销操作做为一次新的提交。即提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。其具体的使用方法如下:

  • git revert HEAD 撤销前一次 commit
  • git revert HEAD^ 撤销前前一次 commit
  • git revert commit (比如:fa042ce57ebbe5b)撤销指定的版本,撤销也会作为一次提交进行保存

git reset实现版本回退

git reset也能实现版本回退,但是git revert 和 git reset有一定的区别 :

  • git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit;
  • 在回滚这一操作上看,效果差不多。但是,在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit,“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现。但是git reset是把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入;
  • git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

git reset用法如下:

  • git reset HEAD 回到前一次 commit。也可以用于将错误的文件添加进暂存区后,想回退取消,如:   git reset HEAD 文件名

  • git reset HEAD^ 回到前前一次 commit。

  • git reset commit 比如:commit = fa042ce57ebbe5b,回到指定的版本,撤销也会作为一次提交进行保存。

另外git reset也可以指定reset的模式:hard、soft、mixed、merged、keep。 这几种模式的差别如下:

  • –soft 缓存区和工作目录都不会被改变;
  • –mixed 默认选项。缓存区和你指定的提交同步,但工作目录不受影响;
  • –hard 缓存区和工作目录都同步到你指定的提交。 几种模式的具体使用方法如下:
1
2
3
4
5
6
#直接丢弃工作区和暂存区的修改
git reset --hard HEAD
#暂存区内容保留,工作区修改丢弃
git reset --mixed HEAD
#暂存区和工作区内容都保留
git reset --soft HEAD

撤销修改

git reset实现版本回退

当将有错误的文件add进暂存区后,可以使用git reset丢弃修改。即:   git reset HEAD 文件名 但此时修改仍旧保留在工作区。

如果尚未add进暂存区,则可以使用:

  git reset –hard HEAD

这样就能彻底丢弃修改,即将修改从暂存区及工作区彻底删除。

git checkout丢弃修改

当将错误的文件add进暂存区后,使用git checkout无法将修改从暂存区中撤销,必须要先使用git reset将修改从暂存区中撤销。

如果只是工作区有了修改,则可以直接使用git checkout进行撤销,具体操作如下:

  git chekcout – hello

通过这种方式,就可将hello文件自上个commit之后,尚未add进暂存区的修改丢弃。

删除文件

删除文件需要用到的命令是git rm,且git rm有参数–cached。 当我们需要删除暂存区或分支上的文件,同时工作区也不再需要这个文件了,可以使用:

  git rm 文件路径

当我们需要删除暂存区或分支上的文件,但本地又需要使用, 只是不希望这个文件被提交到版本库,可以使用:

  git rm –cached 文件路径

文件已添加至暂存区

如果文件被添加到了暂存区,这种情况下直接使用git rm file_path会报错:

1
2
3
4
$ git rm hello.txt
error: the following file has changes staged in the index:
    hello.txt
(use --cached to keep the file, or -f to force removal)

根据提示我们可以得知,这个时候,如果不想保留hello.txt,则可以使用:

  git rm hello.txt -f

如果想保留hello.txt到工作区则可以使用:

  git rm –cached hello.txt

使用 Hugo 构建
主题 StackJimmy 设计