2012-12-20 22 views
3

我經常使用「fixup!」,「squash!」和「rebase -i」來清理,糾正,或只是擺弄最近的,沒有記錄的歷史。我想找到一種方法讓Git自動選擇哪種提交對交互式重新定義最有意義,這樣我就可以定義一個別名來執行快速交互式重新分頁。我該如何自動確定最佳承諾以交互重新分配?

我認爲最好的承諾在這種情況下將是最近的祖先之一:

  • 出現在任何其他分支機構(本地或遠程)
  • 有多個父
  • 沒有父母

第一個條件確保我不重寫可能影響他人的提交。第二個確保我不試圖通過合併來重新分配,這絕對不是我想要的。第三隻是一個健全的檢查。

所以問題是,我該如何使用Git查找提交?

回答

0

所以它不漂亮,但這是我想出的。

#! /bin/sh 

commit=$(git rev-parse HEAD) 

while [ "$(git log --format="%p" -1 $commit | wc -w)" -eq 1 ] \ 
     && [ "$(git branch --all --contains $commit | wc -l)" -eq 1 ] 
do 
    commit=$(git rev-parse "$commit^") 
done 

echo $commit 

我確信有一個更簡單,更強大的方法來完成這個,但它似乎做我想做的。建議和改進非常受歡迎。 (例如,只用Git管道而不是依靠wc這樣做會很好。)

1

不是你要找的東西,而是打電話給git rebase而沒有給出一個起點將會使rebase在上游分支開始,這在大多數情況下是一個完美的選擇。進一步重新激活會導致您重寫已發佈的歷史記錄,這絕不是一個好主意。

+0

好的提示,但我應該注意到這是Git 1.7.6中的新增功能。在1.7.0和1.7.5之間的版本中,你可以用'git rebase -i @ {upstream}'或者'git rebase -i @ {u}'做同樣的事情。 –