如何选择包含端点的git commit范围

时间:2017-08-15 11:52:28

标签: git

我需要在git repo中指定第一次提交的下游的所有提交。

我正在尝试运行此命令:

<table>

我得到了:

$ git filter-branch --index-filter 'git rm --ignore-unmatch --cached some/path/file' -- 33e0331^..

因为fatal: ambiguous argument '33e0331^..': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]' 是repo中的第一个提交。我该怎么做?

3 个答案:

答案 0 :(得分:3)

不要指定起点。例如,如果你说master,则暗示&#34;所有内容都可以从master&#34;到达。包含起点的能力只是指定一些早期的历史记录&#34;排除。

虽然这应该解决您提出的方案,但对标题问题有一个更一般的答案:您不能。你 (因为大多数人会直观地定义它)。

范围表示法是一种方便,但它可能会产生误导。在非平凡的情况下,记住您可以指定(a)应该排除从提交可以到达的所有内容,或者(b)应该包括从提交可以到达的所有内容。每个都有多个符号。 A..B表示&#34;排除可从A到达的所有内容,但不包括从B&#34;到达的所有内容。它是^A B之类的简写(有趣的是,它实际上并不短......)

现在在一个简单的例子中,它看起来像一系列提交

x1 -- x2 -- A -- O1 -- O2 -- B -- x3 -- x4

在这么简单的情况下,你可以将它变成一个包含范围的&#34;使用&#34; parent-of&#34;您尝试过的表示法(^A^ BA^..B)。

如果A是根,例如:

A -- O1 -- O2 -- B -- x1 -- x2

仍然A..B表示包含OB。对于&#34;包容性&#34;范围,您只需省略我的答案的原始形式的起点。 B将包括AOB

你可以扩展你的定义&#34;范围&#34;一点点:

x1 -- x2 -- A
        \
         O1 -- O2 -- B

此处,A..B(再次只是^A B)将仅包含OB。这似乎是&#34;起点&#34;不在B的上游,但是您排除 A可以访问的所有内容,其中包含x s

所以现在,&#34;包容范围&#34;甚至意味着什么?

这是..表示法的常见用法,因为它允许您从其分支的提交中删除分支的提交#34;。 (我说&#34;父分支&#34;在引号中,因为这不是git的东西。它只是对分支拓扑的一种通用解释。)

但是你真的会想到A..B作为&#34;范围&#34;就像是

x1 -- A -- O1 -- O2 -- B <--(master)
                      /
              O3 -- O4

现在为什么O3O4不是x2x3?他们不在&#34;范围内&#34;从AB ......?好吧,它们无法从A到达,并且可以从B到达,因此它们都包含在内。要获得范围(您可能直观地理解它),您必须说出^A ^o4 B

之类的内容

答案 1 :(得分:3)

问题是关于使用git filter-branch的具体问题,但表达方式适用于许多Git命令。我喜欢在这里使用“选择历史”一词;它是git loggit rev-list以及使用 git rev-list的所有其他内容 - 包括git filter-branch - 工作。对于其他Git命令,写下单个提交的名称只选择单个提交本身,我们必须使用exclude..include语法或类似方法来获取整个提交范围:

git cherry-pick A..B
例如,

将在 A之后挑选提交,然后在之后提交提交,依此类推,直到它最终到达提交B。非常相似:

git revert A..B

将还原提交B,然后提交B之前的提交,然后提交之前的提交,依此类推,但停止并且还原提交A 。 (请注意,这假定了“AB之间的图形:”之间“的概念相当滑。”

Mark Adelsberger's answergit filter-branch的正确选项,对于任何使用“select commit with history”模式的Git命令。 [编辑:哎呀,从那时起,我看到他已经增加了他的答案!嗯,这现在更加补充了。]但是,当你想挑选提交git cherry-pick时,你可以做些什么,例如A

有一些明显的答案 - 嗯,“显而易见”一旦你掌握了提交图跟踪,并且Git提供的时髦语法操作提供了诸如A^之类的东西:

git cherry-pick A^..B

表示“选择提交B及其所有历史记录,不包括提交A^和所有历史记录”,因为A^表示“父提交A“,这通常可以解决问题。当然,您必须了解排除本身的工作方式:如果提交图中有合并,或者提交A不是提交B的祖先,则排除可能不会产生你想要什么。

尽管如此,有一些特别棘手的案例,其中一个时髦的Git语法派上用场。如果提交A本身就是合并提交,并且您想排除{em>所有A父母而不排除A本身,there is a syntax for that, documented in the gitrevisions(7) pageA^@表示“提交A的所有父级,但不提交A”。

A是根提交(没有父母)时,A^@是一组空提交,因此A^@..B完全不排除 - 这就是我们想要的! / p>

所以这意味着当使用双点范围语法时,如果你想包含提交A排除其父项,{{1}会做的。

答案 2 :(得分:0)

我的情况是,您似乎正在寻找一种指定--all的方法。

这是<rev-list options>的{​​{1}}部分:

git help filter-branch

<rev-list options>... Arguments for git rev-list. All positive refs included by these options are rewritten. You may also specify options such as --all, but you must use -- to separate them from the git filter-branch options. Implies the section called “Remap to ancestor”. 部分中的一些示例用法。

在您的情况下:

EXAMPLES