【问题标题】:How to checkout to a commit after it gets squashed?压缩后如何检出提交?
【发布时间】:2023-01-17 08:34:03
【问题描述】:

在合并期间,我同时使用了Delete source branch when merge request is acceptedSquash commits when merge request is accepted 选项。

Gitlab 完美地完成了他的工作:它压缩对单个提交的提交并将其合并到目标分支。

但它也保留原始提交 - 您可以在合并请求页面的 Commits 选项卡中看到它们:

我希望能够签出这些提交。但是在新的克隆存储库中,git 无法通过哈希找到它们:

$ git checkout c8ad8edf
error: pathspec 'c8ad8edf' did not match any file(s) known to git

我认为发生这种情况是因为 git clone 仅获得可以从初始提交到达的提交。但是 GitLab 存储了这些信息——我可以在浏览器中查看任何提交的信息:

那么我该如何检查这些提交呢?

【问题讨论】:

  • 我认为发生这种情况是因为 git clone 只获得可以从初始提交到达的提交" -> 否。可达性以相反的方式工作:git 看到所有可从现有引用(标签、分支、引用日志、存储条目)访问的提交,通过祖先向后工作,直到初始提交(或初始提交,因为可以有超过一)
  • 如果获取不到,可以尝试在git lab上创建一个分支,然后就可以找到了
  • 您是否也获取了更改? git fetch --all
  • 这是图形问题。只要有一些标记/分支或任何分支标记或指向的寒意,提交就会可见。如果你看到提交,那么必须有一些东西让它们在历史图中保持活跃。 git 的哲学也是不要删除任何东西。当提交无法访问且陈旧时,物理删除会不时发生。因此,在很长一段时间内,如果您能够找到“已删除”提交(例如使用git reflog),您就可以检出它。

标签: git gitlab squash


【解决方案1】:

您可以获取 refs/merge-requests/$id/head ref,其中 $id 是合并请求的数字 ID(在您的情况下为 3,来自您的屏幕截图):请参阅 Checkout merge requests locally through the head ref。请注意,在 GitLab 13.4 及更新版本中,该 ref 在 MR 合并或关闭 14 天后被删除。

git fetch origin refs/merge-requests/3/head
git checkout FETCH_HEAD

【讨论】:

    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2011-08-05
    • 2017-10-16
    • 1970-01-01
    • 2021-03-26
    • 2018-06-01
    相关资源
    最近更新 更多