gpt4 book ai didi

git - 为什么 git status 和 git show 不一致?

转载 作者:太空狗 更新时间:2023-10-29 14:28:04 26 4
gpt4 key购买 nike

为什么 git statusgit show 不一致?

存储库应该位于标签中。这是 git status 告诉我的(散列从 609b 开始)。

但是 git show 告诉我它正在提交,哈希值从 156f 开始。

目前的情况是执行以下操作以获取标签处的代码库。

git clean -f && git reset HEAD --hard && git fetch && \ 
git fetch --tags && git checkout daily-build-492 && git pull

为什么不一致?

一些诊断:

$ git status
HEAD detached from daily-build-492
nothing to commit, working directory clean
$ git rev-list -n 1 daily-build-492
609b538fb0180b170170be09312fecf5a5240b6a
$ git show
commit 156f9e6b3fbfe7c16e8d821efd315428610043c2
Merge: ec154d9 15e8876
Author: ubuntu <ubuntu>
Date: Wed Dec 2 14:09:23 2015 +0000
Merge branch 'deploy-server'
$ git describe --tags --exact-match
fatal: no tag exactly matches '156f9e6b3fbfe7c16e8d821efd315428610043c2'
$ git log --tags --simplify-by-decoration --pretty="format:%ai %d" |grep 492
2015-11-23 07:05:18 +0000 (tag: daily-build-492)

最佳答案

我认为您同时被两个问题搞糊涂了。首先,您处于分离的 HEAD 状态。 Daily-build-492 是一个标签,您不能对标签进行更改。如果你在 master 中 checkout 标签(例如)git 会首先给你这样的消息:

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b new_branch_name

这基本上就是您在执行 git checkout daily-build-492 时可能做的事情。如果您现在执行 git status,您将收到一条如下所示的消息:

$ git status
HEAD detached at daily-build-492

之后,您连接(使用 &&)一个 pull 命令,该命令从链接的远程获取更改。我的猜测是,因为这会添加对标签的更改并且因为这是不允许的,所以您会自动从 daily-build-492 分离到更远的边缘 :) 现在通知将是:

$ git status
HEAD detached from daily-build-492
nothing to commit, working directory clean

如您所见,这正是您的 git status 在您执行初始命令后实际告诉您的内容。

Git status 只显示索引文件和当前 HEAD 之间的所有差异。这基本上意味着与 HEAD 相比,您所做的所有更改都是全新的文件、更改或阶段性更改。基本上你是 git status 告诉你没有变化,你已经脱离了 HEAD。

Git 显示

git show 做了一些不同的事情。 Git show 显示对象的信息。 git 中的一个对象可以是很多东西;一个提交,一个标签,一棵树等。如果你不给 git show 一个对象散列行为似乎是 git show 最后一次提交。这是您在 checkout 标签后 pull 入的提交。使您进入分离 HEAD 模式的提交之一。

简单重现您的问题

git init test.git
cd test.git
touch A
git add A
git commit -m "A, jay"
touch B
git add B
git commit -m "B, jay"
git tag TAG-1
git checkout TAG-1 //Now you will get the notice about git detached HEAD etc
git status // result below
//HEAD detached at TAG-1
//nothing to commit, working directory clean
touch C
git add C
git commit -m "C, shoopdawhoop" // a warning like below is outputted,but it works
//[detached HEAD eda8080] C
// 1 file changed, 0 insertions(+), 0 deletions(-)
// create mode 100644 C
git status // output below again
// HEAD detached from TAG-1
// nothing to commit, working directory clean
git show // will now tell us about commit C the last one we added.
// commit eda808088594ae7b05ae1b57ffd95f7f810a9091
// Author: a@example.net <a@example.net>

这一小组命令基本上模仿了我认为您所做的。也许命令的 && 串联使输出静音,也许没有但您没有发布。这个故事的寓意是你试图做一些 git 不允许的事情。

正如您在示例中看到的,这解释了为什么您的 git describe --tags 没有产生任何结果,因为您给它提供了提交 C 的哈希值(不是真的,但它类似于提交C 在我的例子中。)

您的 git rev-list 确实给了您所期望的,因为您特别要求它用于 daily-build-492 中的最后一次提交。

关于git - 为什么 git status 和 git show 不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34045598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com