簡體   English   中英

我如何簡單地線性化我的git歷史?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM