git是一個開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目。在開發過程當中,咱們常常會使用到 git 的 commit 命令,使用多了分支的歷史信息就會顯得雜亂無章,最後合併到主分支時會影響主分支歷史信息的優雅性。那麼這個狀況發生時咱們應該如何解決呢?git
接下來咱們看一下一些常見的場景:bash
本地已經提交過一次 commit,以後我又修改了內容,可是又不想再提交一次 commit 信息。分佈式
這種狀況可使用 git commit --amend, 這個命令來更改 commit 信息,把這一次的修改合併到該 commit 中,而後保存退出。這樣就達到了保存此次修改的所有內容,而且只提交了一個 commit 信息。ui
perfect !!spa
本地已經屢次 commit,可是顯得雜亂無章,想要把屢次 commit 合併成一次 commit 提交。3d
首先,使用 git log 查看歷史提交信息版本控制
這個場景介紹兩種方法解決code
方法一:git reset --softcdn
注意箭頭所指的地方是你要回退的版本的 commitidblog
經過 git status 能夠看到已經回退了,須要 git commit 保存該修改;經過 git log 能夠看到目前已經回退到第一次提交的版本。
方法二:git rebase -i
出現以下界面,紅色框內是操做區域,藍色框內是指令說明區域
指令說明
pick:意味着包括提交。從新進行命令時,從新安排pick命令的順序會更改提交的順序。若是選擇不包括提交,則應刪除整行。
reword:與類似pick,可是使用後,從新設置過程將暫停併爲您提供更改提交消息的機會。提交所作的任何更改均不受影響。
edit:將有機會修改提交,這意味着您能夠徹底添加或更改提交。您還能夠進行更多提交,而後再繼續進行變基。這使您能夠將大型提交拆分爲較小的提交,或者刪除在提交中所作的錯誤更改。
squash:該命令使您能夠將兩個或多個提交合併爲一個提交。提交被壓縮到其上方的提交中。Git使您有機會編寫描述這兩個更改的新提交消息。
fixup:這相似於squash,可是要合併的提交已丟棄其消息。提交僅合併到其上方的提交中,而且較早提交的消息用於描述這兩個更改。
exec:這使您能夠對提交運行任意的Shell命令。
複製代碼
perfect !!
git reset --soft commitid 和 git rebase -i 的區別:
git reset --soft commitid: 將代碼回退到某個版本,而後再進性一次提交,這個時候咱們能夠選擇上一個 commit 信息或者新建一個 commit。
git rebase -i: 只是合併 commit 沒有對代碼進性提交,並且 git rebase 能夠合併一個區間,好比我提交了6次,可是我想保留第一次和第六次,那麼咱們就可使用 git rebase -i [startpoint] [endpoint] 將中間的commit 信息合併,若是不指定就是開區間。
當咱們的代碼已經推到遠程倉庫後,這個時候咱們該怎麼辦呢?
遇到這樣的狀況也是能夠解決的,咱們能夠按照一二場景合併成咱們須要的 commit message 後,使用 git push -f 命令,這個命令能夠覆蓋掉以前提交的 commit message。可是不建議這樣作,有必定風險存在。若是隻是爲了好看的 commit 最終引起系統 bug,那也就得不償失了。