为什么 git status 和 git 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)
答案 0 :(得分:4)
我觉得你一下子被两个问题搞糊涂了。首先,事实上你处于分离的HEAD状态。 Daily-build-492是一个标签,您无法对标签进行更改。如果你在主人(例如)中签出一个标签,git将首先给你一个这样的消息:
class Section extends Model
{
public function expenses()
{
return $this->hasMany('App\Http\Models\Expenses\Expense');
}
}
这基本上是您执行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
然后你连接(使用&amp;&amp;)一个pull命令,它从链接的遥控器中获取更改。我的猜测是因为这会对标签添加更改,因为这是不允许的,所以你会自动从daily-build-492分离到另一个边缘:)现在通知将是:
$ git status
HEAD detached at daily-build-492
正如您所看到的,这正是您的初始命令后git状态实际告诉您的内容。
Git状态只显示索引文件和当前 HEAD之间的所有差异。这基本上意味着您与HEAD相比所做的所有更改都是全新文件,更改或分阶段更改。基本上你是git状态告诉你没有变化,你已经脱离了HEAD。
Git show
git show做了不同的事情。 Git show显示有关对象的信息。 git中的一个对象可以是很多东西;一个提交,一个标签,一个树等。如果你不给git show一个对象哈希行为似乎是git显示最后一次提交。这是您在签出标签后提交的提交。其中一个提交让你进入分离的HEAD模式开始。
简单复制您的问题
$ git status
HEAD detached from daily-build-492
nothing to commit, working directory clean
这一小组命令基本上模仿了我认为你做过的事情。也许&amp;&amp;命令串联沉默输出,也许它没有,但你没有发布。这里故事的寓意是你试图做一些git不允许的事情。
正如您在示例中所看到的,这解释了为什么您的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>
不会产生任何结果,因为您给它提交了提交C的哈希(不是真的,但它类似于我的示例中的提交C。)< / p>
您的git describe --tags
确实可以为您提供您所期望的内容,因为您特别要求它在daily-build-492中进行最后一次提交。
答案 1 :(得分:3)
这有两个关键和hoppa has provided both,但让我看看我是否可以稍微缩短它。 (这对我来说是一个挑战,因为我倾向于写很长的答案。:-))无论如何,我会尝试更多地解决一些问题。
首先,我在此添加git pull
只是一个首先为您运行git fetch
的便捷脚本,然后根据您的配置和其他标志运行git merge
或{ {1}}。 (默认是进行合并,对许多用户来说通常是错误的。)
(您的问题也缺少一些信息。使用git rebase
本身应该会产生错误。但是,如果您使用git pull
或类似的,您应该看到一些额外的输出git pull origin master
当它完成第二步时。无论如何,我们可以看到你的最终状态是git pull
指向合并提交,尽管它的父项似乎都不是你的标记所标识的提交。 )
当你给它一个标签时, 1 HEAD
会让你进入&#34;分离的HEAD&#34;州。这听起来有点可怕,就像某种18世纪的法国大革命,但实际上只是意味着你不再在任何一个分支上。在这种状态下工作的Git很好:你可以进行新的提交,包括合并;他们只是在没有分支机构。找到它们的唯一方法是使用原始SHA-1,例如git checkout
,或者从156f9e6b3fbfe7c16e8d821efd315428610043c2
开始的某个相对名称,例如HEAD
本身,HEAD
,{ {1}},等等。 2
进入&#34;分离HEAD&#34;通过签出一个标签,然后你再做了至少一次提交(实际上,至少有两次提交基于HEAD~1
输出)。这些新的提交一如既往地与独立的HEAD一起完全没有分支。最后一个是合并,可能来自HEAD~2
的{{1}}后半部分。
现在git show
显示您的HEAD所在的位置:已分离,而位于标记,但来自标记。这意味着您之前处于标签(处于分离的HEAD状态)的正确位置。如果你当时运行git merge
,你会看到这个:
git pull
做了一些新的提交后,你去了&#34;脱离&#34;而不是&#34;分离在&#34;。
另一方面,git status
命令hoppa already noted显示一个对象。如果您不自己命名,则显示的默认对象是任何对象git status
名称。在这种情况下,$ git status
HEAD detached at daily-build-492
命名合并提交,因此git show
显示其ID,其父项的ID(HEAD
),作者和日期,提交消息(看起来像一个HEAD
提供show
步骤,以及组合差异(在这种情况下为空)。
有点奇怪的是,父提交都不匹配标记提交的明显ID Merge: ec154d9 15e8876
。 (我说&#34;明显&#34;这里是因为您使用了git pull
而不是git merge
,并且在排序要列出的提交后,可能(但不太可能)标记实际指向的内容在rev-list输出中进一步下降。)而且,正如我前面提到的,没有其他参数的609b538fb0180b170170be09312fecf5a5240b6a
应该只是给你一个错误信息。
(我认为我在&#34;较短&#34; :-)失败了,但也许至少这有助于弄清楚你是如何进入这种状态的。)
1 或者确实是任何不是分支短名称的提交标识符。例如,git rev-list -n 1
会为您提供与git rev-parse daily-build-492^{commit}
相同的提交,但会让您进入&#34;分离的HEAD&#34;州。 (如果这是你想要的,你也可以使用git pull
,我认为这更明显。)
2 如果您git checkout refs/heads/master
其他内容使git checkout master
现在引用了其他一些提交,那么您只剩下原始SHA-1,或者与某些修饰符相同。例如,git checkout --detach master
引用提交git checkout
的第一个父项,HEAD
引用该提交的第一个父项,依此类推。