丨玩轉git五種提高代碼提交原子性的基本操作_第1頁
丨玩轉git五種提高代碼提交原子性的基本操作_第2頁
丨玩轉git五種提高代碼提交原子性的基本操作_第3頁
丨玩轉git五種提高代碼提交原子性的基本操作_第4頁
丨玩轉git五種提高代碼提交原子性的基本操作_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

幫你學習到Git我在第21篇文章中提到,代碼提交的原子性指的是,一個提交包含一個不可分割的特性、修復或者優(yōu)化。如果用一個提交完成一個功能,這個提交還是會比較大的話,我們需要把這個功能再拆分為子功能。為什么要強調(diào)代碼提交的原子性呢?這是因為它有以下3大好處:origin/master而GitGit下面,我就來與你Git支持原子性的5種基礎操作,具體包括于Git的一些基礎概念和使用方法,推薦你參考“圖解Git”這篇文章。如果是把整個文件添加到提交中,操作很簡單:先用gitadd<文件名>把需要的文件添加到Git暫存區(qū),然后使用gitcommit命令提交即可。這個操作比較常見,我們應該都比里的一部分改動添加到提交中,剩下的部分暫時不產(chǎn)生提交。針對這個需求,Git提供了gitadd-p命令。##>gitdiff--gita/index.jsindex63b6300..986fcd8---6+++7@@-1,8+1,14+varport=3000varexpress=varapp=##vvv添加+app.get('/timestamp',function(req,res)14+res.send(''+1516app.get('/',function(req,res)res.send('o 21-22+//Startthe23+app.listen(port)##<--這時,運行gitadd-pindex.js命令,Git會把文件改動分塊兒顯示,并提供操作選項,比如我可以通過y和n指令來選擇是否把當前改動添加到Gits的改動添加到Git的暫存區(qū)中。>gitadd-pdiff--gita/index.jsindex63b6300..986fcd8---5+++6@@-1,8+1,147port=8express=9app=+app.get('/timestamp',function(req,res)12+res.send(''+1314app.get('/',function(req,res)res.send('o -+//StarttheStagethishunk[y,n,q,a,d,s,e,?]?Splitinto3@@-1,3+1,4+varport=varexpress=varapp=Stagethishunk[y,n,q,a,d,j,J,g,/,e,?]?@@-1,7+2,11varexpress=varapp=+app.get('/timestamp',function(req,{+res.send(''++app.get('/',function(req,res)res.send('o42Stagethishunk[y,n,q,a,d,K,j,J,g,/,e,?]?43@@-4,5+9,6 app.get('/',function(req,res) res.send('o 48-49+//Startthe5051Stagethishunk[y,n,q,a,d,K,g,/,e,?]?gitdiffcached>gitdiff--diff--gita/index.jsindex63b6300..7b82693---5+++6@@-1,3+1,47port=8express=9app=11@@-5,4+6,5@@app.get('/',function(req,res)res.send('o 15-16+//Startthe17通過gitdiffendpoint>gitdiff--gita/index.jsindex7b82693..986fcd8---5+++6@@-2,6+2,10@@varport=varexpress=varapp=910+app.get('/timestamp',function(req,res)11+res.send(''+1213app.get('/',function(req,res)res.send('o gitcommit如果你想深入了解gitadd-p通過gitadd-p,我們可以把工作區(qū)中的代碼拆分成多個提交。但是,如果需要拆分的代碼已經(jīng)被放到了一個提交中,怎么辦?如果這個提交已經(jīng)推送到了代碼倉共享分支,那就所謂當前提交,指的是當前分支的HEADendpoint用gitadd-p的方法重新產(chǎn)生提交。這里的取消是帶引號的,因為在Git里所有的提交都gitloggitshowendpoint##>gitlog--graph--oneline--*7db082a(HEAD->master)ChangemagicportANDadda*352cc92Addgitignorefilefor*e2dacbc(origin/master)Addedthesimplewebserver78##>gitcommit (HEAD->diff--gita/index.jsindex63b6300..986fcd8---17+++18@@-1,8+1,1419+varport= varexpress= varapp=23+app.get('/timestamp',function(req,res)24+res.send(''+2526 app.get('/',function(req,res) res.send('o 31-32+//Startthe33gitbranchtemptempHEAD。temp作用是,預防代碼丟失。如果后續(xù)工作出現(xiàn)問題的話,我可以使用gitreset--hardtemp1>gitbranch2>gitlog--graph--oneline--*7db082a(HEAD->master,temp)ChangemagicportANDadda*352cc92Addgitignorefilefor*e2dacbc(origin/master)Addedthesimplewebserver接下來,運行gitresetHEAD^命令,把當前分支指向目標提交HEAD^,也就是當前提交的父提交。同時,在沒有接–hard或者–soft參數(shù)時,gitreset會把目標提交的內(nèi)容同時endpoint相關改動和端口相關改動。也就是說,這個命令的效果,就是讓我回到了對這兩>gitresetUnstagedchangesafterM4>gitOnbranchYourbranchisaheadof'origin/master'by1(use"gitpush"topublishyourlocal9Changesnotstagedfor(use"gitadd<file>..."toupdatewhatwillbe(use"gitcheckout--<file>..."todiscardchangesinworking nochangesaddedtocommit(use"gitadd"and/or"gitcommit-15:06:58(master)jasonge@Juns-MacBook-Pro-2.local:~/jksj-repo/git-atomic-##>gitdiff--gita/index.jsindex63b6300..986fcd8---25+++26@@-1,8+1,1427+varport= varexpress= varapp=31+app.get('/timestamp',function(req,res)32+res.send(''+3334 app.get('/',function(req,res) res.send('o 39-40+//Startthe41##>gitdiff--gitaddpCommitMessagegitcommitamendGitgitcommitamendCommitMessage有些時候,我們需要把多個提交交換順序。比如,masterAB,BAorigin/master這時,我先完成了提交B,想把它先單獨推送到origin/master上去,就需要交換A和B的位置,使得A在B之上。我可以使用gitrebase--inctive(選項–inctive可以簡寫為-i)來實現(xiàn)這個功能。首先,還是使用gitbranchtemp產(chǎn)生一個臨時分支,確保代碼不會丟失。然后,使用gitlog--oneline--graph來確認當前提交歷史:>gitlog--oneline--*7b6ea30(HEAD->master,temp)Addanewendpointtoreturn*b517154Changemagicportnumberto*352cc92(origin/master)Addgitignorefilefor*e2dacbcAddedthesimplewebserver*2f65a89Initcommitcreatedbyinstallingexpress>gitrebase-iGitrebasepickb517154Changemagicportnumbertopick7b6ea30Addanewendpointtoreturn3#Rebase352cc92..7b6ea30onto352cc92(2###p,pick<commit>=use#r,reword<commit>=usecommit,buteditthecommit#e,edit<commit>=usecommit,butstopfor#s,squash<commit>=usecommit,butmeldintoprevious#f,fixup<commit>=like"squash",butdiscardthiscommit'slog#x,exec<command>=runcommand(therestoftheline)using#b,break=stophere(continuerebaselaterwith'gitrebase--#d,drop<commit>=remove#l,label<label>=labelcurrentHEADwitha#t,reset<label>=resetHEADtoa#m,merge[-C<commit>|-c<commit>]<label>[## createamergecommitusingtheoriginalmerge# message(ortheoneline,ifnooriginalmergecommit# specified).Use-c<commit>torewordthecommit##Theselinescanbere-ordered;theyareexecutedfromtopto##IfyouremovealinehereTHATCOMMITWILLBE##However,ifyouremoveeverything,therebasewillbe##Notethatemptycommitsarecommentedrebase命令一般翻譯為變基,意思是改變分支的參考基準。具體到gitrebase-iorigin/master命令,就是把從origin/master之后到當前HEAD的所有提交,也就是A和B,重新有選擇地放到origin/master上面。你可以選擇放或者不放某一個提交,也可指的就是在HEAD之上應用一個提交的意思。Gitrebasei參考基準上去,具體到這個例子,是用兩個pick命令把A和B先后重新放到origin/master之上,如果我直接保存退出的話,結果跟rebase之前沒有任何改變。ABpick可。Gitrebase就會先后把B和A放到origin/master上。pick7b6ea30Addanewendpointtoreturnpickb517154Changemagicportnumberto3#Rebase352cc92..7b6ea30onto352cc92(2#B##以下是gitrebase-iorigin/masterSuccessfullyrebasedandupdated34##>gitlog--oneline--graph--*65c41e6(HEAD->master)Changemagicportnumberto*40e2824Addanewendpointtoreturn|*7b6ea30(temp)Addanewendpointtoreturn|*b517154Changemagicportnumberto*352cc92(origin/master)Addgitignorefilefor*e2dacbcAddedthesimplewebserver*2f65a89Initcommitcreatedbyinstallingexpress值得注意的是,ABcommitSHA1AB的拷貝,原來的兩個提交仍然存在(圖中的陰影部分),我們還可以用分支temp找到它們,但不再需要它們了。如果temp分支被刪除,A和B也會自動被Git的收集過程gc清除掉。其實,gitrebasei的功能非常強大,除了交換提交的順序外,還可以刪除提交、和并多在上面的基本操作二、三、四中,我與你介紹的都是對當前分支頭部的一個提交或者多個提交進行操作。但在工作中,為了方便實現(xiàn)原子性,我們常常需要修改歷史提交,也就是修改非頭部提交。對歷史提交操作,最方便的方式依然是使用強大的itrease-i。接下來,我繼續(xù)用上面修改A和B兩個提交的順序的例子來做說明。在還沒有交換提交BBAAgitrebaseiorigin/master;然后,在彈出的編輯窗口中把原來的“pickb517154”的一行改為“editb517154”。其中,b517154是提交A的SHA1。editb517154Changemagicportnumbertopick7b6ea30Addanewendpointtoreturn3#Rebase352cc92..7b6ea30onto352cc92(2#而“editb517154”,是告知Gitrebase命令,在應用了b517154之后,暫停后續(xù)的rebasegitrebasecontinue輯器中保存修改并退出之后,gitrebase就會暫停。>gitrebase-iStoppedatb517154...ChangemagicportnumbertoYoucanamendthecommitnow,4 gitcommit--67Onceyouaresatisfiedwithyourchanges,8 gitrebase--1122:29:35(master|REBASE-i)~/jksj-repo/git-atomic-demo這時,我可以運行gitlog--oneline--graph--all,確認當前HEAD已經(jīng)指向了要修改的提交A。>gitlog--oneline--graph--*7b6ea30(master)Addanewendpointtoreturn*b517154(HEAD)Changemagicportnumberto*352cc92(origin/master)Addgitignorefilefor*e2dacbcAddedthesimplewebserver*2f65a89Initcommitcreatedbyinstallingexpress接下來,我就可以使用基本操作二中提到的方法對當前提交(A)進行修改了。具體來說,就是修改文件,之后用gitadd<文件名>,然后再運行gitcommit--amend。##檢查當前HEAD>gitcommit c8a872e9e9b9118ebAuthor:JasonGe MonOct1412:50:366 Changemagicportnumberto8It'snotgoodtohaveamagicnumber.ThiscommitchangesittoRunnodeindex.jsandverifiedtherootendpointstilldiff--gita/index.jsindex63b6300..7b82693---19+++20@@-1,3+1,4+varport=varexpress=varapp=25@@-5,4+6,5@@app.get('/',function(req,res) res.send('o -30+//Startthe31##用VIM"atapredefined>vim38##39>git40diff--gita/index.js41index7b82693..eb53f5f42---43+++44@@-6,5+6,5@@app.get('/',function(req,res) res.send('o 48-//Startthe49+//Starttheserveratapredefined22:40:10(master|REBASE-i)jasonge@Juns-MacBook-Pro-2.local:~/jksj-repo/git-atomic->gitadd##對修改添加到提交A>gitcommit--[detachedHEADf544b12]Changemagicportnumberto Date:MonOct1412:50:361filechanged,3insertions(+),1deletion(-22:41:18(master|REBASE-i)jasonge@Juns-MacBook-Pro-2.local:~/jksj-repo/git-atomic-##查看修改過后的A。確認其包含了新修改的內(nèi)容"atapredefined>gitcommit c7dd08a32c0d59b032Author:JasonGe MonOct1412:50:36 ChangemagicportnumbertoIt'snotgoodtohaveamagicnumber.ThiscommitchangesittoRunnodeindex.jsandverifiedtherootendpointstilldiff--gita/index.jsindex63b6300..eb53f5f---81+++82@@-1,3+1,483+varport=varexpress=varapp=87@@-5,4+6,5@@app.get('/',function(req,res)

res.send('o91-92+//Starttheserveratapredefined93執(zhí)行完成之后,我就可以運行gitrebase--continue,完成gitrebase-i的后續(xù)操作,也就是在A之上再應用提交B,并把HEAD重新指向了B,從而完成了對歷史提交A的修##繼續(xù)運行rebase>gitrebase--Successfullyrebasedandupdated45##>gitlog--oneline--graph--*

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論