我从 Github 克隆了我的新仓库,工作目录中的文件 FETCH_HEAD -> .git 包含以下内容:
fe300b2c9852acf68b4f1dd78ace916a083f3236 not-for-merge branch 'master' of ssh://git@github.com/mike123/myRepo.git
不合并是什么意思?
基本上,git fetch
获取分支并将结果存储在FETCH_HEAD
文件中。当它作为 的一部分运行时git pull
,此信息稍后会在内部用于决定需要合并的内容。
如果提取了多个分支,则只有未标记为的分支在not-for-merge
以后合并。另请参阅Junio 的这篇博文。
在您的情况下,JGit(EGit 用于处理 Git 存储库的库)的行为似乎与命令行 Git 实现不同。FETCH_HEAD
在命令行 Git 中,克隆后没有权利。但是在你第一次拉之后,文件就在那里。尝试拉动并查看文件如何更改。但是,这种实现上的差异应该没有害处。
Egit是基于JGit的,“ not-for-merge
”只用在org.eclipse.jgit.transport.FetchHeadRecord
FetchHeadRecord 的那个notForMerge
变量是在org.eclipse.jgit.transport.FetchProcess#want
方法中设置的。
fhr.notForMerge = spec.getDestination() != null;
如果 refspec 目标不为 null,则此获取的 HEAD 不用于合并。
当您获取远程时,远程分支的目标是refs/remotes/yourRemote
,因为 fetch refspec 的本地配置:
[remote "origin"]
fetch +refs/heads/*:refs/remotes/origin/*
在没有直接目的地的情况下获取的一个分支将是一个正在跟踪远程分支的分支:
[branch "master"]
remote = origin
merge = refs/heads/master
这就是为什么在获取 JGit 存储库(在命令行中,而不是在 Eclipse Egit 中)之后,我看到:
C:\Users\VonC\prog\git\jgit\.git>type FETCH_HEAD
c2a9f9e742f7e6633af130823c154a485e6071b2 branch 'master' of https://github.com/eclipse/jgit
51d1af9489924ff03fa10ec963110c608c2882a3 not-for-merge branch 'stable-0.10' of https://github.com/eclipse/jgit
989149736ad1cd09c15e143aa598028b9f9b6502 not-for-merge branch 'stable-0.11' of https://github.com/eclipse/jgit
b2b58feba7400269df8b31ef8495b695af3a9793 not-for-merge branch 'stable-0.12' of https://github.com/eclipse/jgit
让我们尝试在 Egit/JGit(Luna、Egit 3.0、Win7 64 位)中重现它:
经过几次获取,我从来没有看到一个没有但的条目not-for-merge
。
即使是从远程分支合并新提交的拉取仍然会生成一个FETCH_HEAD
:
220c4502ecea147ef4beaae8039b168965e148e9 not-for-merge branch 'master' of ..\..\jgit
我猜 JGit 的行为在这方面有所不同。