2017-06-21 66 views
2

當我遇到這種情況時,我似乎總是絆倒並且搞砸了git提交。我希望這次避開它。這是我的場景。我在我的公關中有以下4個提交:我該如何重新組織一次主合併到一個提交?

Commit 1: Remove unused routes for the projects controller 
Commit 2: Add PR request changes and modify similar_by_tags_route 
Commit 3: Merge Master and resolve git merge conflicts 
Commit 4: Reinsert rubocop disablement for project.rb 

我需要將這些提交重新綁定到一個提交中。現在我不能只做一個rebase -i HEAD~4因爲從主人麻煩合併。有沒有一種方法可以簡單地刪除提交3併合並提交1,2和4?我真的很想在這方面得到一些幫助,因爲在涉及到這樣的棘手問題時,我似乎總是弄得一團糟。

+0

轉到頭〜2,創建一個分支,櫻桃挑4,重訂HEAD〜3? –

+0

爲了避免出現這樣的問題,您應該在master上重新設置分支,而不是將master分支到該分支。 (如果您知道分支機構中的這些提交需要稍後進行合併,並且只針對您的非公共/共享分支) –

回答

1

你可以嘗試做你的分支的互動底墊,只是刪除包含合併提交行。運行git rebase -i HEAD~4應該彈出提交列表看起來像以下:

pick Commit 1: Remove unused routes for the projects controller 
pick Commit 2: Add PR request changes and modify similar_by_tags_route 
pick Commit 3: Merge Master and resolve git merge conflicts 
pick Commit 4: Reinsert rubocop disablement for project.rb 

刪除包含合併提交,留給你的行:

pick Commit 1: Remove unused routes for the projects controller 
pick Commit 2: Add PR request changes and modify similar_by_tags_route 
pick Commit 4: Reinsert rubocop disablement for project.rb 

現在改變第二和第四個承諾squash,通知Git這些提交合併爲單一的第一次提交:

pick Commit 1: Remove unused routes for the projects controller 
squash Commit 2: Add PR request changes and modify similar_by_tags_route 
squash Commit 4: Reinsert rubocop disablement for project.rb 

完成底墊,你應該留下你想要的東西。請注意,像這樣重新綁定意味着重寫分支的歷史記錄。因此,如果此分支由其他人公開分享,您應該採取預防措施。

+0

到目前爲止最好的方法。這真的有竅門。謝謝! –

0

假設您的4個提交在分支B1上,那就是用於創建PR的分支的名稱。

  1. 創建本地分支B2(等同於B1)
  2. 刪除本地分支B1
  3. 創建從原點/主本地分支B1
  4. 櫻桃拾取提交1,2,4(按順序)通過在B2中查看它們的散列到分支B1上。
  5. 壁球他們(交互式衍合)
  6. 力推B1原產
  7. 刪除本地分支B2
+0

爲什麼要創建新分支? – kuskmen

+0

因此,git引用了提交散列,你將櫻桃採摘到新的分支從原籍/主 – Manan

0

如果您還沒有被推到遠程但只是變基:git rebase -i HEAD~4然後pick第一次提交,drop第三個和squash其他人。

下面是一些例子我在控制檯那樣:

Example

注意,可用同樣的命令,也許你現在可以比你看到所有的人都選擇更合適的東西。

然而,如果你推到遠程我建議你剛剛恢復第三犯,離開別人是因爲底墊改寫歷史,可以是毀滅性對於已經退出你的提交,所以我寧願不玩歷史的人的混帳。

0

壁球幾個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 
相關問題