壁球幾個Git修訂成一個單一的提交
本文演示瞭如何使用多個髒WIP合併一個醜陋的特性分支提交回主作爲一個漂亮的承諾。
簡易模式:重置您的特性分支到主狀態
把多次提交的特性分支最簡單的方式爲單一提交被重置在主功能分支修改並再次提交一切。
# Switch to the master branch and make sure you are up to date.
git checkout master
git fetch # this may be necessary (depending on your git config) to receive updates on origin/master
git pull
# Merge the feature branch into the master branch.
git merge feature_branch
# Reset the master branch to origin's state.
git reset origin/master
Git現在將所有更改視爲未分離的更改。
# We can add these changes as one commit.
# Adding . will also add untracked files.
git add --all
git commit
請注意,這根本不觸及特徵分支。如果要在稍後階段再次將功能分支合併到主設備中,則其所有提交將會重新出現在日誌中。
你也可以這樣做(將主體合併到分支並重置爲主狀態),但這會破壞您在功能分支中的提交,這意味着您無法將其推送到原點。
硬模式:壁球提交
這種方法比使用上述的get復位方法更難。如果您以前將主控合併到了功能分支中,它也不能正常工作(您需要再次解決所有衝突)。
我們在這裏描述的將會破壞提交歷史並可能出錯。出於這個原因,做擠壓在一個單獨的分支:
git checkout -b squashed_feature
這樣,如果你搞砸了,你可以回到你原來的分支,讓另一個分支的擠壓,然後再試一次。
壁球,因爲你支主客場的所有承諾,做
git rebase -i master
注意基礎重建到主如果合併主到您的特性分支,而你對新功能的工作不起作用。如果你這樣做了,你將需要找到原始的分支點,並用SHA1修訂版調用git rebase。
你的編輯器將文件打開像
pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
每一行代表一個承諾(按時間順序排列,最新的提交將在底部)。
轉換所有這些提交到一個單一的一個,該文件改成這樣:
pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
這意味着,你把第一次提交和壁球以下到它。如果你刪除一行,相應的提交實際上真的丟失了。不要打擾更改提交消息,因爲它們被忽略。保存壓縮設置後,編輯器會再次打開,要求提交壓縮提交的提交消息。
現在,您可以合併您的功能作爲一個單一的提交到主:
git checkout master
git merge squashed_feature
轉到頭〜2,創建一個分支,櫻桃挑4,重訂HEAD〜3? –
爲了避免出現這樣的問題,您應該在master上重新設置分支,而不是將master分支到該分支。 (如果您知道分支機構中的這些提交需要稍後進行合併,並且只針對您的非公共/共享分支) –