我在本地存儲庫上有一堆提交,它們在主題上相似。我想在推送到遠程之前將它們合併爲一個提交。我該怎麼做?我認爲rebase
這樣做,但我無法理解文檔。在推送Git之前合併多個提交
回答
你想做的事情在git中被稱爲「擠壓」。有很多時候你做這個(太多?)的選擇,但如果你只是希望將所有unpushed提交合併爲單一提交,這樣做:
git rebase -i origin/master
這將使你的文本編輯器(-i
是 「互動」),看起來像這樣的文件:
pick 16b5fcc Code in, tests not passing
pick c964dea Getting closer
pick 06cf8ee Something changed
pick 396b4a3 Tests pass
pick 9be7fdb Better comments
pick 7dba9cb All done
改變所有的pick
到squash
(或s
)除了第一個:
pick 16b5fcc Code in, tests not passing
squash c964dea Getting closer
squash 06cf8ee Something changed
squash 396b4a3 Tests pass
squash 9be7fdb Better comments
squash 7dba9cb All done
保存您的文件並退出編輯器。然後將打開另一個文本編輯器,讓您將來自所有提交的提交消息合併爲一個大提交消息。
瞧!谷歌搜索「混帳擠壓」會給你所有其他可用選項的解釋。
您可能想要使用Interactive Rebasing,這在該鏈接中有詳細描述。
如果您搜索「git rebase interactive」,您可以找到其他好的資源。
你可以用git rebase -i
做到這一點,傳遞您要的「根」要使用的修訂:
git rebase -i origin/master
將打開,顯示所有你在最後進行的提交的編輯器窗口提交在origin/master
。您可以拒絕提交,壓縮提交到單個提交中,或編輯以前的提交。
有跡象表明,也許可以以更好的方式解釋,並展示一些其他的例子少的資源:
http://book.git-scm.com/4_interactive_rebasing.html
和
http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html
是前兩個好頁面我能找到。
如果你有很多提交的,你只需要壓扁最後X承諾,找到您要開始擠壓並做
git rebase -i <that_commit_id>
然後描述進行的提交的提交ID在leopd的回答中,將所有pick
s更改爲squash
es,但第一個除外。
我花了一些時間才弄清楚,但似乎
它應該說:「找到提交的提交ID就在你想壓縮爲一組提交之前」。 – BenjaminBallard
我想出了
#!/bin/sh
message=`git log --format=%B origin..HEAD | sort | uniq | grep -v '^$'`
git reset --soft origin
git commit -m "$message"
聯合收割機,排序,結合並從提交信息的空行。我使用它來對github wiki進行本地更改(使用gollum)
這確實是一個非常聰明的主意! – zatziky
出於某種原因(也許這是我的配置或我使用GIT的方式),origin..HEAD給了我一個模糊的參數錯誤。爲了確保它總是從當前分支的頭部獲取差異,我需要將第一行與'git log'一起調整爲這個'git fetch && git log --format =%B FETCH_HEAD..HEAD' [... ] 首先確保GIT具有所需的最新知識,並創建一個我們可以使用的FETCH_HEAD參考。 –
而我的squashing
方式多個push
是(也許是你推送到你自己的分支許多提交,現在你希望做一個pull請求,你不想用許多你已經推送的提交混淆它們)。我這樣做的方式(據我所知,沒有其他更簡單的選項)。
- 爲了
squash
(從您希望提出請求的原始分支分支)創建新分支。 - 推送新創建的分支。
- 合併與提交(已推)到新分支的分支。
- 重新建立新的分支和壁球。
- 推新分支。
- 爲現在具有單個提交的新分支創建新的請求。
例子:
git checkout from_branch_you_wish_to_pull_request_to
git checkout -b new_branch_will_have_single_squashed_commit
git push -u new_branch_will_have_single_squashed_commit
git merge older_branch_with_all_those_multiple_commits
git rebase -i (here you squash)
git push origin new_branch_will_have_single_squashed_commit
您現在可以拉請求轉換成from_branch_you_wish_to_pull_request_to
有相當多的工作答案在這裏,但我發現這個最簡單的。此命令將打開一個編輯器,在這裏你可以與squash
爲了消除只需更換pick
/將它們合併成一個
git rebase -i HEAD~4
其中,4
是要擠進一個提交的數目。這也解釋爲here。
- 1. 在推送之前將多個提交合併爲一個
- 2. Git在合併之前合併提交
- 3. git提交併推送本地git文件夾,無需合併
- 4. 推之前多次提交
- 5. Git可以在提交或推送和部署之前在一個文件上進行多個提交嗎?
- 6. 在提交到當前頭之前合併Git狀態
- 7. git恢復到多個提交之前已經推動
- 8. Git服務器在推送合併提交時發出警告
- 9. Git推送並提交遠程混淆?
- 10. Git回滾到之前未被推送的提交
- 11. 無法推送git提交
- 12. Git刪除推送提交
- 13. Git提交/推送TeamCity
- 14. git顯示前幾個提交回合併基的提交
- 15. Git - 將未提交的更改推送到以前的提交
- 16. Git反向提交SourceTree中的推送合併
- 17. Git合併我已經推送到遠程原點的提交
- 18. 在提交之前合併$ _GET變量
- 19. git只推送一個分支提交
- 20. 讓git永不推送單個提交?
- 21. Git - 推送新提交併忽略未提交的更改
- 22. git提交併推入IntelliJ
- 23. git撤消合併提交另一個合併提交
- 24. 在git中推送不同的提交
- 25. TFG/Git取消合併衝突導致之前提交失敗
- 26. 在本地合併之後恢復到之前在git中的提交
- 27. 做一個git提交併推送本地文件嗎?
- 28. git:推送單個提交,重新排序,重複提交
- 29. git我在提交和推送前忘了編輯一行
- 30. Git:在提交/推送前通過過濾器運行?
有關重新綁定/擠壓任意數量的提交,請參閱[我的回答爲「壓縮/合併/重新綁定任意數量的提交」](http://stackoverflow.com/a/22161885/456814)。 – 2014-04-22 20:35:30
相關[如何使用git來壓縮最後一個X提交的內容?](http://stackoverflow.com/q/5189560/456814)。 – 2014-06-06 08:06:31