2017-08-15 43 views
1

我需要指定git倉庫第一次提交的下游提交。如何選擇包含端點的git落實範圍

我試圖運行這個命令:

$ 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>...]' 

因爲33e0331是在回購協議的第一次提交。我該怎麼做呢 ?

回答

2

只是不指定起點。例如,如果您說master,那意味着「從master到達的所有內容」。包含起點的能力僅僅是指定一些「早期歷史」來排除。

雖然這應該解決您提出的情況,但對標題問題的更一般的答案是:您不能。你根本不需要指定「提交範圍」(大多數人會直覺地定義它)。

範圍表示法很方便,但可能會產生誤導。在非平凡的情況下,記住可以指定(a)應該排除可以從提交中訪問的所有內容,或者(b)應該包含來自提交的可訪問的內容。每種都有多種符號。 A..B的意思是「排除可從A到達的所有東西,但不包括從B到達的所有東西」;它是像^A B的簡寫(和,有趣的是,它實際上不是短...)

現在,在一個簡單的例子,看起來像一個範圍的提交

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

在這種簡單的情況下,您可以嘗試使用「父母」符號使其成爲「包含範圍」(^A^ BA^..B)。

如果A是根,如在例如:

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

仍然A..B是指包括所述O S和B。對於「包容性」範圍,您只需以我的答案的原始形式省略起點。 B將包括AOB

你可以舒展你的 「範圍」 一點點的定義:

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

這裏,A..B(再次,只是^A B)將再次只包括O S和B。這似乎是「起點」不是B上游,但您排除一切A到達,其中包括x小號

所以,現在,什麼會是「包容性範圍」,甚至是什麼意思?

這是..表示法的常用用法,因爲它允許您從遠離「父分支」提交的分支剝離提交。 (我在引號中說「父分支」,因爲這不是一件混亂的事情,它只是對分支拓撲結構的常見解釋。)

但是,如果你真的想到了將A..B想象成「範圍」是一樣的東西

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

現在爲什麼是O3O4x2和?他們不在從AB ......的「範圍」中?那麼他們無法從A到達,他們可以從B到達,所以他們都包括在內。要得到範圍(你可能直覺地理解它),你將不得不說^A ^o4 B

+0

「現在爲什麼O3和O4不是X2和X3?」 x2 x3不在您的圖表中。你也可以請你修復你的句子嗎? A..B應該包括01和02而不是03和04,因爲01和02不能從A到達但是可以從B到達。由於03和04不能從A和B到達,因爲它們都在A和B的下游。對 ? – abc

2

這個問題特別是關於使用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正確的,並且確實使用了「選擇任何的Git命令提交歷史「模式。 [編輯:哎呀,我知道他從那時起就擴大了他的答案!那麼,現在這個補充就更多了。]但是當你想挑選提交A的時候,你可以做些什麼,例如git cherry-pick

有幾個明顯的答案井,「顯而易見」的,一旦你掌握了提交 - 圖形的下面擺在首位,和時髦的句法操作Git的事情提供了像A^

git cherry-pick A^..B 

手段「選擇提交B及其所有歷史記錄,不包括承諾A^和全部歷史記錄「,並且因爲A^表示」父承諾A「,所以通常會執行此操作。當然,您必須意識到排除本身的工作方式:如果在提交圖表中存在合併,或者提交A不是提交B的祖先,則排除可能不會產生您想要的內容。

儘管如此,有一些特別棘手的情況下,一個時髦的Git語法派上用場。如果提交A本身就是一個合併提交,並要排除所有A的父母不排除A本身,there is a syntax for that, documented in the gitrevisions(7) pageA^@的意思是‘犯A所有的父母,但不承諾A本身’。

A是一個根提交(沒有父母)時,A^@是一個空的提交集合,所以A^@..B什麼也不排除 - 這就是我們想要的!

因此,這意味着使用,當雙點範圍的語法,如果你想包括提交A排除其父母,A^@..B將做到這一點。