在公司發(fā)現(xiàn),很多工作很久的同事對(duì)git的操作都僅限于 commit、push、merge。結(jié)合自己項(xiàng)目中實(shí)際遇到的問(wèn)題,優(yōu)雅的解決各種代碼操作場(chǎng)景問(wèn)題。
git reset --soft HEAD~1
使用場(chǎng)景:在開(kāi)發(fā)過(guò)程中,有時(shí)候開(kāi)發(fā)流程突然被打斷,需要切換分支去看別的問(wèn)題,這個(gè)時(shí)候就隨后將本地代碼進(jìn)行了一個(gè)臨時(shí)的commit,然后切換回來(lái)的時(shí)候,雖然可以繼續(xù)開(kāi)發(fā),但是由于之前commit的功能不完整,并且繼續(xù)開(kāi)發(fā)的時(shí)候IDE上面對(duì)已經(jīng)commit的文件沒(méi)有顏色分別,有時(shí)候,改了很多文件,需要自己能夠顯式的看到自己對(duì)這個(gè)功能改動(dòng)的哪些文件,還要繼續(xù)接著改。那么這個(gè)命令會(huì)將你最后一個(gè)commit 回退到工作區(qū) ,后續(xù)開(kāi)發(fā)完成后再進(jìn)行commit。切記,不建議任何時(shí)候使用git reset --hard這個(gè)命令。
git commit --amend
使用場(chǎng)景:在開(kāi)發(fā)完成后,在已經(jīng)完整功能commit的情況下,突然發(fā)現(xiàn)還有一個(gè)小小的改動(dòng),可能就只是一個(gè)空格,這個(gè)時(shí)候,不想單獨(dú)的去開(kāi)個(gè)commit去提交這個(gè)空格,并且這個(gè)空格本來(lái)就是屬于上面那個(gè)功能,那么可以使用這個(gè)命令,將其追加到上個(gè)commit中。
1. git add .
- add 需要追加的文件,add .是當(dāng)前工作區(qū)所有的文件,可以自己選擇性的追加也行。
2. git commit --amend
- 這一步之后,會(huì)有vi框提示可以修改commit信息
git cherry-pick
使用場(chǎng)景:有時(shí)候好幾個(gè)人都在自己的功能分支上開(kāi)發(fā)的時(shí)候,需要依賴另外一個(gè)人的分支上的某個(gè)commit功能,但是這個(gè)時(shí)候?qū)Ψ降墓δ懿](méi)有完成,也不是自己需要的,只需要他其中某一個(gè)commit,自己這邊的流程才能繼續(xù)走下去,這個(gè)時(shí)候就需要把對(duì)方的某個(gè)commit給檢索到自己的本地分支上面來(lái)。
1.git cherry-pick <HashA> <HashB>
- 這個(gè)地方需要找到commit的hash值,可以通過(guò)git log查看??梢砸淮蝐herry多個(gè)commit。如果沒(méi)有沖突則流程結(jié)束。
2. git add .
- 這一步和rebase沖突一樣,加入緩存區(qū)。
3. git cherry-pick --continue
- 繼續(xù)進(jìn)行pick,依然有沖突則重復(fù) 2、3步驟
git push origin temp:feature/home
使用場(chǎng)景:在本地開(kāi)發(fā)中,一直都在同一個(gè)分支上開(kāi)發(fā)。本地分支名字起的不太好,或者本地分支也有對(duì)應(yīng)的遠(yuǎn)程分支,之前已經(jīng)有過(guò)merge,本地commit有過(guò)rebase merge等操作,如果直接push到origin會(huì)與遠(yuǎn)程同名分支產(chǎn)生沖突,導(dǎo)致推不上去,這個(gè)時(shí)候可以將本地分支推送到遠(yuǎn)程的時(shí)候換一個(gè)名字。
1. git push origin temp:feature/home
- 這個(gè)推送的意思是,本地的分支名字叫做temp,代碼推送到遠(yuǎn)程時(shí)的分支名字是 feature/home
git rebase
使用場(chǎng)景:在正常我們進(jìn)行任務(wù)開(kāi)發(fā)時(shí)候,是不會(huì)在master上直接拉分支開(kāi)發(fā),一般每個(gè)迭代會(huì)有一個(gè)基準(zhǔn)分支,假設(shè)為dev。 那么我們自己基于dev分支check出自己的開(kāi)發(fā)分支feat后,commit后肯定是需要同步一下我們的dev分支才能發(fā)起review的,這個(gè)時(shí)候很可能就會(huì)產(chǎn)生沖突。那么如何解決沖突了?
1. git rebase origin/dev
- 這里也可以本地切換到dev分支pull后,再進(jìn)行 git rebase dev,直接拉遠(yuǎn)程肯定是最新的。這個(gè)時(shí)候出現(xiàn)了沖突的話,本地先解決沖突。
2. git add .
- add之后你的本次commit沖突就已經(jīng)被resolve,由于rebase是按commit一個(gè)一個(gè)的合并的,所有還需要繼續(xù)合并
3. git rebase --continue
- 這一步之后,如果沒(méi)有沖突那么流程就結(jié)束了,如果依然有,則重復(fù)2、3步驟,直到結(jié)束。
git revert OLDER_COMMIT^..NEWER_COMMIT
使用場(chǎng)景:不知道大家有沒(méi)有碰到過(guò)這種場(chǎng)景,項(xiàng)目臨近上線時(shí)期,突然發(fā)現(xiàn)此功能因某些原因,不得不停止上線,此時(shí),這個(gè)功能你有連續(xù)十幾個(gè)commit需要回滾,那么怎么快速回滾了,我們可以通過(guò)此命令,回滾你的連續(xù)的十個(gè)commit,也就是可以區(qū)間選擇段來(lái)回滾
git rebase -i
使用場(chǎng)景:有時(shí)候commit記錄太多太雜,需要整理commit,譬如合并多個(gè)commit,或者刪除某個(gè)commit
1. git rebase -i HEAD~5
- 這個(gè)代表你需要對(duì)最近的五個(gè)commit做合并或者刪除處理。
2. 如上圖 默認(rèn)都是pick,將pick改為s 則代表將當(dāng)前合并至上個(gè)commit,改為d則代表刪除當(dāng)個(gè)commit
- add之后你的本次commit沖突就已經(jīng)被resolve,由于rebase是按commit一個(gè)一個(gè)的合并的,所有還需要繼續(xù)合并
- 修改完commit之后,按wq保存退出
vi使用
- 在上面這些命令中,很多都需要進(jìn)入到vi的編輯框進(jìn)行操作,默認(rèn)是命令行模式,需要按
a或者i來(lái)進(jìn)入輸入模式修改,這個(gè)時(shí)候就可以對(duì)里面文字就行修改操作。 - 修改完后需要按
esc鍵回到命令行模式,然后按 : 進(jìn)入到底線命令行模式,這時(shí)按wq就可以保存退出了