使用命令git log --numstat
,我可以看到文件MyFile的最后一次提交显示添加的一些行。这意味着它对MyFile所做的最后一件事是有人给它加了几行
同时我找不到MyFile在项目文件夹中。因此我假设MyFile在某些分支中被引用,但在当前分支中未被引用。
这个假设正确吗?如果是这样,是否有办法找到哪些分支实际上有对MyFile的引用
?如果发生以下情况,就可以解释这一点:
- 分支a上文件被删除
- 在删除后,分支B上的同一文件被修改(按时间计)。
- 分支B并入分支A,产生冲突,选择删除。
下面是一个bash脚本示例:
#!/bin/bash -v
git init
echo asdf > asdf.txt && git add . && git commit -m "Add file asdf.txt"
git branch test-branch
rm asdf.txt && git add . && git commit -m "Delete asdf.txt"
git switch test-branch
sleep 1 # pause for one second to make sure commit datetimes are different
echo qwer >> asdf.txt && git add . && git commit -m "Add qwer to asdf.txt"
git switch main
git merge test-branch --strategy=ours --no-edit # cheat to prevent a conflict and skip the other commit
ls -la # prove there are no files
git log --numstat # the most recent commit of asdf.txt is adding a line
正如Lasse V. Karlsen在评论中所说,默认情况下,git log
从当前或HEAD
提交开始,然后从那里向后工作。所以:
$ git log
commit cefe983a320c03d7843ac78e73bd513a27806845 (HEAD -> master ...
...
5 0 Documentation/RelNotes/2.34.0.txt
commit 45d141a1ddbc55c220ad4c726c02bbbf7a69247a
:
:
commit 187fc8b8b6e7a2b65f7c74cfaa8aa6bad36a18b2
...
29 15 unicode-width.h
这里我们看到unicode-width.h
在commit187fc8b8b6e7a2b65f7c74cfaa8aa6bad36a18b2
中被修改了。只要从numstat输出中向上读取一点,找到提交哈希ID,根据git diff
的结果,父子对子对给定文件有给定的更改。
同时我找不到MyFile在项目文件夹中。因此我假设MyFile在某些分支中被引用,但在当前分支中未被引用。
分支(分支名称)不相关;只有提交重要。每次提交都在零个或多个分支上,因此提交187fc8b8b6e7a2b65f7c74cfaa8aa6bad36a18b2
可以在27个分支上,或者只是在master
上(它肯定是在master
上,因为我的git log
从HEAD
开始,名称master
)。文件unicode-width.h
肯定在那个提交中。
文件是否在工作树中也不是真正相关的,但是如果文件MyFile
不在工作树中,运行:
git log MyFile
通常会给你一个错误。然而:
git log -- MyFile
不会给你一个错误。原因是,这里git log
知道使用MyFile
作为路径名:
$ rm Makefile
$ git log Makefile
fatal: ambiguous argument 'Makefile': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Git正在尝试将Makefile
作为一个哈希ID(它不可能是一个:它有一些不好的字母在里面;badf00d
或deadcab
或feedc0ffee
可以是一个缩写的哈希ID,但c0mmand0
不能,因为m
和n
都不是有效的十六进制数字),或者作为分支或标签名称(但它不是一个),或者其他一些查找提交的方式:查看gitrevisions文档中的一些,许多方法来指定特定的提交。然而,--
语法告诉Git命令,后面的不是一个选项,即使它类似于一个选项,而且在这种情况下也不是一个修订说明符。因此,git log
现在将其视为文件名:
$ git log -- Makefile
commit 8f79fb6445cb1d17c5527ba958e460725e7b111e
Merge: 68658a867d 32da6e6daf
Author: Junio C Hamano ...
(当然我可以恢复我用git restore
或git checkout
或git reset --hard
或任何东西删除的文件,因为我真的不想删除它)。