Git执行fetch后如何区分待拉取文件与本地待推送文件
问题解决方法
已执行git fetch的前提下,本地已经存储了远端分支的最新快照(对应origin/[分支名]这个远端跟踪引用),之前命令无法区分两类文件的核心原因是:两点式git diff A B语法会直接对比两个引用的全量快照差异,把A侧和B侧各自独有的改动混在同一份结果里,自然无法区分改动来源。
两类文件的区分核心是先找到本地分支HEAD和远端跟踪分支的共同祖先提交(merge base),再分别对比两侧分支相对共同祖先的独有改动,就能完全拆分两类文件,不会出现混合。
1. 查看本地已提交、待推送的文件
这类改动是本地分支相对共同祖先新增的提交内容,远端分支不存在这些改动,执行以下任意一条命令即可,结果不会混入远端待拉取的文件:
- 三点diff法(直接输出改动统计,和常用的
--stat参数完全兼容):
git diff --stat origin/Release_Candidate...HEAD
注:
git diff A...B的规则是自动查找A和B的共同祖先,对比B相对共同祖先的全部改动,不会包含A侧相对共同祖先的改动。
- 提交枚举法(列出所有本地领先提交改动的文件,自动去重):
git log --name-only --pretty=format: origin/Release_Candidate..HEAD | sort -u
2. 查看远端已更新、待本地拉取的文件
这类改动是远端分支相对共同祖先新增的提交内容,本地分支不存在这些改动,执行以下任意一条命令即可:
- 三点diff法:
git diff --stat HEAD...origin/Release_Candidate
- 提交枚举法:
git log --name-only --pretty=format: HEAD..origin/Release_Candidate | sort -u
适配GUI开发的补充说明
开发Git图形界面时,可以按以下固定逻辑分层判断文件状态,不会出现状态混淆:
- 先执行
git merge-base HEAD origin/Release_Candidate拿到本地分支和远端分支的共同祖先提交哈希 - 待推送文件列表:对比共同祖先提交与本地HEAD提交的差异文件
- 待拉取文件列表:对比共同祖先提交与
origin/Release_Candidate提交的差异文件 - 暂存区未提交文件:对比本地HEAD提交与暂存区的差异文件,对应命令
git diff --stat --cached - 工作区未暂存文件:对比暂存区与当前工作区的差异文件,对应命令
git diff --stat
按照这个逻辑,你给出的示例场景中,待推送列表只会返回AP4Configuration/appsettings.json、Local5.txt两个文件,待拉取列表只会返回AP4Configuration/ChangeLog.txt,完全符合预期。
内容的提问来源于stack exchange,提问作者Derek Mason
相关产品推荐
相关产品推荐

