Git提交歷史的修改刪除合并等實踐(轉(zhuǎn))
今天主要針對在項目版本控制器Git的使用中遇到的一些和提交歷史操作相關(guān)的常見問題器钟,進(jìn)行實踐總結(jié)降盹。在項目開發(fā)中經(jīng)常會需要修改提交commit信息,合并多個提交commit打掘,甚至放棄當(dāng)前修改回退至某一歷史提交的需求菱农,那我們到底該如何操作呢,本篇一一闡述拆火。
前言
假如,當(dāng)前我們處在需求分支feature-test,進(jìn)行了多次提及们镜,git log查看commit信息如下:
每一個提交的commit都是獨立的币叹,但是最近三個commit都是相關(guān)的,都是添加read.txt文件內(nèi)容憎账,在本文中以此為實例依次介紹如何修改套硼,合并卡辰,回退commit的胞皱。
查看git歷史
如果要查看git歷史可以使用git log或git reflog指令:
git log:查看當(dāng)前分支的存在提交歷史記錄,不包括諸如刪除的或被合并的提交九妈;
git reflog:查看當(dāng)前分支所有操作歷史反砌,諸如歷史提交記錄,撤銷萌朱,合并提交等詳細(xì)歷史記錄宴树;
git rebase -i
需要用到的指令是git rebase -i commitHash,commitHash是commitID晶疼,是需要合并的commit的前一個commit節(jié)點的ID酒贬,對于本文實例中而言,是最近第四個提交df11bf944翠霍,所以執(zhí)行如下指令:
gitrebase -i df11bf944
命令行終端會輸出如下內(nèi)容:
由遠(yuǎn)及近列出了我們期望處理的三個提交锭吨,前面pick代表的默認(rèn)使用該提交commit,我們現(xiàn)在可以按i進(jìn)入編輯模式寒匙,修改該字段值零如,值可以如圖中描述,經(jīng)常使用的如下:
pick:簡寫p锄弱,啟用該commit考蕾;
reword:簡寫r,使用該commit会宪,但是修改提交信息肖卧,修改后可以繼續(xù)編輯后面的提交信息;
edit:簡寫e掸鹅,使用commit塞帐,停止合并該commit;
squash:簡寫s河劝,使用該commit壁榕,并將該commit并入前一commit;
drop:簡寫d赎瞎,移除該commit牌里;
修改提交信息
我們現(xiàn)在嘗試修改最近一次的提交commit信息,將其前面pick修改成reword:
編輯后,按esc鍵退出編輯模式牡辽,然后輸入:wq喳篇,保存當(dāng)前編輯,會輸出如下內(nèi)容:
我們可以開始編輯我們需要修改的commit信息了态辛,按i鍵進(jìn)入編輯模式麸澜,修改提交信息為:
feature(read.txt) 添加read.txt第三行(reword修改commitmessage)
保存退出后會有修改成功提示:
合并歷史提交
前面修改commit成功,如果期望將多個提交合并成一個提交奏黑,使得整個提交歷史更干凈炊邦,如何處理呢?
執(zhí)行如下指令熟史,df11bf944是需要合并的提交的前一個提交節(jié)點的commitID:
gitrebase -i df11bf944
然后修改pick值為squash:
保存退出馁害,會進(jìn)入最終合并提交commit信息編輯狀態(tài),在這里會列出合并commit的所有message蹂匹,我們可以操作:
我們可以同時保留三次的提交信息碘菜,也可以任意修改,此處我們只保留第一個提交的信息限寞,然后保存退出忍啸,當(dāng)我們再次使用git log查看歷史提交信息時,就會發(fā)現(xiàn)只剩下合并后的一個提交及之前未操作的提交:
git rebase -i head~{num}
前面提到的git rebase -i commitHash指令可以合并提交歷史履植,其實還可以換成一種快捷方式计雌,如當(dāng)需要合并最近兩個提交時,執(zhí)行:
gitrebase -i head~2
效果一樣:
后續(xù)修改静尼,合并白粉,回退操作均一致。
撤銷提交
當(dāng)需求發(fā)現(xiàn)變更鼠渺,我們發(fā)現(xiàn)不需要某一歷史提交時鸭巴,怎么辦呢,怎么放棄該修改提交拦盹?這也分兩種情況:
歷史提交中間某提交的撤銷鹃祖;
最近提交的撤銷;
撤銷中間提交
當(dāng)需要放棄的提交被合并后普舆,我們想放棄該提交恬口,需要先查看該提交的信息使用,執(zhí)行指令:
gitreflog
該指令輸出詳細(xì)的操作歷史沼侣,包括提交祖能,操作,修改等:
我們找到需要撤銷的提交蛾洛,如最近第二個提交,提交commitId為dcbdde2养铸,索引為HEAD@{19}:
dcbdde2HEAD@{19}:commit:feature(read.txt): 添加read.txt第二行
GIT REVERT
執(zhí)行以下指令撤銷該commit:
gitreverthead@{19}
上面head@{19}指令也等效于:
gitrevert dcbdde2
git revert撤銷一個提交的同時會創(chuàng)建一個新的提交雁芙。這是一個安全的方法,因為它不會重寫提交歷史钞螟。它會創(chuàng)建一個新的提交來撤銷指定更改兔甘,然后把新提交加入至項目中。
撤銷提交時若多個提交修改了同一文件可能會出現(xiàn)沖突鳞滨,需要處理沖突后洞焙,暫存:
gitadd.
然后繼續(xù)執(zhí)行revert操作:
git revert --continue
然后查看提交歷史,發(fā)現(xiàn)多了一個記錄:
此時已經(jīng)撤銷了之前最近第二次提交的內(nèi)容(即撤銷了read.txt文件第二行)拯啦。
撤銷最近提交
如果期望撤銷的提交是最近獨立存在的澡匪,并沒有發(fā)生合并,以撤銷上一節(jié)git revert新生成的提交為例:
5a7b985 Revert"feature(read.txt): 添加read.txt第二行"df11bf9 commit:"feat(RN-publish-up): React Native發(fā)布提岔,熱更新原理介紹"
GIT RESET
只需要使用git reset指令:
gitresetcommitHash /head~{num}
commitHash是期望撤銷提交的上一次提交的commitID仙蛉,等效于指定期望撤銷最近幾次提交笋敞,num值等于期望撤銷提交數(shù)碱蒙。
具體提交的commitID可以使用git log或git reflog指令查找,刪除執(zhí)行指令:
gitresethead~1
等效于夯巷,df11bf9是需要撤銷提交commit的上一次提交commitID:
gitresetdf11bf9
最后會發(fā)現(xiàn)提交內(nèi)容變成未提交赛惩,使用git checkout.指令撤銷變更就行:
轉(zhuǎn)載自?熊建剛的博客