前言
Git rebase 是git的一個(gè)附加的核心功能渣磷,用于編輯提交歷史向楼。git不像有的版本控制工具對(duì)待提交歷史那么苛刻,在git中师抄,我們可以根據(jù)我們的需要更改提交歷史漓柑。這給了我們一個(gè)強(qiáng)有力的工具使得我們可以像進(jìn)行重構(gòu)來(lái)維護(hù)良好的軟件設(shè)計(jì)實(shí)踐一樣去 組織出一個(gè)非常棒的提交歷史。這些功能可能會(huì)嚇到一些新手叨吮,甚至也嚇到一些git中級(jí)用戶(hù)辆布,但是這篇教程將幫助你剝?nèi)it rebase 這個(gè)強(qiáng)有力的工具的面紗。
提醒
一般情況下茶鉴,我們不建議更改公共锋玲,共享,或者標(biāo)準(zhǔn)分支的提交歷史涵叮。你可以修改一些功能性分支的歷史惭蹂,或者一些個(gè)人倉(cāng)庫(kù)的副本的歷史,還可以更改一些你還沒(méi)有推送到遠(yuǎn)程倉(cāng)庫(kù)的提交歷史割粮。在更改你的提交歷史之后盾碗,你可以使用git push -f 強(qiáng)制推送你的更改到一個(gè)個(gè)人倉(cāng)庫(kù)副本或者一些功能性分支上。
盡管有這個(gè)可怕的提醒舀瓢,但是我們還要說(shuō)明的是:在這個(gè)教程中提交的任何操作都是非毀滅性的操作廷雅。事實(shí)上,在git中丟失數(shù)據(jù)是非常難的京髓。在本教程的末尾會(huì)介紹一些當(dāng)你犯錯(cuò)誤的時(shí)候的補(bǔ)救方法航缀。
小廣告
在你眼前的這篇教程由sourcehut提供,我們是一個(gè)非常牛逼的黑客鍛造器(說(shuō)白了就是能幫助程序員成長(zhǎng)朵锣。谬盐。。)百分之百開(kāi)源的Git或者M(jìn)ercurial(也是一個(gè)版本控制工具)主機(jī)诚些,持續(xù)集成飞傀,郵件列表我們都提供。而且不需要JavaScript~
創(chuàng)建沙箱環(huán)境
我們不希望把你的真實(shí)項(xiàng)目搞亂诬烹,所以這個(gè)教程從頭到尾都會(huì)在一個(gè)沙箱倉(cāng)庫(kù)中運(yùn)行砸烦,運(yùn)行下面的命令創(chuàng)建一個(gè)沙箱環(huán)境~
git init /tmp/rebase-sandbox
cd /tmp/rebase-sandbox
#為了簡(jiǎn)化教程的其余部分,我們添加了一個(gè)空的提交绞吁,因?yàn)槿绻猺ebase到你的倉(cāng)庫(kù)的一個(gè)初始提交的話幢痘,我們需要一個(gè)特殊的命令,也就是git rebase --root
git commit --allow-empty -m "Initial commit"
如果你不小心寫(xiě)錯(cuò)了家破,直接rm -rf /tmp/rebase-sandbox重新開(kāi)始就行颜说。這個(gè)教程中所有的步驟都可以在一個(gè)新的沙箱環(huán)境中運(yùn)行购岗,所以不用重新把每個(gè)任務(wù)都做一遍。
目錄
- 修改你的最后一次提交
修改你的最后一次提交
讓我們以一些例子開(kāi)始吧:修復(fù)你最近的一次提交门粪。讓我們添加一個(gè)文件到沙箱環(huán)境的git倉(cāng)庫(kù)喊积,然后故意去制造一些錯(cuò)誤。
echo "Hello wrold!" >greeting.txt
git add greeting.txt
git commit -m"Add greeting.txt"
修復(fù)這個(gè)錯(cuò)誤很簡(jiǎn)單玄妈,我們只需要編輯這個(gè)文件文件然后以--amend提交乾吻,如下所示:
echo "Hello world!" >greeting.txt
git commit -a --amend
保存退出你的編輯器(在這你有一個(gè)機(jī)會(huì)可以更改提交的信息),你可以通過(guò)運(yùn)行g(shù)it show命令去查看修復(fù)過(guò)后的提交拟蜻。
commit f5f19fbf6d35b2db37dcac3a55289ff9602e4d00 (HEAD -> master)
Author: Drew DeVault
Date: Sun Apr 28 11:09:47 2019 -0400
Add greeting.txt
diff --git a/greeting.txt b/greeting.txt
new file mode 100644
index 0000000..cd08755
--- /dev/null
+++ b/greeting.txt
@@ -0,0 +1 @@
+Hello world!
-a選項(xiàng)的解釋
使用git commit的-a選項(xiàng)可以自動(dòng)添加已經(jīng)被建立索引的文件的變更(如果該文件是你新加入項(xiàng)目的绎签,并沒(méi)有被git建立索引的話,該文件是不受影響的)到暫存區(qū)酝锅,或者自動(dòng)刪除已經(jīng)被移除索引的文件诡必,然后進(jìn)行真正的提交。
--amend選項(xiàng)的解釋
使用該選項(xiàng)可以將本次提交塞入到最近一次提交中屈张。在git commit document中的解釋是使用該選項(xiàng)會(huì)通過(guò)創(chuàng)建一個(gè)新的提交記錄替換掉最近一次的提交擒权,如果沒(méi)有通過(guò)-m,-F,-C等選項(xiàng)指定提交的message,那么原來(lái)的message將被用于本次提交阁谆,這個(gè)新創(chuàng)建的提交和當(dāng)前的提交具有相同的父節(jié)點(diǎn)相同的作者碳抄。