2010-08-08 62 views
1

我正在寫一個腳本,做一些微小的更改,然後將它們提交給git。因爲這些都是微不足道的變化,所以只要我能夠避開它,我就會想要做git commit --amend--具體來說,當修改不會「弄亂」任何其他分支機構的歷史時。如果一個修改會搞亂另一個分支,我想要做一個標準的git commit如何檢測git提交是否是其他提交的父代?

例如,如果我的樹枝看上去像這樣(一拉「可視化的所有分支歷史」 Git中GUI):

* [experimental branch] Added feature. 
* [master branch] Trivial change from script 
* ... 

,我在主分支運行此腳本,然後我不我不想做一個修改,因爲我會取代實驗分支的一部分歷史。從技術上講,這並不會破壞任何東西 - 最初的提交仍然是實驗歷史的一部分,並且仍然會被引用,因此它不會被垃圾回收 - 但幾乎不完全相同的提交兩個不同的分支會讓我後來想要重新組合或合併時遇到困難,所以這是我想避免的情況。

如何讓腳本自動檢測提交是否有任何分支?

如果簡化的假設有所幫助,我總是在master的頭上運行這個腳本,並且我只使用git作爲本地存儲庫 - 我不會在任何地方推送或拖動更改。

這個腳本是在Ruby中的,所以我可以通過shell來執行git命令行,或者我可以使用Ruby綁定來執行git - 無論哪種方式都可以讓這個任務變得更容易。

回答

11

只需運行git branch --contains HEAD即可獲取「包含」此提交的分支列表。如果列表爲空,則該提交對於修改應該是安全的。您也可能希望包含-a標誌以列出本地AND遠程分支。

或者,您可以將git rev-parse HEAD的輸出與git merge-base HEAD other-branch進行比較。如果這些提交ID相同,則當前提交在其他分支的提交歷史記錄中。

+0

您的第一個建議看起來非常適合我需要的東西。看起來我甚至可以做'git tag --contains HEAD'來爲標籤做同樣的事情。 – 2010-08-08 18:19:46

3

提交圖是單向的:給定一個提交,你知道它的所有祖先,但不知道它的任何子代。您必須從端點開始並回溯,直到找到所需的提交。

使用git rev-list [some commit] --children(HEAD是默認值):

$ git rev-list HEAD --children 
6edbee61c87fb063700751815f0ad53907d0b7a4 
aee452860ecd772b8bdcd27227e6a72e6f4435fd 6edbee61c87fb063700751815f0ad53907d0b7a4 
ef8a1487b03256a489d135e76d1f0b01872f2349 aee452860ecd772b8bdcd27227e6a72e6f4435fd 
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349 
bbef0da56efe048f70293bd20bad0cb37b5e84f0 6910dc5833f6cd26133e32bef40ed54cf9337017 
[...] 

左手列是在相反的時間順序提交SHA-1的列表。該提交權限的任何內容都是該提交的子項(--children)。最上面的提交是HEAD,因此沒有孩子。

因此,如果你用grep你SHA-1在此列表中,它有什麼權利的,它至少有一個孩子:

$ git rev-list --children | grep '^6910' 
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349 

在上面的例子中,提交6910...有一個孩子, ef8a...

相關問題