Git中是否有文件的上一个版本的简写方式?

7
我想要的是像这样的东西 -
git checkout FHEAD~ path/filename 我现在做的是通过以下方式找到文件的上一个版本 -
git log -1 --skip=1 path/filename 然后,
git checkout <previous-commit-hash> path/filename

你在这里问什么?是要查询一个文件版本的别名,该版本记录在HEAD的父级中吗?请澄清。 - jub0bs
还有,FHEAD是什么? - jub0bs
2
@Jubobs 这个问题对我来说似乎很清楚:找到特定文件的上一个版本,其中“上一个”意味着“在更改该文件的最后一次提交之前的状态”(并忽略不更改该文件的其他提交)。 - user743382
@hvd,现在你把它解释清楚了,我明白了。 - jub0bs
@Jubobs: FHEAD~ == git log -1 --skip=1 --format=%H path/filename. 在我看来,FHEAD应该是文件头的别名。 - work.bin
1个回答

0

一个简单的示例,用于检索文件的上一个版本的别名。

这里的诀窍是使用 --format 格式化日志输出,只返回提交哈希值。

[alias]
    prev    = "!f(){ git checkout $(git log -1 --format="%H" --skip=1 -- ${GIT_PREFIX:-.}/$1) -- ${GIT_PREFIX:-.}/$1; git reset ${GIT_PREFIX:-}/$1; }; f"

使用git log -1确保git prev始终返回直接父文件。选择下一个父文件可能更复杂。

还要注意,一旦检出文件,它就会立即添加到索引中。它不会合并到您现有的副本中,并且不会警告覆盖本地更改。我已包含了对git-reset的调用,以确保已检出的文件仅在工作目录中,而不在索引中。

使用GIT_PREFIX允许您输入相对路径,但只有相对较新版本的git支持GIT_PREFIX。

编辑..

使用git rev-list也是同样的道理... 一个非常强大的git命令,专为在脚本和自动化时遍历git祖先图设计的...

[alias]
    prev    = "!f(){ git checkout $(git rev-list --max-count=1 --skip=1 HEAD --  ${GIT_PREFIX:-.}/$1) -- ${GIT_PREFIX:-.}/$1; git reset ${GIT_PREFIX:-}/$1; }; f"

1
或者在脚本中使用 rev-list 代替 log - knittl
当然可以。 git rev-list --max-count=1 --skip=1 HEAD -- ${GIT_PREFIX:-.}/$1 可以替换 git log 并产生相同的结果。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接