文件在git中的最后一次提交显示了添加的行,但该文件不在项目文件夹中



使用命令git log --numstat,我可以看到文件MyFile的最后一次提交显示添加的一些行。这意味着它对MyFile所做的最后一件事是有人给它加了几行

同时我找不到MyFile在项目文件夹中。因此我假设MyFile在某些分支中被引用,但在当前分支中未被引用。

这个假设正确吗?如果是这样,是否有办法找到哪些分支实际上有对MyFile的引用

?

如果发生以下情况,就可以解释这一点:

  1. 分支a上文件被删除
  2. 在删除后,分支B上的同一文件被修改(按时间计)。
  3. 分支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 logHEAD开始,名称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(它不可能是一个:它有一些不好的字母在里面;badf00ddeadcabfeedc0ffee可以是一个缩写的哈希ID,但c0mmand0不能,因为mn都不是有效的十六进制数字),或者作为分支或标签名称(但它不是一个),或者其他一些查找提交的方式:查看gitrevisions文档中的一些,许多方法来指定特定的提交。然而,--语法告诉Git命令,后面的不是一个选项,即使它类似于一个选项,而且在这种情况下也不是一个修订说明符。因此,git log现在将其视为文件名:

$ git log -- Makefile
commit 8f79fb6445cb1d17c5527ba958e460725e7b111e
Merge: 68658a867d 32da6e6daf
Author: Junio C Hamano ...

(当然我可以恢复我用git restoregit checkoutgit reset --hard或任何东西删除的文件,因为我真的不想删除它)。

相关内容

  • 没有找到相关文章

最新更新