代码之家  ›  专栏  ›  技术社区  ›  SamGoody

头已经消失了,想把它合并成主控形状[关闭]

git
  •  7
  • SamGoody  · 技术社区  · 16 年前

    reflog vs GITK http://siteroller.net/archive/images/Forums/headless%20GIT.png

    顶部图像是:git reflog的输出。
    下面是GitGUI(msysgit)中的Gitk在查看所有分支历史时向我展示的内容。

    最后几次提交不会显示在GitGUI上。

    • 为什么他们不在Gitk上显示(至少作为一个分支或什么的)?
    • 如何将它们合并到master中?
    • 我估计这是我签出0.42号标签时发生的。为什么这和主人不一样?(我给主人贴上了最新的标签)
    • 当我单击Push时,为什么远程回购声明是最新的。它不应该尝试将这些提交更新到它们所在的分支中吗?

    第一个问题很重要-我想开始了解Git在想什么。在这一点上,它更像是先知而非逻辑。

    如果看到早期的历史有什么不同,那么这个项目是一个[相当强大的]JS颜色选择器,可以 viewed here 全部。

    3 回复  |  直到 16 年前
        1
  •  10
  •   Community Mohan Dere    9 年前

    为什么要将这些提交更新到它们所在的分支中?

    仅此而已:您不在任何分支上,但当前正在 detached head :

    从1.5.0版开始,上面的命令将分离 HEAD 从当前分支直接指向由标记命名的提交。

    如果你做一个 gitk --all

    解决问题的一种方法(如果你已经承诺了所有的事情)

    $ git log -1
    # note the SHA-1 of latest commit
    $ git checkout master
    # reset your branch head to your previously detached commit
    $ git reset --hard <commit-id>
    

    另一种方法是将您的工作合并到当前的主标题中,该标题恰好位于标记处:

     $ git checkout -m 0.42
    

    但这会让你在一个超然的头脑中做出承诺的历史变得松散。


    我估计这是我签出0.42号标签时发生的。为什么这和主人不一样?(我给主人贴上了最新的标签)

    不,它和主人不一样。AS Jefromi 在注释中指出,分支可以移动(或被重命名、删除或…)
    master 引用的提交与“0.42”标记相同,但情况并非总是如此。
    通过签出标记,您不签出分支,因此处于“分离的头”状态。


    注:如中所述 this SO answer , the @{1} 你看到的符号是 $(git symbolic-ref HEAD)@{1} 也就是说,它是对当前(这里分离的)分支使用reflog,而不是头reflog。

        2
  •  3
  •   kaitanie    16 年前

    在Git提交中,形成一个有向非循环图,其中每个提交指向一个或多个父提交。除了提交对象之外,您还拥有引用(即引用)对象:分支和标记。它们指向提交图中的各种提交。您的问题是,提交时您不在分支上,并且没有分支(或标记)指向它们。随时可以使用命令

    git status
    

    git branch
    

    检查你是否在一个分支机构。

    为什么他们不在Gitk上显示(至少作为一个分支或什么的)?

    据我所知,Gitk从refs开始查找commit对象。如果没有引用指向您的提交(或导致提交的有向非循环提交图),那么它们实际上是不可见的。

    如何将它们合并到master中?

    幸运的是,reflog工具跟踪诸如签出和提交等操作。在您的reflog列表中,您可以看到上一次提交的条目:

    1b8c11d head@1 commit:shorted torgb()函数

    您应该能够使用在reflog中看到的sha1 id合并对主分支的提交:

    git checkout master
    git merge 1b8c11d
    

    我估计这是我签出0.42号标签时发生的。为什么这和主人不一样?(我给主人贴上了最新的标签)

    分支和标记之间的主要区别在于,标记总是指向相同的提交,但分支向前移动。例如,如果您在分支“master”上进行新的提交,“master”分支将向前移动,并开始指向刚刚创建的新提交。当您签出提交时,标签或分支git会按照字面意思接受您的命令,并检查您所要求的内容。

    当我单击Push时,为什么远程回购声明是最新的。它不应该尝试将这些提交更新到它们所在的分支中吗?

    你的承诺不在任何分支上。您首先需要将它们合并到一个分支(如到master),如上图所示。在此之后,推压应正常工作。

        3
  •  2
  •   jpalecek    16 年前

    恢复你的承诺最简单的方法就是把一些分支指向它们。你知道沙斯,所以很容易:

    git branch resurrected_junk 1b8c11d
    

    (这是从你的截图中读取的sha),也可以

    git branch resurrected_junk HEAD@1
    

    这将把一个分支指向最近丢失的提交-早期的提交可能是最近的提交的父级,因此它们将位于这个新分支上;如果它们不在(这意味着丢失的提交有两个“影子分支”),则必须复查所有提交并重申e未履行承诺的程序。

    在你的例子中,我想你会得到这样的历史:

    Master --> Optimize toRGB --> ... ---> shortened toRGB = resurrected_junk
    

    然后,刷新您的Gitk视图,提交就会出现。(我用的是QGit,所以我只是猜测)

    之后,您应该能够合并/推送/任何您想要的(您喜欢的)。