gpt4 book ai didi

git - 我如何简单地线性化我的 git 历史记录?

转载 作者:IT王子 更新时间:2023-10-29 01:19:49 25 4
gpt4 key购买 nike

问题

鉴于我有如下提交:

A - B - C - D - G - H
\ /
- E - F -

我如何获得仅跟随第一个 parent 的完美线性历史?

例如,我想得到:

A - B - C - D - G'- H'

如上所述,预计 G 和 H 的 sha1 会发生变化。 (出于明显的原因)。如果 A、B、C 和 D 的 sha1 也发生变化,那么我想知道为什么。

背景

目的是避免在执行简单的 git rebase -i 时出现潜在的 merge 提交。

真正的重点是希望获得额外的洞察力以确定哪些提交在特定分支中,例如,如果我们有以下图表:

I - J - K - L - M
\ / / /
- N - O - P -

其中 N 被 merge 到 K,但 O 被 --strategy=ours merge 到 L,P 被 merge 到 M。

我希望能够将我的历史线性化,以便可以识别和检查此类有问题的提交。我想要一棵树可以识别 O 没有放入上游分支,即使我可能通过使用 git cherry 识别 N 和 P 也可能从上游分支中丢失,但是这里的任何建议将不胜感激.

最佳答案

如您所说,以下命令有效:

git filter-branch --parent-filter 'cut -f 2,3 -d " "'

为什么?

您提出的问题通过将每个 merge 提交转换为一个简单的提交来解决:这将简单地删除已 merge 的功能分支,因为它们将成为孤立的。

每个提交都有一个或多个父提交。 merge 提交是获得多个的提交。 Git 将其存储在历史记录的每个提交对象中。

git filter-branch 命令,带有 --parent-filter 选项,允许重写每个提交的父级,作为 -p 传递给过滤器SHA1,如果父级不止一个则重复。我们的过滤器会切断父级并强制每个提交都只有一个父级。

作为奖励,以下是如何通过重新创建新提交,在精确提交上手动执行此操作:

  • 获取提交树和第一个父节点

    tree=`git show -s --format=%T SHA1`
    parent=`git show -s --format=%P SHA1 | cut -d " " -f1`
  • 使用相同的树、相同的消息进行新的提交,并且只保留第一个父节点作为祖先

    git show -s --format=%B SHA1 | git commit-tree $tree -p $parent

关于git - 我如何简单地线性化我的 git 历史记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17988099/

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