草庐IT

git查看历史记录及修改内容

AlbertS 2023-04-21 原文

文章目录

前言

Git 中没有真正的方法来做任何事情,这就是它的妙处!比如查看修改内容这件事,有些人会想到 git log,有些人会想到 git show,最近我又学到一个 git whatchanged,实现目的方法多种多样,各种途径任君挑选。

刚开始步入软件开发行业时喜欢捣鼓各种软件,进行各种个性化配置,任意修改快捷键,这样在开发过程中确实会舒服一些,但是换了一个环境时(电脑重装或在别人的机器),就好像一个什么也不会的傻子一样,所以慢慢的我开始强迫自己熟悉软件自己的快捷键和各种命令,这样在重装系统时会免去很多麻烦,并且因为一些命令用习惯了,在编写部署脚本时也不会总是写出不能识别的简写命令了。

修改文件

为了测试各种的查找修改记录的命令,我先进行一次包含增加、修改、删除的提交,然后对比来看各个命令的作用,实际修改如下:

  1. 在文件address.txt中增加两行数据
  2. 清空文件age.txt中4行数据
  3. 修改文件name.txt中一行数据
  4. 增加带有3行数据的phone.txt文件
  5. 删除带有2行数据的story.txt文件

在执行了 git add . 命令后,可以用 git diff --staged 查看即将提交的文件修改,展示如下:

$ git diff --staged
diff --git a/address.txt b/address.txt
index e69de29..8f9d6e6 100644
--- a/address.txt
+++ b/address.txt
@@ -0,0 +1,2 @@
+beijing
+shanghai
\ No newline at end of file
diff --git a/age.txt b/age.txt
index 58f78c9..e69de29 100644
--- a/age.txt
+++ b/age.txt
@@ -1,4 +0,0 @@
-12
-16
-17
-15
\ No newline at end of file
diff --git a/name.txt b/name.txt
index ac37a53..0ed306a 100644
--- a/name.txt
+++ b/name.txt
@@ -1,4 +1,4 @@
 tom
-alice
+jerry
 bily
 andy
\ No newline at end of file
diff --git a/phone.txt b/phone.txt
new file mode 100644
index 0000000..241bcdb
--- /dev/null
+++ b/phone.txt
@@ -0,0 +1,3 @@
+110
+120
+119
\ No newline at end of file
diff --git a/story.txt b/story.txt
deleted file mode 100644
index 0d89902..0000000
--- a/story.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-King
-Wolf
\ No newline at end of file

关于 git diff 对于很多使用 git 管理代码的小伙伴再熟悉不过了,但是其中有些细节还是需要学习的:

  1. diff --git a/name.txt b/name.txt 这一行是说以下展示 name.txt 文件修改前后的信息,a/name.txtb/name.txt 分别表示修改前后的文件名

  2. index ac37a53..0ed306a 100644 这一行表示文件修改前后的 object100644 表示这是一个常规文件,文件权限为 644,使用 git cat-file -p可以查看文件内容:

    $ git cat-file -p ac37a53
    tom
    alice
    bily
    andy
    
    $ git cat-file -p 0ed306a
    tom
    jerry
    bily
    andy
    
  3. --- a/name.txt表示修改前的文件,+++ b/name.txt表示修改后的文件

  4. @@ -1,4 +1,4 @@ 这一句应该是最有意思的,也是不用一看懂的一行,其中开头和结尾的 @@ 为固定格式,-1,4 表示修改前的 1~4行,+1~4表示修改后的1~4行,这句话的意思就是,以下内容展示了修改前 1~4行到修改后 1~4行的文件变化,因为我们只修改了一行,所以修改前后行数不变,如果新增行数和删除行数不同,那么这个位置展示的行数也是不同的,例如 phone.txt 文件的变化 @@ -0,0 +1,3 @@

  5. 最后就是文件具体的变化了,新增内容前面是加号 +,删除内容前面是减号 -

     tom
    -alice
    +jerry
     bily
     andy
    

查询文件修改

当我们把修改的内容提交以后,这条修改属于存入了仓库的历史之中,git diff 就无法再查看文件的变化了,而需要使用 git loggit show 来查看文件修改的内容,接下来我们来看看这些命令都能用来干嘛。

git show

git show 默认展示最近一次提交的修改,与执行 git commit 命令之前的 git diff --staged 查看得到的绝大部分内容相同,只是在开头位置包含最新提交的信息:

$ git show
commit 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee (HEAD -> master)
Author: albert <albert101@163.com>
Date:   Sun Aug 21 15:22:08 2022 +0800

    update example data

diff --git a/address.txt b/address.txt
index e69de29..8f9d6e6 100644
--- a/address.txt
+++ b/address.txt
@@ -0,0 +1,2 @@
+beijing
+shanghai
\ No newline at end of file
diff --git a/age.txt b/age.txt
index 58f78c9..e69de29 100644
--- a/age.txt
+++ b/age.txt
@@ -1,4 +0,0 @@
-12
-16
-17
-15
\ No newline at end of file
diff --git a/name.txt b/name.txt
index ac37a53..0ed306a 100644
--- a/name.txt
+++ b/name.txt
@@ -1,4 +1,4 @@
 tom
-alice
+jerry
 bily
 andy
\ No newline at end of file
diff --git a/phone.txt b/phone.txt
new file mode 100644
index 0000000..241bcdb
--- /dev/null
+++ b/phone.txt
@@ -0,0 +1,3 @@
+110
+120
+119
\ No newline at end of file
diff --git a/story.txt b/story.txt
deleted file mode 100644
index 0d89902..0000000
--- a/story.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-King
-Wolf
\ No newline at end of file

git show 还可以加数字,比如 git show -3 就是展示最近3次提交修改信息。

git show --stat 可以查看最新提交的修改文件,如果想查看指定提交的修改文件信息,可以在后面跟上commit-id,例如 git show --stat 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee

$ git show --stat
commit 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee (HEAD -> master)
Author: albert <albert101@163.com>
Date:   Sun Aug 21 15:22:08 2022 +0800

    update example data

 address.txt | 2 ++
 age.txt     | 4 ----
 name.txt    | 2 +-
 phone.txt   | 3 +++
 story.txt   | 2 --
 5 files changed, 6 insertions(+), 7 deletions(-)

这个展示信息可以清楚的看出哪些文件新增了内容,哪些文件删除了内容,并且展示了文件增伤行数的比例,但是有一点它不够清晰,那就是无法看出哪些是新增的文件,哪些是删除的文件,比如 age.txtstory.txt 都显示删除了数据,但实际上 story.txt 整个文件都从仓库中删除了,要想看出文件增删状态可以使用接下来展示的这个命令 git whatchanged

git whatchanged

git whatchanged 可以展示出文件的增删状态和权限修改,默认分页展示所有提交记录,可以后面加数字来展示最近几次的文件增删状态:

$ git whatchanged -1
commit 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee (HEAD -> master)
Author: albert <albert101@163.com>
Date:   Sun Aug 21 15:22:08 2022 +0800

    update example data

:100644 100644 e69de29 8f9d6e6 M        address.txt
:100644 100644 58f78c9 e69de29 M        age.txt
:100644 100644 ac37a53 0ed306a M        name.txt
:000000 100644 0000000 241bcdb A        phone.txt
:100644 000000 0d89902 0000000 D        story.txt

从这个文件中就可以看出 address.txt、age.txt、name.txt 三个文件被修改了,phone.txt 是新增加的,story.txt 文件被删除了,如果在命令后面加上选项 --stat 作用就和 git show 一样了,兜兜转转回到原点~

$ git whatchanged -1 --stat
commit 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee (HEAD -> master)
Author: albert <albert101@163.com>
Date:   Sun Aug 21 15:22:08 2022 +0800

    update example data

 address.txt | 2 ++
 age.txt     | 4 ----
 name.txt    | 2 +-
 phone.txt   | 3 +++
 story.txt   | 2 --
 5 files changed, 6 insertions(+), 7 deletions(-)

git log

根据我个人的理解,git show 注重查看一次提交中修改的内容,而 git log 主要用于查找历史提交的脉络,但这不是绝对的,因为git做一件事,没有绝对的一种方式,你也可以用 git log 来实现 git show

  • 展示最近一次提交

    $ git log -1
    commit 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee (HEAD -> master)
    Author: albert <albert101@163.com>
    Date:   Sun Aug 21 15:22:08 2022 +0800
    
        update example data
    
    
  • 展示其他分支最近一次提交

    $ git log -1 dev
    commit 62cc52cbc7f9581fa825b443aba3481083459656 (dev)
    Author: albert <albert101@163.com>
    Date:   Sun Aug 21 12:02:11 2022 +0800
    
        init git repository
    
    
  • 展示修改的文件列表及文件修改的统计

    $ git log -1 --stat
    commit 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee (HEAD -> master)
    Author: albert <albert101@163.com>
    Date:   Sun Aug 21 15:22:08 2022 +0800
    
        update example data
    
     address.txt | 2 ++
     age.txt     | 4 ----
     name.txt    | 2 +-
     phone.txt   | 3 +++
     story.txt   | 2 --
     5 files changed, 6 insertions(+), 7 deletions(-)
    
  • 展示每次修改的文件列表

    $ git log -1 --name-only
    commit 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee (HEAD -> master)
    Author: albert <albert101@163.com>
    Date:   Sun Aug 21 15:22:08 2022 +0800
    
        update example data
    
    address.txt
    age.txt
    name.txt
    phone.txt
    story.txt
    
  • 展示修改的文件列表和显示状态

    $ git log -1 --name-status
    commit 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee (HEAD -> master)
    Author: albert <albert101@163.com>
    Date:   Sun Aug 21 15:22:08 2022 +0800
    
        update example data
    
    M       address.txt
    M       age.txt
    M       name.txt
    A       phone.txt
    D       story.txt
    
  • 展示指定作者提交的记录

    $ git log -1 --author="albert"
    commit 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee (HEAD -> master)
    Author: albert <albert101@163.com>
    Date:   Sun Aug 21 15:22:08 2022 +0800
    
        update example data
    
    
  • 单行展示提交的记录

    $ git log --oneline
    2447e2b (HEAD -> master) update example data
    62cc52c (dev) init git repository
    
  • 展示指定日期之前的提交记录

    $ git log --before='2022-08-22'
    commit 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee (HEAD -> master)
    Author: albert <albert101@163.com>
    Date:   Sun Aug 21 15:22:08 2022 +0800
    
        update example data
    
    commit 62cc52cbc7f9581fa825b443aba3481083459656 (dev)
    Author: albert <albert101@163.com>
    Date:   Sun Aug 21 12:02:11 2022 +0800
    
        init git repository
    
  • 展示一天之内的提交记录

    $ git log --since=1.day.ago
    commit 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee (HEAD -> master)
    Author: albert <albert101@163.com>
    Date:   Sun Aug 21 15:22:08 2022 +0800
    
        update example data
    
    commit 62cc52cbc7f9581fa825b443aba3481083459656 (dev)
    Author: albert <albert101@163.com>
    Date:   Sun Aug 21 12:02:11 2022 +0800
    
        init git repository
    
  • 展示指定包含指定内容的提交记录

    $ git log --grep=update
    commit 2447e2b9c15472f2ead7bf451aa5fc9c3f34f5ee (HEAD -> master)
    Author: albert <albert101@163.com>
    Date:   Sun Aug 21 15:22:08 2022 +0800
    
        update example data
    
  • 展示指定不包含指定内容的提交记录

    $ git log --grep=update --invert-grep
    commit 62cc52cbc7f9581fa825b443aba3481083459656 (dev)
    Author: albert <albert101@163.com>
    Date:   Sun Aug 21 12:02:11 2022 +0800
    
        init git repository
    
  • 终极大招,图形化展示,其实用的并不多

    $ git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative --all
    * 2447e2b - (HEAD -> master) update example data (77 minutes ago) <albert>
    * 62cc52c - (dev) init git repository (2 hours ago) <albert>
    *   719ec7a - (refs/stash) WIP on master: 83f00c5 init git repository (2 hours ago) <albert>
    |\
    | * 9c87e06 - index on master: 83f00c5 init git repository (2 hours ago) <albert>
    |/
    * 83f00c5 - init git repository (5 hours ago) <albert>
    

总结

  • 查看最近一次修改的内容使用 git show
  • 查看最近一次修改的文件使用 git show --statgit log -1 --name-only
  • 查看最近一次修改的文件状态使用 git whatchanged -1git log -1 --name-status
  • 图形化显示git提交记录使用 git log --graph

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

轻生的人到底是勇敢还是懦弱呢?虽说我未经历过他的人生不该轻易评判,但就我主观来思考这类事,大抵是因为对生活失去了信心。人固有一死,或重于泰山,或轻于鸿毛。而遇到困难就选择轻生的人是自私且不负责任的,若你无牵无挂走了也就走了,倘若还有家人岂不是还要拿出额外一笔钱给你办个葬礼?连死都不怕了,还有什么是过不去的呢?

有关git查看历史记录及修改内容的更多相关文章

  1. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  2. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  3. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  4. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  5. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  6. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  7. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  8. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  9. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  10. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

随机推荐