我需要在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中的第一个提交。我该怎么做?
答案 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^ B
或A^..B
)。
如果A
是根,例如:
A -- O1 -- O2 -- B -- x1 -- x2
仍然A..B
表示包含O
和B
。对于&#34;包容性&#34;范围,您只需省略我的答案的原始形式的起点。 B
将包括A
,O
和B
。
你可以扩展你的定义&#34;范围&#34;一点点:
x1 -- x2 -- A
\
O1 -- O2 -- B
此处,A..B
(再次只是^A B
)将仅包含O
和B
。这似乎是&#34;起点&#34;不在B
的上游,但是您排除 A
可以访问的所有内容,其中包含x
s
所以现在,&#34;包容范围&#34;甚至意味着什么?
这是..
表示法的常见用法,因为它允许您从其分支的提交中删除分支的提交#34;。 (我说&#34;父分支&#34;在引号中,因为这不是git的东西。它只是对分支拓扑的一种通用解释。)
但是你真的会想到A..B
作为&#34;范围&#34;就像是
x1 -- A -- O1 -- O2 -- B <--(master)
/
O3 -- O4
现在为什么O3
和O4
不是x2
和x3
?他们不在&#34;范围内&#34;从A
到B
......?好吧,它们无法从A
到达,并且可以从B
到达,因此它们都包含在内。要获得范围(您可能直观地理解它),您必须说出^A ^o4 B
答案 1 :(得分:3)
问题是关于使用git filter-branch
的具体问题,但表达方式适用于许多Git命令。我喜欢在这里使用“选择历史”一词;它是git log
和git 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
。 (请注意,这假定了“A
和B
之间的图形:”之间“的概念相当滑。”
Mark Adelsberger's answer是git 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) page: A^@
表示“提交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