2015-06-14 70 views
4

我在master提交,我需要去下一個提交origin/mastergit日誌反向,然後將結果限制爲一個

git log --ancestry-path --date-order --reverse HEAD..origin/master 

或類似git rev-list命令給了我正確的提交,適當扭轉,所以我可以|head -n 1這一點,用它來完成。

但是,我不知道它可以通過使用一個進程(一個git invokation)來獲得它。首先限制-1的限制,然後反轉列表,這不是我所需要的。

如何做到這一點?

我知道DAG是什麼,我也知道足夠的圖論來理解爲什麼-1的行爲就像那樣。我在這裏問的不是理論問題,而是使用軟件開發中使用的工具的問題。

+0

看到沒有'--reverse',你可以做'| tail -n 1',但你的'只有一個進程'的規範排除了這一點。這似乎不必要的嚴格,但你的問題,你的規則。無論如何,你是否考慮過將'-1'和'--reverse'組合成一個bug來報告糟糕的行爲? – Novelocrat

+0

@Novelocrat我已經考慮過了,但那是在我閱讀郵件列表存檔之前。 – Flavius

回答

4

我90%確信這不能在單個Git調用中完成,原因有兩個。

  1. 這看起來並不像他們已經實現它。提交有指向他們的父母,而不是他們的孩子,這就是爲什麼--max-count-1)和--skip(我也試了一下)在--reverse之前運行。由於Git能夠在--reverse中打印或者不打印,因此以後運行-1應該在技術上是可行的,但是也許有一個根本原因並非如此。或者,他們也許會考慮它,並決定任何人都可以像你這樣做--reverse | head -n 1

  2. 更重要的是,即使使用--ancestry-path,您也不能保證是唯一的下一次提交,因此採摘--reverse -1不明確。以下是git-log docs中的--ancestry-path說明的示例,其中您的HEAD可能是承諾E。如果您對--date-order感到滿意,那更像是一個學術問題,但Git的DAG本質使得整個「下一個提交」概念不完善。

作爲一個例子使用的情況下,考慮下面的提交歷史:

D---E-------F 
/ \  \ 
    B---C---G---H---I---J 
/     \ 
A-------K---------------L--M 

定期D..M計算集是M的祖先提交的,但不包括那些是D的祖先。這是有用的,可以看到從D開始到M爲止的歷史中發生了什麼,也就是說「在D中不存在M是什麼」。這個例子中的結果將是所有的提交,除了A和B(當然還有D本身)。

當我們想知道M中提交的內容是否受到D引入的bug影響並需要修復時,我們可能只想查看實際上是D後代的D..M的子集,即排除C和K.這正是--ancestry-path選項所做的。應用於D ..M編號範圍,它會導致:

E-------F 
\  \ 
    G---H---I---J 
       \ 
       L--M 
+0

嗨,謝謝,不過(請參閱我的更新):「我知道DAG是什麼,我也知道足夠的圖論來理解爲什麼'-1'表現得像這樣,我在這裏問的不是理論問題,這是使用軟件開發中使用的工具的問題。「 +1然而努力。 – Flavius

+0

它仍然看起來沒有實現。如果有人發現,我會很高興。 –

0

這你想要做什麼:

git rev-list --children HEAD...origin/master^ | tail -2 | head -1 | cut -d" " -f 2- 

這甚至會打印傳單N孩子,如果在這一點上歷史叉。

你可以把它封裝到一個git別名中來創建一個命令。

其他的解決方案,也How do I find the next commit in git?

+0

這是4個過程。 – Flavius

+0

是@Flavius,它是。和一個git的調用。當變成別名時,這將是一個命令。 –

+0

@Flavius如果這不是解決方案,請解釋原因? –