Skip to content

Git - 查看修改

理解项目的历史以及随着时间推移所做的修改至关重要。Git 提供了多种命令来检查提交、比较版本和查看修改。

git log 命令按时间顺序显示当前分支的提交列表。每个条目通常显示提交的 SHA-1 哈希值、作者、日期和提交消息。

[jerry@dev-machine project]$ git log

这将产生类似于以下的输出:

commit d1e19d316224cddc437e3ed34ec3c931ad803958 (HEAD -> main, origin/main)
Author: Jerry Mouse <jerry@example.com>
Date: Wed Sep 11 08:15:30 2024 +0000
Changed return type of my_strlen to size_t
commit cbe1249b140dad24b2c35b15cc7e26a6f02d2277
Author: Jerry Mouse <jerry@example.com>
Date: Wed Sep 11 08:05:26 2024 +0000
Implemented my_strlen function
commit 19ae20683fc460db7d127cf201a1429523b0e319
Author: Tom Cat <tom@example.com>
Date: Wed Sep 11 07:32:56 2024 +0000
Initial commit

git log 有许多用于自定义其输出的有用选项:

  • --oneline: 在单行上显示每个提交(SHA-1 前缀和消息)。
[jerry@dev-machine project]$ git log --oneline
d1e19d3 (HEAD -> main, origin/main) Changed return type of my_strlen to size_t
cbe1249 Implemented my_strlen function
19ae206 Initial commit
  • -n <count> 或 -<count>: 限制显示的提交数量(例如,git log -2)。
  • --graph: 显示分支和合并历史的 ASCII 艺术图。
  • --decorate: 在提交旁边显示分支和标签名称。
  • --author="<pattern>": 显示特定作者的提交。
  • --grep="<pattern>": 显示提交消息匹配特定模式的提交。
  • --since="<date>" 或 --until="<date>": 按日期过滤提交。
  • -- <file_path>: 显示影响特定文件或路径的提交。

要查看特定提交的详细信息,包括其元数据以及它引入的修改(diff),请使用 git show <commit-SHA>。

[jerry@dev-machine project]$ git show cbe1249b

这将输出:

commit cbe1249b140dad24b2c35b15cc7e26a6f02d2277
Author: Jerry Mouse <jerry@example.com>
Date: Wed Sep 11 08:05:26 2024 +0000
Implemented my_strlen function
diff --git a/string_utils.c b/string_utils.c
new file mode 100644
index 0000000..187afb9
--- /dev/null
+++ b/string_utils.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+int my_strlen(const char *s)
+{
+ const char *p = s;
+ while (*p)
+ ++p;
+ return (p - s);
+}
+// ... more of the file if it's new ...
+

如果你省略 <commit-SHA>,git show 会显示最新提交(HEAD)的详细信息。

git diff 用于显示提交之间的修改、提交与工作区之间的修改,或者暂存区与工作区之间的修改等。以 + 开头的行表示新增,以 - 开头的行表示删除。

  1. 工作区中尚未暂存的修改:
[jerry@dev-machine project]$ git diff

这会将你的工作区文件与暂存区进行比较。

  1. 已暂存但尚未提交的修改:
[jerry@dev-machine project]$ git diff --staged
# 或者 git diff --cached

这会将暂存区与最后一次提交(HEAD)进行比较。

  1. 自最后一次提交以来所有的修改(已暂存和未暂存):
[jerry@dev-machine project]$ git diff HEAD
  1. 两个提交之间的修改:
[jerry@dev-machine project]$ git diff <commit-SHA1> <commit-SHA2>

例如,要查看提交 cbe1249b 和 d1e19d31 之间的修改:

[jerry@dev-machine project]$ git diff cbe1249b d1e19d31

这可能会输出:

diff --git a/string_utils.c b/string_utils.c
index 187afb9..7da2992 100644
--- a/string_utils.c
+++ b/string_utils.c
@@ -1,11 +1,12 @@
#include <stdio.h>
-int my_strlen(const char *s)
+size_t my_strlen(const char *s) // 将 int 修改为 size_t
{
const char *p = s;
while (*p)
++p;
return (p - s);
}
-
+// 用于测试的示例用法
int main(void) {
const char *test_strings[] = {"hello", "world", ""};
for (int i = 0; i < 3; ++i) {
- printf("Length of '%s' = %d\n", test_strings[i], my_strlen(test_strings[i]));
+ printf("Length of '%s' = %zu\n", test_strings[i], my_strlen(test_strings[i])); // 将 %d 修改为 %zu
}
return 0;
}

定期查看修改和历史有助于理解项目的演变、调试问题以及有效地协作。