[英]How do I trivially linearize my git history?
鑒於我有如下提交:
A - B - C - D - G - H
\ /
- E - F -
如何只跟隨父母一起獲得完美的線性歷史?
例如,我想得到:
A - B - C - D - G'- H'
如上所述,預計G和H的sha1將發生變化。 (原因很明顯)。 如果A,B,C和D的sha1也改變了,那么我想知道原因。
目的是避免在做一個天真的git rebase -i時可能出現的合並提交。
真正的重點是希望獲得額外的洞察力,以確定特定分支中的哪些提交,例如,如果我們有以下圖表:
I - J - K - L - M
\ / / /
- N - O - P -
其中N合並為K,但O與--strategy =我們合並為L,而P合並為M.
我希望能夠將我的歷史線性化,以便可以識別和檢查這些有問題的提交。 我希望有一個樹可以識別O沒有被放入上游分支,即使我可能通過使用git cherry識別上游分支中可能缺少N和P,但是這里的任何建議都將受到贊賞。
如您所說,以下命令有效:
git filter-branch --parent-filter 'cut -f 2,3 -d " "'
為什么?
通過使用簡單提交轉換每個合並提交來解決您提出的問題:這將簡單地刪除已合並的功能分支,因為它們將變為孤立。
每個提交都有一個或多個父提交。 合並提交是獲得多個提交的提交。 Git將它存儲在歷史記錄的每個提交對象中。
帶有--parent-filter
選項的git filter-branch
命令允許重寫每個提交的父級,作為-p SHA1
傳遞給過濾器,如果有多個父級則重復。 我們的過濾器會切斷父級並強制每次提交都有一個父級。
對於獎勵,這里是如何通過重新創建新提交在精確提交上手動執行:
獲取提交樹和第一個父級
tree=`git show -s --format=%T SHA1` parent=`git show -s --format=%P SHA1 | cut -d " " -f1`
使用相同的樹,相同的消息進行新的提交,並僅將第一個父級保留為祖先
git show -s --format=%B SHA1 | git commit-tree $tree -p $parent
手動執行以下操作:
git rebase -i D-sha1
編輯文件以將G設置為“編輯”。 保持並選擇H.保存並關閉編輯器。
現在Git允許你編輯G commit,讓我們將它修改為F commit的squash merge。 你想要:
#cancel the merge commit and position HEAD to D
git reset --hard HEAD~
#squash merge and continue
git merge --squash F-sha1
git rebase --continue
請注意,如果必須在第一次合並中,則必須解決相同的沖突...
正如你所說,你只有G和H的新SHA1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.