maybe yes 發表於2015-03-15 22:43php
原文連接 : http://blog.lmlphp.com/archives/88/The_use_tutorial_of_git_rebase_to_merge_multiple_commits_as_a_submit 來自 : LMLPHP後院mysql
對於版本控制系統 GIT ,一直沒有深刻研究,只是從平常使用方面入手,能解決日常使用出現的問題就能夠了。GIT 的版本控制,有三種後悔方式:reset、revert 和 rebase,本文主要講述 rebase 的使用。git
使用場景:當在新分支中開發一個新功能的過程當中,開發期間涉及的文件數比較多,提交的次數也很是多,同時整個提交的過程很是的複雜,在最後合併的時候,須要移除某些修改的文件而且將提交次數整理爲一次 commit。sql
使用下面的命令,顯示全部提交記錄,找出第一次 {commit} 的前一個 {commit} 的哈希值並複製。shell
git log --pretty=oneline
使用 rebase 命令加上 -i 參數,合併提交到指定位置,以下示例。this
git rebase -i f7d0bd75c8dabe127d8cbd2c1d70ff188ff83392
運行後,進入 VIM 模式,除第一個 pick 外,其他的所有修改爲 squash,也能夠縮寫爲 s,以下示例。spa
pick 4f11983 add update method in mysql driver class; squash aa8576a add attachEvent method squash e6e8db4 modify default_theme_name constant name squash f7d0bd7 fix method logPre; # Rebase 6a2eb6d..f7d0bd7 onto 6a2eb6d # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
接下來,使用 :wq 保存確認後,會進入編輯 comment 模式下,此處只須要將多個提交的 comments 進行編輯,而後 :wq 保存便可。一般狀況下,只要恢復到了第一次提交,就不會出現衝突。若 GIT 在 rebase 的過程當中產生衝突,會進入一個臨時分支,只須要將該分支中被修改的文件編輯後提交,使用 git rebase --continue 完成 rebase 的過程,或者使用 git rebase --abort 取消操做。最後 push 的時候須要加上參數 -f,不然不能推送到遠程庫。版本控制
若是提交了不少次之後,並不想擦除提交記錄,只想將部分須要移除的文件內容恢復到建立分支前的狀態,可使用 checkout 命令,指定某個 commit 和某個文件。內容恢復後,再進行一次提交便可,團隊人數不多的時候,能夠這樣作,若是項目開發成員比較多,爲避免提交紀錄太亂,rebase 仍是最好的方案。rest