• git diff 操作

    • git diff 简述
    • git diff 的 args 和 flag
      • git diff HEAD
      • git diff --staged
      • git diff HEAD
      • git diff <branch1> <branch2>
      • 查看不同 commits 之间的变化
    • GUI 方面
      • VSCode
      • GitKraken

git diff 操作

git diff 是一条知道但是……从来没有用过的指令,基本上这也算是好好学习一下这条指令了。以前一般都是在 merge/rebase 的时候被动的看一下两个分支的变化,或者是在 VSCode 里面看一下 staged 的变化,不过这还是稍微有一点局限,比如说:

VSCode 中显示了两个部分的代码:

  • 修改了还没有 stage(current working area)
  • staged 还没有 commit(staging area)

除此之外,如果想要看两个不同分支的区别,以前基本上都是切换到另一条分支然后开始看区别。不过也提到了,如果两个分支都修改了同一个文件(这也是经常会发生的事情),那基本上……就是创建第三条分支,然后 merge 两个分支。

VSCode 上展示如下:

git diff 简述

我 cv 了 CSDN 的首页,commit 了变化,进行了简单的修改,随后用 git diff 去进行对比。下面这段运行结果包含了 git status 的结果,主要显示一下文件被修改过了; git log 的结果,包含前面运行过的一些日志; git diff 的结果,也就是下面会详细分析的部分。

➜  diffing git:(main) ✗ git status
On branch main
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:   index.htmlno changes added to commit (use "git add" and/or "git commit -a")
➜  diffing git:(main) ✗ git logcommit 44bb308ed84804bf5af2a4fda1a73462967250e1 (HEAD -> main)
Author: GoldenaArcher <_________>
Date:   Thu Nov 10 17:20:42 2022 -0500formatted htmlcommit f25aaa2728935c1827fdfc9921a3e6f6166e29cc
Author: GoldenaArcher <_________>
Date:   Thu Nov 10 17:09:39 2022 -0500add index page➜  diffing git:(main) ✗ git diffdiff --git a/index.html b/index.html
index 62dac88..74ad32e 100644
--- a/index.html
+++ b/index.html
@@ -303,6 +303,7 @@href="https://g.csdnimg.cn/side-toolbar/3.4/side-toolbar.css"/><style type="text/css">
+      html {}#waf_nc_block {position: fixed;_position: absolute;
@@ -566,6 +567,7 @@><i class="csdn-profile-likeCount">--</i>获赞</a></div>
+                    <div class="some-changes"></div><div class="csdn-profile-bottom"><ul class="csdn-border-bottom"><li class="">
@@ -990,7 +992,7 @@<li class="navigation-right" data-v-f8e9e086=""><ahref="https://blog.csdn.net/nav/design"
-                                data-report-click='{"spm":"1001.2100.3001.7366","extend1":"design"}'
+                                data-report-click='{"spm":"1001.2100.3002.7366","extend1":"design"}'data-v-f8e9e086="">用户体验设计</a>
(END)

diff --git a/index.html b/index.html 是 git 内部运行的第一部分,这一部分主要主要表示之后将会比对 a 分支(默认为当前分支)与 b 分支(同样默认为当前分支)的 index.html 这个文件。这一块是可以配置的,a/b 可以指向不同的分支,同样也可以指向两个不同的文件进行对比。

index 62dac88..74ad32e 100644 属于一个 metadata 的 tag,每个文件都有自己的 hash 值。

--- a/index.html
+++ b/index.html

这一段则是表示 a/index.html 上的变化用 --- 标识,变动在 b/index.html 上的则用 +++ 标识。这只是两个标识符而已,--- 不代表删减的部分,+++ 也不代表增加的部分。

@@ -303,6 +303,7 @@href="https://g.csdnimg.cn/side-toolbar/3.4/side-toolbar.css"/><style type="text/css">
+      html {}#waf_nc_block {position: fixed;_position: absolute;

这一段则是表示修改的代码段,@@ -303,6 +303,7 @@ 显示变动的部分为 a/index.html 的第六行,以及 b/index.html 的第七行。

变动的部分最左边会抱憾 -+ 表示在对应分支上的变动,如这里我只是单纯的加了一个空的 CSS 选择器,+ html {} 这一段就显示在这是在 b/index.html 的第七行产生的变动,也对应原本文档的第六行。git 会抱憾一些未变动的代码这样易于进行定位。

另一个案例如下:

@@ -990,7 +992,7 @@<li class="navigation-right" data-v-f8e9e086=""><ahref="https://blog.csdn.net/nav/design"
-                                data-report-click='{"spm":"1001.2100.3001.7366","extend1":"design"}'
+                                data-report-click='{"spm":"1001.2100.3002.7366","extend1":"design"}'data-v-f8e9e086="">用户体验设计</a>

我在原本的文件上随意增加了两行代码,因此 b 分支上的 992 行对应的就是原文件的 990 行。这里我修改了原本的 CSS,所以 - 的这一行显示的就是未变动前的 CSS,+ 显示的是变动后的 CSS。

git diff 的 args 和 flag

git diff HEAD

单纯用 git diff 展现的是 unstaged 变化,如果已经 stage 了,那么就看不出来了。但是使用 git diff HEAD 就可以同时查看 staged 以及 unstged 的变化,如:

# 之前已经用 git add 添加了文件,所以 git diff 显示为空
➜  diffing git:(main) ✗ git diff(END)
# 但是 git diff HEAD 可以看到 staged 了的变化
➜  diffing git:(main) ✗ git diff HEADdiff --git a/example.txt b/example.txt
index b79b160..e6ccbd2 100644
--- a/example.txt
+++ b/example.txt
@@ -1,2 +1,3 @@Here is an example
+second line has been inserted.some lines have been inserted
\ No newline at end of file
(END)

git diff --staged

只查看 staged 的文件可以使用 --staged 这个 flag,其中 --staged--cached 可以互换,效果是一样的:

➜  diffing git:(main) ✗ git diff --stageddiff --git a/example.txt b/example.txt
index b79b160..e6ccbd2 100644
--- a/example.txt
+++ b/example.txt
@@ -1,2 +1,3 @@Here is an example
+second line has been inserted.some lines have been inserted
\ No newline at end of file
(END)
➜  diffing git:(main) ✗ git diff --cacheddiff --git a/example.txt b/example.txt
index b79b160..e6ccbd2 100644
--- a/example.txt
+++ b/example.txt
@@ -1,2 +1,3 @@Here is an example
+second line has been inserted.some lines have been inserted
\ No newline at end of file
(END)

git diff HEAD

查看某(些)个文件的变化可以用这条指令,如:

➜  diffing git:(main) ✗ git diff HEAD example.txtdiff --git a/example.txt b/example.txt
index b79b160..e6ccbd2 100644
--- a/example.txt
+++ b/example.txt
@@ -1,2 +1,3 @@Here is an example
+second line has been inserted.some lines have been inserted
\ No newline at end of file
(END)

git diff <branch1> <branch2>

查看分支之间的变化可以使用这条指令:git diff branch1 branch2,这个就是 VSCode 的 GUI 有些力有未逮的地方了。除此之外分支之间用 ..,即 git diff branch1..branch2 也可以产生同样的效果:

➜  diffing git:(main) ✗ git diff main testdiff --git a/example.txt b/example.txt
deleted file mode 100644
index b79b160..0000000
--- a/example.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Here is an example
-some lines have been inserted
\ No newline at end of file
diff --git a/index.html b/index.html
index 74ad32e..62dac88 100644
--- a/index.html
+++ b/index.html
@@ -303,7 +303,6 @@href="https://g.csdnimg.cn/side-toolbar/3.4/side-toolbar.css"/><style type="text/css">
-      html {}#waf_nc_block {position: fixed;_position: absolute;
@@ -567,7 +566,6 @@><i class="csdn-profile-likeCount">--</i>获赞</a></div>
-                    <div class="some-changes"></div><div class="csdn-profile-bottom"><ul class="csdn-border-bottom"><li class="">
@@ -992,7 +990,7 @@<li class="navigation-right" data-v-f8e9e086=""><a
:

查看不同 commits 之间的变化

这个语法跟查看分支一样:

➜  diffing git:(main) ✗ git log --oneline
3ec0929 (HEAD -> main) add files
7705a16 initial commit
44bb308 (test) formatted html
f25aaa2 add index page
➜  diffing git:(main) ✗ git diff f25aaa2 3ec0929diff --git a/example.txt b/example.txt
new file mode 100644
index 0000000..b79b160
--- /dev/null
+++ b/example.txt
@@ -0,0 +1,2 @@
+Here is an example
+some lines have been inserted
\ No newline at end of file
diff --git a/index.html b/index.html
index 2c935c4..74ad32e 100644
--- a/index.html
+++ b/index.html
@@ -1,424 +1,15771 @@
-<html lang="zh" data-server-rendered="true"><head><script type="text/javascript" async="" src="https://g.csdnimg.cn/asdf/1.1.3/trackad.js"></script><script type="text/javascript" async="" src="https://g.csdnimg.cn/??asdf/1.1.3/trackad.js,iconfont/nav/iconfont-1.0.1.js,notification/1.3.8/notify.js,notification/1.3.8/main.js"></script><script src="https://hm.baidu.com/hm.js?6bcd52f51e9b3dce32bec4a3997715ac"></script><script>(function(){function hookGeo() {-    //<![CDATA[
-    const WAIT_TIME = 100;
-    const hookedObj = {-      getCurrentPosition: navigator.geolocation.getCurrentPosition.bind(navigator.geolocation),
-      watchPosition: navigator.geolocation.watchPosition.bind(navigator.geolocation),
-      fakeGeo: true,
-      genLat: 38.883333,
-      genLon: -77.000
-    };
-
:

需要的一些常用功能

对比两个分支上的文件

来自 How to compare files from two different branches

git diff mybranch master -- myfile.cs

可以直接对比两个分支,后缀 -- filename,而不用 cv 两次文件名。

GUI 方面

VSCode

VSCode 可以展现 staged 与变动的文件,这点最上面的截图已经展示过了。除此之外,在编辑文件的同时也能显示出当前的这行已经有所变动:

点进 source control 这个 tab 也会左右分屏显示变化:

不过目前我只能找到 staged 和 changed 这两个变化,更多的,比如说对比选定 branch 与 commits 之间的,这块就稍微差了点。

GitKraken

这个 GUI 可以对比 staged,changed 之间的变化:

也可以 branch 以及 commits 之间的变化:

唯一的问题就是……免费开源的项目它还能用,私人的 repo 就不支持,需要收费。虽然 VSCode 也有单独的插件可以使用,不过也需要收费……

这点就看个人需求吧,毕竟它没有买断,一个月 10 刀的收费……可以,没必要:

git diff 操作相关推荐

  1. Git 常用操作(5)- git clone/git checkout -b/git diff/git push/git pull

    1. git clone--获取远程仓库 当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容.它只会获取数据然后 让你自己合并. 然而,有一个命令叫作 git p ...

  2. [git] 基础操作-01-diff / diff head 版本比较 - 非常的详细讨论版本比较中的各种符号的意思,以及如何在git中进行版本比较

    前言: 本文讨论,各个处理逻辑中版本的表述.比较中,git的操作的细节和表述符合的具体意义:(非常细节,会的朋友可以跳过) 对于 遇到的各个命令,会给出详细的解释在附录里面: 理解git文档的四个状态 ...

  3. Git 常用操作(1)- 配置、查看、添加、暂存和提交

    1. Git 基本概念 Git 有三种状态:已提交(committed).已修改(modified)和已暂存(staged). 已提交:表示数据已经安全的保存在本地数据库中. 已修改:表示修改了文件, ...

  4. 如何团队协作,代码托管?Git使用教程:最详细、最浅显、一文读懂Git常用操作!...

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 作者:涂根华 来源:www.cnblogs.com/tugenhua0707 Git使 ...

  5. 45 个 Git 经典操作场景,专治不会合代码

    git对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如 Sourcetree这样牛X的客户端工具,使得合并代码变的很方便.但找工作面试和一些需彰显个人实力的场景, ...

  6. git 常用操作总结

    git diff branch1 branch2                          # 显示出所有有差异的文件的详细差异 git diff branch1 branch2 --stat ...

  7. git show查看本地文件的修改部分,git diff 如何比较文件,git grep 搜索

    一.git pull 报错 报错信息: fatal: 'origin' does not appear to be a git repository fatal: Could not read fro ...

  8. git diff的用法

    在git提交环节,存在三大部分:working tree(工作区), index file(暂存区:stage), commit(分支:master) working tree:就是你所工作在的目录, ...

  9. git diff old mode 100644 new mode 100755

    今天执行git diff filename ,出现 old mode 100644 new mode 100755 的提示,如下图: 但是发现文件内容并没有发生改变 想起来中间执行过chmod  的操 ...

最新文章

  1. 从头到尾彻底解析Hash表算法
  2. ubuntu server中的一些小知识(个人收集贴)
  3. java基础_数组常用算法
  4. 手把手带你入门 Spring Security!
  5. 在 Android 上使用协程(二):Getting started
  6. jzoj1252,P5194-天平【dfs,set】
  7. 3、Finished with error: FormatException: Bad UTF-8 encoding 0xc3 (at offset 169)
  8. 中国捆矛行业市场供需与战略研究报告
  9. 斯坦福大学CS143编译原理课程笔记:3.编译器的性价比
  10. Ubuntu 16.04安装Markdown编辑器MarkMyWords
  11. Matlab2018a安装包Linux版本
  12. python之论文降重工具
  13. 计算机二级可以用笔记本电脑学吗,计算机二级可以自学好过吗
  14. mysql identify_MySQL用户授权
  15. python阿拉伯数字转换为英文_python实现将英文单词表示的数字转换成阿拉伯数字的方法...
  16. flink常用参数说明
  17. 神话与历史中的吸血鬼
  18. 16款最佳HTML5超酷动画演示及源码
  19. linux内存镜像技术,GitHub - oscomp/proj61-linux-address-range-memory-mirroring: Linux 内核内存镜像功能增强。...
  20. C++ getline():从文件中读取一行字符串

热门文章

  1. Python 实现巴特沃斯滤波器
  2. 用PS将物体的主要部分扣成白色,背景扣成黑色
  3. 华为终端云服务牵手Likee,助力其用户与变现双增长
  4. editplus5激活码,亲测有效!
  5. npm 提升最新版本
  6. Android 项目国际化 多国语言适配
  7. python支付宝蚂蚁森林_用Python实现定时自动化收取蚂蚁森林能量,再也不用担心忘记收取了...
  8. python按内容分割txt文件_Python实现逐行分割大txt文件示例详解
  9. 如何给女朋友做个树莓派复古相机?
  10. Unity3d+Android:分屏小窗还原分辨率触摸异常