git ls-remote origin -h refs/heads/master
brool 提供的方法是最简单的方法,可以检查遥控器中是否有任何变化。
从本地头开始:
$ git log -1 --oneline @
9e1ff307c779 (HEAD -> master, tag: v5.15-rc4, origin/master, origin/HEAD) Linux 5.15-rc4
我看到我提取的原点在该标签上是最新的。 git status 也这么说。但这只是本地最新的,获取后的(快进)合并。
检查远程 HEAD 是否去了某个地方,还有 master,也许还有一些新标签:
$ git ls-remote origin HEAD master --tags 'v5.1[56]-rc[345]*'
84b3e42564accd94c2680e3ba42717c32c8b5fc4 HEAD
84b3e42564accd94c2680e3ba42717c32c8b5fc4 refs/heads/master
71a6dc2a869beafceef1ce46a9ebefd52288f1d7 refs/tags/v5.15-rc3
5816b3e6577eaa676ceb00a848f0fd65fe2adc29 refs/tags/v5.15-rc3^{}
f3cee05630e772378957a74a209aad059714cbd2 refs/tags/v5.15-rc4
9e1ff307c779ce1f0f810c7ecce3d95bbae40896 refs/tags/v5.15-rc4^{}
HEAD 仍然在同一个分支上,但不再是同一个提交。该本地 @ 提交保留在 v5.15-rc4 标记中。这与 kernel.org git 上的 summary 表顶部的信息大致相同:
Branch: master <commit message> <author> age: 2 hours
只有 ls-remote 收集的信息较少 - 但只有我知道我在 9e1ff... aka v5.15-rc4。
除了命名 refs(HEAD、master)或标签,还可以从任何 repo 中获取头或分支的列表:
$ git ls-remote --heads git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
af06aff2a0007976513134dfe993d55992dd866a refs/heads/akpm
20bcee8e95f783c11a7bea1b6a40c70a37873e0a refs/heads/akpm-base
a25006a77348ba06c7bc96520d331cd9dd370715 refs/heads/master
4d5a088c93cea1c821d02a2217c592391d9682e2 refs/heads/pending-fixes
4de593fb965fc2bd11a0b767e0c65ff43540a6e4 refs/heads/stable
这里用一个 URL 代替“原点”。
如何检查远程存储库是否已更改,我需要
拉?
如果你这样问,就拉吧。
如何检查远程仓库是否终于做了某事并且我想拉取?
然后你获取并检查并合并。
使用单个 git 命令:
$ git rev-list -1 master
9e1ff307c779ce1f0f810c7ecce3d95bbae40896
$ git rev-list -1 @
9e1ff307c779ce1f0f810c7ecce3d95bbae40896
这本身并没有多说,但假设我知道我没有犯任何事情,那么:
$ git ls-remote origin HEAD master
60a9483534ed0d99090a2ee1d4bb0b8179195f51 HEAD
60a9483534ed0d99090a2ee1d4bb0b8179195f51 refs/heads/master
会告诉我遥控器已更改。自上次编辑以来,它确实有。 kernel.org 说 Age: 46 min. 关于 master 上的最后一次提交。
git fetch之后:
$ git rev-list -1 master
9e1ff307c779ce1f0f810c7ecce3d95bbae40896
$ git rev-list -1 FETCH_HEAD
60a9483534ed0d99090a2ee1d4bb0b8179195f51
$ git log --oneline ..FETCH_HEAD
60a9483534ed (origin/master, origin/HEAD) Merge tag 'warning-fixes-20211005' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs
f6274b06e326 Merge tag 'linux-kselftest-fixes-5.15-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest
ef31499a87cf fscache: Remove an unused static variable
d9e3f82279bf fscache: Fix some kerneldoc warnings shown up by W=1
bc868036569e 9p: Fix a bunch of kerneldoc warnings shown up by W=1
dcb442b13364 afs: Fix kerneldoc warning shown up by W=1
c0b27c486970 nfs: Fix kerneldoc warning shown up by W=1
84b3e42564ac Merge tag 'media/v5.15-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
b60be028fc1a Merge tag 'ovl-fixes-5.15-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs
df5c18838ea8 Merge tag 'mips-fixes_5.15_1' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux
206704a1fe0b media: atomisp: restore missing 'return' statement
740da9d7ca4e MIPS: Revert "add support for buggy MT7621S core detection"
1dc1eed46f9f ovl: fix IOCB_DIRECT if underlying fs doesn't support direct IO
2f9602870886 selftests: drivers/dma-buf: Fix implicit declaration warns
a295aef603e1 ovl: fix missing negative dentry check in ovl_rename()
现在我在本地拥有所有信息,但还没有合并(还)。我还下载了所有对象。 git show HASH 或 git diff HASH 工作。
在这种情况下,合并几乎是无操作的:快进到最后一次提交,没有额外的(真正的)合并,更不用说冲突了。这可以通过 --ff-only 来确定:
$ git merge --ff-only FETCH_HEAD
Updating 9e1ff307c779..60a9483534ed
Fast-forward
...
...
那么我怎么知道什么时候拉呢?一旦这两个哈希值/将有所不同:Updating 9e1ff307c779..60a9483534ed Fast-forward。它们不能相同,那将是“没有什么可更新的”。
最新的 reflog 提交也是这样说的:
$ git log -10 --oneline -g
60a9483534ed (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: merge 60a9483534ed0d99090a2ee1d4bb0b8179195f51: Fast-forward
9e1ff307c779 (tag: v5.15-rc4) HEAD@{1}: pull: Fast-forward
这样看来,出现一个新的标签可能是最好的触发点,也是这种情况下的目标;回到git ls-remote origin --tags PATTERN。
...别告诉我git remote show 是另一种方法:
show 提供有关遥控器的一些信息。
使用 -n 选项,远程头不会首先使用 git ls-remote 进行查询;而是使用缓存的信息。