簡體   English   中英

git 自動將提交壓縮到更改相同文件的先前提交

[英]git automatically squash commits to previous commits that changed the same file/s

我有一個功能分支,其中包含涉及不同文件的交錯系列提交。 我想將涉及相同文件的提交壓縮在一起,但不將不相互接觸的一系列提交壓縮在一起。 我不想手動檢查每次提交的更改來確定這一點。

例如,如果有這些提交:

  1. 更改文件 A 和 B
  2. 更改 C
  3. 變化 A
  4. 更改 C
  5. 更改 C 和 D
  6. 更改 A 和 C

變基會自動

  • 壁球 3 到 1
  • 壁球 4 到 2
  • 不要將 5 壓到 2 上
  • 不要將 6 壓縮到 1 或 2 上(但稍后對 A 和/或 C 的更改會壓縮到 6 上)。

可能在此之后有一些破損-也許某些更改取決於單獨文件中的其他更改並且現在出現故障,但是如果我確實希望每個提交都可以工作,那么我需要檢查的提交和運行的測試更少(並且可能我最終會手動將所有內容壓縮在一起)。

此處是否需要解析已更改文件列表的精細腳本?

Git 吸收

git absorb是用於相關目的的 git 擴展。 它將暫存區域中的所有更改分發到先前的提交中。

例子

在問題中給出了以下示例。 我已經修改了它。

提交:

  1. 更改文件 A 和 B
  2. 更改 C
  3. 改變 D 和 A

接下來,您對 A、B、C 和 D 進行修改。

git add A B C D
git absorb --and-rebase
  • 對 A 的更改將移至第一次提交(或第三次提交,具體取決於確切的更改)。
  • 對 B 的更改將移至第一次提交。
  • 對 C 的更改 --> 第二次提交。
  • D --> 第三次提交。

更多鏈接

文檔: https://crates.io/crates/git-absorb
源代碼: https://github.com/tummychow/git-absorb

git rebase -i使這非常容易。

下面似乎有很多步驟,但這只是因為我正在詳細介紹它,以便您了解它的工作原理,並添加了一些安全步驟。

  1. 簽出您要在其上執行此操作的分支。

  2. [可選] git checkout -b <tmp-branch-name>在臨時分支上執行此工作。 這樣可以很容易地將重新排序和壓縮的分支與原始分支進行比較,以確保您沒有丟失任何更改。

  3. 確定要重新排序/壓縮的最早提交的級的引用。 在您給定的示例中head~6應該可以工作,但使用任何有效的參考,例如<hash><hash>^some-tag^

  4. `git rebase -i <第3步中的參考>

  5. 這將生成一個變基todo腳本(本質上是一個高級變基腳本)。 它將在您的編輯器中打開。 它將顯示自<the ref from step 3>以來的提交列表以及每個提交的默認命令( pick )。

  6. 按照文件中方便的說明重新排序提交並按您喜歡的方式壓縮它們。 您還可以選擇其他命令。

    (如果您不進行任何更改並讓git rebase按原樣運行文件,它將按該順序重播這些確切的提交——換句話說,與以前相同,不會有任何改變。)

  7. 關閉文件。 Git 將繼續執行todo腳本。

    “可能在此之后有一些破損-也許某些更改取決於單獨文件中的其他更改,現在出現故障”

    這將顯示為合並沖突。 變基過程將停止,因此您可以解決這些沖突。 每次rebase -i因任何原因停止時,它都會提供有關您需要做什么以及如何恢復腳本的有用信息。

    如果沒有沖突,腳本將通過提交繼續提交而不會停止。

    您可以在遇到問題時輕松中止。

    如果任何沖突給您帶來太多麻煩或有疑問,您可以使用git rebase --abort中止整個腳本並返回到您開始的確切位置。 因此沒有風險。

  8. 完成后,如果您執行了步驟 2,則可以git diff <orig branch> <tmp-branch-name>以確保沒有丟失任何更改。 如果一切正常,您可以git branch -f <orig branch> <tmp-branch-name>將您的原始分支指向新的提交歷史記錄。


git rebase -i幾乎是我最喜歡的 git 命令。 我值得成為這方面的專家。 git help rebase是一個很好的起點——閱讀關於-interactive rebases 的部分。 也可能有很多關於它的博客文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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