【问题标题】:How to show commits which build on a previous commit?如何显示基于先前提交的提交?
【发布时间】:2020-01-11 16:46:45
【问题描述】:

我有一个旧的提交,我想挑选到另一个分支。但是,由于它是旧提交,因此其中可能存在已由最近的提交修复的错误。我知道这并非完美无缺,但如果我能获得修改所添加代码的提交列表,那可能会捕获任何此类更改。

我无法处理自原始提交以来的单个提交,因为它们太多了,但我描述的较小的列表应该是可以管理的。

我正在寻找的一个例子:

基地:

void foo() {
    //do something
}

commit1 之后:

void foo() {
    //do something
}

bool bar() {
    return true;
}

commit2 之后:

bool foo() {
    //do something
    return false;
}

bool bar() {
    return true;
}

commit3 之后:

bool foo() {
    //do something
    return false;
}

bool bar() {
    if (cond)
         return false;
    return true;
}

如果 commit1 是我有兴趣挑选的旧提交,我应该得到一个包含 commit3 但不包含 commit2 的列表。

编辑:为了进一步澄清@O​​bsidianAge 的评论,我将举一个樱桃挑选的例子。

如果提交历史看起来像这样:

* c470ee1 - commit3 (branch1)
* c65a8d0 - commit2
| * fe51fc2 - commitB (HEAD -> branch2)
| * 900ca02 - commitA
* | 607e2c7 - commit1
|/  
* Base

那么cherry-pick 命令将是git cherry-pick 607e2c7。但是,由于 commit3 是对来自 commit1 的错误的修复,结果将是 branch2 现在包含来自 commit1 的错误,而不是对它的修复。

由于 commit3 修改了 commit1 添加的 3 行块,因此应该将其标记为相关。另一方面,commit2 不涉及这 3 行,因此不应被标记为相关。

我知道 git porcelain 不太可能为此提供命令,但我希望有一种方法可以通过组合 git 管道命令和/或终端命令(如 sed)来完成此操作。

【问题讨论】:

  • 为什么你会得到commit3而不是commit2commit2 已更改 - 它添加了 return false。不过,对原始提交的简单挑选将为您提供该提交与当前状态之间的整个更改——如果您想找出这些更改来自哪个提交从那时起,您可能需要手动完成。
  • 您还可以获取修改您的特定文件的提交列表。这应该会给你更少的提交来检查。
  • @ObsidianAge 我已对问题进行了进一步澄清。 Commit2 与来自 commit1 的更改无关,更改不会发生在 commit1 添加的任何行上。换句话说,commit2 可以在没有 commit1 的情况下被挑选到 branch2,但是尝试在没有 commit1 的情况下将 commit3 挑选到 branch2 会导致合并冲突。

标签: git


【解决方案1】:

如“how do I view the change history of a method/function?”中所示,您可以使用git log -L :<funcname>:<file>

这将有助于跟踪修改了特定功能的提交。

【讨论】:

  • 这只适用于我给出的小例子。实际上,commit1 分布在多个文件中的多个方法中,而且太大而无法实现。此外,commit1 所做的一些更改可能只是 50 多行函数的 2-3 行。
  • @DanielMcIntosh 我同意,这对你来说并不理想。
猜你喜欢
  • 1970-01-01
  • 2011-01-08
  • 2011-04-25
  • 2015-08-10
  • 2011-11-30
  • 1970-01-01
  • 2020-12-12
相关资源
最近更新 更多