我想看看在获取新提交后触摸了哪些文件。我希望它与合并后看到的文件相同:文件列表,带有"x 次"+(用于插入的行(和"y 次" - (用于删除的行(。
我试过:
git log --pretty=format:'%h %d %s %an %ar' --date=short --stat HEAD..origin
但:
它向我展示了一个接一个的提交 - 而我想查看整个触摸的文件集,就好像只有一个大提交一样
它不会停止在我已经在我的机器上拥有的旧提交。
因此,这里的目标实际上是一目了然:如果我合并所有新提交,传入的提交会更改哪些文件?
获取所需报告类型的正确方法是使用 git diff
。例如:
git diff --stat master origin/master
如果您的本地分支及其上游对应项始终遵循相同的模式(例如 foo
和 origin/foo
(,然后将一个小的 shell 函数写入别名应该可以工作 - 在你的.gitconfig
中是这样的:
[alias]
upstreamdiff = "!f(){ git diff --stat ${1} origin/${1} }; f"
如果您有未命名为 origin
的远程数据库,或者如果您没有使用匹配分支名称的习惯,则它变得更加复杂,您可能需要一个完整的 shell 脚本来获取分支,找到它的上游伙伴,然后运行相应的 git diff
命令。
编辑:合并自动分支确定:
alias
upstreamdiff = "!f() { b=$(git symbolic-ref --short HEAD); git diff --stat ${b} origin/${b} }; f"
你问
查看获取后触摸了哪些文件
如果您在不执行merge
或rebase
的情况下多次获取,那么从分支merge-base
到上游的差异将为您提供所有这些获取的总和,而不仅仅是最近的获取。 我发现两者兼而有之很有用 - 我将其中一个别名为 unmerged
,另一个别名为 whatfetched
.
此外,git 提供了内置功能来识别您的上游,即使您正在跟踪的分支没有相同的名称,该功能也可以工作,这是通过特殊的 ref @{u}
.
因此,对于您想要的内容,您需要检查
git rev-parse @{u}
这将告诉您您的分支机构是否有上游。
要获取上游的名称,您可以使用
git rev-parse --abbrev-ref --symbolic-full-name @{u}
这将打印我们的origin/$BRANCH
,即使您的分支正在跟踪具有不同名称的分支,也可以正常工作。 将其分配给$UPSTREAM
因此,仅查看最近的获取(whatfetched
(,您将使用reflog仅显示上游当前指向的位置与先前指向的位置之间的变化。
git diff --stat $(UPSTREAM) ^$(UPSTREAM)@{1}
如果你想看看你在这里到底在看什么,你可以使用类似的东西
git reflog ${UPSTREAM}@{now} -2
要查看尚未合并的所有更改的总和(unmerged
(,您需要从分支和上游到上游的merge-base
差异
git diff --stat HEAD...$(UPSTREAM)