動機
假設我們有這些提交(最近提交在左側):
EFGHIJKLMN
我們想在另一個分支上發布 E,所以我們選擇了它,但是發生了沖突,我們發現我們也需要 J。我們采用 J 但仍然存在沖突,因此我們也采用 M,E 以不同于 J 的方式依賴它。然后它起作用了。我們在新分支上的歷史現在是:
EMJ
這里明顯的缺點是提交的順序與以前不同,將 EJM 視為嵌入在較長歷史中的功能。一種解決方案是按日期重新排序 git commit 歷史記錄。但是,在原始本地分支上重新定位活動可能意味著 J 實際上有一個在 M 之前的作者日期。在最壞的情況下,如果我們需要 KL(按這個順序,因為 K 取決于 L) 但 L 在 K 之后有一個作者日期。
一種解決方案是在遇到此問題時手動修改作者日期,但這不是這里的重點。
編輯:為什么更喜歡 EJM?
許多評論似乎都集中在動機上,因此也許值得擴展。
假設您在 MJ 上挑選 E 并且它不起作用(沖突)。現在您需要找到您丟失的提交,并將其挑選到正確的位置。如果是 L,則 LMJ 可能會在 JLM 沒有的情況下產生不必要的沖突。在實際示例中,有超過 50 次提交。
閱讀歷史中按照與現實中的順序相同的提交也容易得多,尤其是在幾個月的潛在不同專案中。如果新的 EMJ 分支將通過所有測驗(以及不產生沖突),您需要確保您沒有錯過 {F, G, H, I, K, L} 中的任何錯誤修復提交。保持提交有序可幫助您跟蹤已審核以包含哪些提交。
題
I'd like to check that before every push all commits are in author date order (at least relative to the last pushed commit). I'd probably put this in a pre-push hook. Is there a simple way to run this check? Perhaps it's hard if the branch doesn't have a remote yet?
It may also help to ensure the new author dates are all after the author date of the "last pushed commit" but perhaps that's a different question.
uj5u.com熱心網友回復:
我認為您需要決定新分支是什么。你說:
我們在新分支上的歷史現在...
那個新分支與另一個分支的關系是什么?它是一條永遠不應該再次合并的新的獨立開發線嗎?如果:
- 是的:那么誰在乎提交的順序是否與一些不相關的舊分支不同!
- 不:那為什么要選擇櫻桃呢?只需從另一個分支分支并“擁有一切”。無論如何,您將來都會再次合并,并且最好通過“重新定位”或“合并”原始分支來使其盡可能保持最新狀態。
提示:
- 恕我直言,最佳實踐將盡可能傾向于后一種合并選項,而不是挑選櫻桃。
- 如果您最終仍然選擇櫻桃,并且如果您將在存盤庫中長期使用新的不同提交 ID 以及源提交,我建議您使用
-x將原始提交 ID 附加到提交訊息的選項。這樣,當有人看到它時,更明顯的是它來自回購中其他地方的另一個提交,可能有不同的背景關系,如果他們愿意,他們可以去看看。
uj5u.com熱心網友回復:
只需重做新分支建設。一旦你找到了你需要挑選的所有提交以獲得你想要的結果,回去并按照你想要的順序挑選它們。
您為發現所有依賴項所做的作業:
git cherry-pick E
test test # fails
runaround checking # discover M
git cherry-pick M
test test test # fails again
runaround checking some more # discover J
git cherry-pick J
test test test # success
現在你知道你需要什么,但你的初稿歷史是雜亂無章的。所以做一個重寫和清理傳遞來制作你想要的可發布歷史:
git reset --hard E^
git cherry-pick M J E
并發布。
要檢測無序提交,
git log --first-parent --pretty=%H\ %at\ %as | sort -cnr -k2
那是“檢查第二個欄位(%at,自紀元以來的作者時間戳)是否以相反的數字順序排列”。
許多專案使用每個功能的分支歷史記錄來保存您所追求的記錄,僅當它們具有可展示的、可發布的歷史記錄時才合并功能。通過這種方式,Git 已經保存、發布并自動使用您當前管理的記錄以及難以訪問的邊帶筆記,并且您的問題顯示了向團隊成員和 Git 隱藏您的歷史真實結構的成本。
uj5u.com熱心網友回復:
這種方法需要bash行程替換:
#!/bin/bash
diff_ord=$(diff <(git log --format='%H %at' HEAD --not --remotes | sort -k2 -rn | cut -d" " -f1) \
<(git log --format='%H' HEAD --not --remotes))
if [ -n "$diff_ord" ] ; then
echo "Author timestamps not in commit dependency order:"
echo "$diff_ord"
exit 1
fi
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/435173.html
