Git是協(xié)作開發(fā)中必不可少的掺喻,簡單的一個人一個分支沒有太多需要掌握的芭届,但如果是大型團(tuán)隊,幾十個功能同時開發(fā)感耙,如何協(xié)同良好的使用Git成為了項目順利進(jìn)展的基石褂乍。如果你即將或剛進(jìn)入這種大型開發(fā)團(tuán)隊,那么本文值得一看即硼。
git rebase
在合并代碼或拉取新代碼的時候逃片,git會自動生成一個merge的commit,并且分支樹在多人開發(fā)時變得凌亂不堪谦絮。
如果我們有兩個分支:master和feature如下圖√馑校現(xiàn)在需要把feature分支合并到master分支洁仗。
使用:(master)git merge feature && git pull
使用:(master)git rebase feature && git pull --reabse
小結(jié):如果你的當(dāng)前分支落后于遠(yuǎn)程分支层皱,并且你有了自己新的commit,使用git pull會產(chǎn)生一個merge的commit信息赠潦。如果使用git pull --rebase叫胖,那么會git會將你的commit先放一邊,然后把遠(yuǎn)程分支的內(nèi)容拉取到你的本地她奥,接著再自動把你的commit放在最上面瓮增。中途發(fā)生沖突,在解決沖突后使用git rebase --continue來繼續(xù)rebase操作
git cherry-pick
現(xiàn)在哩俭,feature分支有了4個新的commit绷跑,但是我們只需要其中的一個或幾個合并到master
我們可以使用git cherry-pick命令。
git cherry-pick [commitID] 提取一個commit
git cherry-pick [start-commitID]..[end-commitID] 提取一個commit到另一個commit之間的所以commit凡资,不包括start-commitID砸捏,包括end-commitID。
git cherry-pick start-commitID]^..[end-commitID] 提取一個commit到另一個commit之間的所以commit隙赁,包括start-commitID垦藏,包括end-commitID。
在使用git cherry-pick過程中如果遇到?jīng)_突伞访,解決沖突后使用git cherry-pick --continue來繼續(xù)cherry-pick操作掂骏。
一個commit其實就是一個文件修改的補(bǔ)丁,cherry-pick就是單純的把這個文件修改補(bǔ)丁提取厚掷,對于被提取的分支不會發(fā)生任何變化弟灼。
git rebase -i
開發(fā)一個新功能级解,往往會有多個commit信息,但我們在合并的時候袜爪,只希望有一個commit信息蠕趁。rebase -i命令可以幫助我們修改本次合并的所有commit信息
現(xiàn)在,我們在feature有4個commit信息辛馆,我們需要把feature合入master俺陋,并且希望所有的commit合成一個commit
把feature上的4個commit rebase到master后,通過git status查看
可以看到昙篙,現(xiàn)在和遠(yuǎn)程分支相比有4個提交
執(zhí)行g(shù)it rebase -i
可以看到腊状,reabse -i的作用是用來編輯所有的commit,也就是在push到遠(yuǎn)程分支之前苔可,我們可以“為所欲為”缴挖,可以看到有多個命令可以使用。
p, pick = 使用此commit焚辅。(p是pick命令的縮寫映屋,兩種方式均支持)
r, reword = 使用此commit, 編輯commit messagee,
e, edit = 使用此commit同蜻,并且把commit信息放在第一個棚点,使用commit --amend來修改commit信息
s, squash = 使用此commit,但是合并到前一個commit中去f,
f, fixup = 和squash類似湾蔓,但是放棄此commit的message
具體的使用還是要自己試試才能體會瘫析。
在這里,我們把后三個改成s
接著保存會進(jìn)入一個commit編輯界面
這個時候可以修改我們的commit信息了默责,這個commit包含了合成的4個commit,我們把commit信息修改成"commit 1,2,3,4"
再使用git log 查看
git push 多個commit中的一個
git push [remote] [commit-id]:[branch]
再push到遠(yuǎn)程倉庫就大功告成了贬循。