Git学习之版本比较
前面我们学习了Git操作文件的状态,但使用git status
命令输出信息过于简洁,我们想要知道文件具体变化了哪些内容,有没有什么办法呢,有办法,这就是git diff
命令。使用这个命令可以参看当前做的哪些更新还没有暂存? 有哪些更新已经暂存起来准备好了下次提交?
1. 首先我们先做些准备工作,我们创建一个名为 hello
的工作空间,然后在这个目录下添加有一个名为README.md
的文件,然后输入信息:
学习Git之版本控制
我们将这个文件添加到在暂存区,并提交
breeziness@DESKTOP-5TFSF7M MINGW64 ~/Desktop/hello (master)
$ git add README.md
breeziness@DESKTOP-5TFSF7M MINGW64 ~/Desktop/hello (master)
$ git commit -m"first commit"
[master (root-commit) 52eeaf5] javabean
1 file changed, 49 insertions(+)
create mode 100644 README.md
2. 然后我们修改README.md
文件的内容:
学习Git之版本控制
我们修改了这个文件
直接运行git diff
是比较暂存区和工作区的文件:
我们分析下输出结果:
- 第一行
diff --git a/README.md b/README.md
a/README.md
是暂存区的README.md
文件,b/README.md
是工作区的README.md
文件
- 第二行
index 1a96e61..a637524 100644
表示对应文件的 ID 分别是7966837
和472a180
,左边暂存区域,后边当前目录。最后的100644
是Linux下的权限,(如下图)
The following flags are defined for the st_mode field:
S_IFMT 0170000 bit mask for the file type bit fields
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
S_ISUID 0004000 set UID bit
S_ISGID 0002000 set-group-ID bit (see below)
S_ISVTX 0001000 sticky bit (see below)
S_IRWXU 00700 mask for file owner permissions
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permission
S_IRWXG 00070 mask for group permissions
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 mask for permissions for others (not in group)
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
- 第三行
--- a/README.md
— 表示该文件是旧文件(存放在暂存区域) - 第四行
+++ b/README.md
+++ 表示该文件是新文件(存放在工作区域) - 第五行
@@ -1 +1,2 @@
以 @@ 开头和结束,中间的“-”表示旧文件,“+”表示新文件,后边的数字表示“开始行号,显示行数” - 第六行、第七行
这是合并了两个文件(a 和 b)的内容,灰色的表示两个文件共有的内容,绿色表示是新文件的内容,这里我们就可以解答上面第五行的内容,-1
是暂存区的旧文件,+1
是工作区的新文件,+1,2
表示新文件从第一行看是显示,共两行,而旧文件后面没有数字表示它的内容已经完全包含在合并的文件中,没有自己特有的内容。如果这个命令输出的内容很多可以使用linux的跳转命令,同时还可以使用其他的linux的命令,如搜索,退出,移动,帮助等。
-
比较仓库中的两个快照
如果我们已经提交了多次内容到仓库,那么仓库中就存在多个版本快照,我们可以使用git diff <快照1> <快照2>
比较任意两个快照之间的差异,目前仓库存在两个快照:
注意那个commit ID 这是经过SHA-1 检验生成的唯一ID,我们可以输出它的前几位,Git就会帮我们补全后面的部分,这样我们就可以通过这个ID区分快照,或者说每一次操作,现在我们比较下这两个快照。
分析方法跟前面的方法一样
首先我们先将我们修改的最新版本添加到暂存区,使用git add README.md
,现在三棵树状态如图:
暂存区跟工作区是同步的,是最新版。而仓库是上一版本
我们使用git diff --cached
命令可以查看暂存区和仓库的快照的区别
这里还可以查看任意快照跟暂存区的区别,只要再命令后面加上指定的快照ID,如
git diff --cached de92970