Git log --仅名称忽略某些提交

jw5wzhpr  于 2022-11-20  发布在  Git
关注(0)|答案(5)|浏览(236)

我 希望 看到 我 的 git 历史 记录 中 修改 过 的 文件 名 , 但 不 包括 一 次 提交 。
当 我 使用 命令 时 :git log --oneline , git 返回 以下 提交 :

问题 出 在 提交 0810c44 上 。 这个 提交 是 因为 它 是 一 个 同步 提交 , 它 包含 了 很多 更新 的 文件 , 但是 我 当前 的 任务 并 不 需要 这些 文件 ( 它 包含 了 很多 要 与 我 的 本地 存储 库 同步 的 文件 ) 。

我 希望 看到 所有 文件 名 从 当前 的 HEAD 更改 为 以前 的 提交 ( 例如 , 824be3b ) , 但 在 提交 0810c44 被 省略 的 方式 , 我 怎么 能 做到 这 一 点 ?

# # Git 以 文本 形式 返回 :

git log --oneline
第 一 个

tkclm6bt

tkclm6bt1#

我没有一个简单的命令给你,但这里有一对夫妇的“变通”的解决方案,应该实现你的最终目标。
如果没有你想要的那么多提交,从一个没有这些提交的分支开始,在那里,你可以创建一个新的临时分支,然后git只挑选你想看到结果的提交,然后对临时分支运行你的命令。
如果有很多提交需要查看结果,而只有一个提交需要忽略,那么你可以尝试类似于上面的策略,但是从当前分支创建一个包含所有提交的分支,然后还原当前提交。同样,这样会留下一个包含所需提交的分支-运行命令获取所需文件的列表,然后跳回你的实际分支。

pb3s4cty

pb3s4cty2#

我不认为有一种方法可以使用git log来排除某个提交,但是要列出在多个提交中修改过的所有文件,可以使用git diff,再加上恢复特定的提交,应该可以达到预期的效果。

commit d9d6084ebc16effd52327fd67b82860d5b9510a3 (main)
Author: micromoses <micromoses>
Date:   Wed Nov 16 21:51:24 2022 +0200

    Added e.txt

diff --git a/e.txt b/e.txt
new file mode 100644
index 0000000..d905d9d
--- /dev/null
+++ b/e.txt
@@ -0,0 +1 @@
+e

commit 6a3c93aa8746e9d81a7dceefd8f4210bacf1103b
Author: micromoses <micromoses>
Date:   Wed Nov 16 21:52:43 2022 +0200

    Modified d.txt

diff --git a/d.txt b/d.txt
index 4bcfe98..32a8474 100644
--- a/d.txt
+++ b/d.txt
@@ -1 +1,2 @@
 d
+modified d

commit 90b7155196a272ca19417b451320a9c66f619f35
Author: micromoses <micromoses>
Date:   Wed Nov 16 21:51:24 2022 +0200

    Added d.txt

diff --git a/d.txt b/d.txt
new file mode 100644
index 0000000..4bcfe98
--- /dev/null
+++ b/d.txt
@@ -0,0 +1 @@
+d

commit 8cee8643364631e91f91d36f23d5bf0c3c89354d
Author: micromoses <micromoses>
Date:   Wed Nov 16 21:51:24 2022 +0200

    Added c.txt

diff --git a/c.txt b/c.txt
new file mode 100644
index 0000000..f2ad6c7
--- /dev/null
+++ b/c.txt
@@ -0,0 +1 @@
+c

commit 1ff08cfde30e9b3ee358ffe1e8ce83d6f08c293b
Author: micromoses <micromoses>
Date:   Wed Nov 16 21:51:24 2022 +0200

    Added b.txt

diff --git a/b.txt b/b.txt
new file mode 100644
index 0000000..6178079
--- /dev/null
+++ b/b.txt
@@ -0,0 +1 @@
+b

commit 36d3284a11b001ecd02d1ab817546bc51ea16cb5
Author: micromoses <micromoses>
Date:   Wed Nov 16 21:51:24 2022 +0200

    Added a.txt

diff --git a/a.txt b/a.txt
new file mode 100644
index 0000000..7898192
--- /dev/null
+++ b/a.txt
@@ -0,0 +1 @@
+a

commit 76da7ed781432d4d7348359665a50baa2df7ac39
Author: micromoses <micromoses>
Date:   Wed Nov 16 21:49:57 2022 +0200

    Initial commit

假设我们要排除两个提交,6a3c93a8cee864,我们可以创建一个新分支,还原这两个提交,然后运行git diff:

$ git checkout -b temp_revert
$ git revert 6a3c93aa8746e9d81a7dceefd8f4210bacf1103b
$ git revert 8cee8643364631e91f91d36f23d5bf0c3c89354d
$ git diff --name-only 76da7ed781432d4d7348359665a50baa2df7ac39
a.txt
b.txt
d.txt
e.txt

注意c.txt从列表中被删除了,但是d.txt仍然显示出来--因为它在提交90b7155时被修改了,而我们想要包含它。
虽然恢复历史提交可能会导致冲突,但为了列出修改过的文件,这不是问题,因为它只表明文件在稍后的阶段被修改过。我不会麻烦解决它们,我实际上会提交恢复而不进行任何编辑。最终结果仍然会显示这些文件为修改过的,这是我们想要的结果。

7uzetpgm

7uzetpgm3#

我理解你的需求,但这似乎违背了git的设计,有两个重要原则:
git跟踪的是内容,而不是文件
②原始提交的散列唯一标识了以该提交为根的整个数据结构的状态
这听起来有点复杂,例如,您想排除0810c44,但您的9dfe1b9记录的修改内容是基于0810c44的,换句话说,9dfe1b9之所以是9dfe1b9,是因为0810c44。
如果0810c44的内容不同(或者甚至如您所期望的那样没有0810c44),9dfe1b9将不是9dfe1b9,而是另一个完全不同的节点(或哈希)
所以,我理解你的需要,但它看起来不太可能通过git内部命令来解决。

wyyhbhjk

wyyhbhjk4#

如果是一组你从来不感兴趣的文件,不管它们是由哪个提交更改的,你可以使用pathspec表达式来排除这些文件:

git log --name-only -- ':(exclude)mergeFolder'
nszi6y05

nszi6y055#

使用git rev-list列出提交哈希,从列表中删除目标提交,然后使用git show查看每个单独的提交:

git rev-list 824be3b..HEAD |\
  grep -v "^0810c44" |\
  xargs git show --oneline --name-only

您可以通过将--oneline替换为--format=""来完全删除任何提交的内容(并且只保留文件列表

相关问题