作者:echozh
juejin.im/post/5d5b4c6951882569eb570958
前置條件:
在正式開(kāi)始之前,我們需要先確定幾個(gè)概念。下面所提到的 master 分支默認(rèn)為代碼提交的主分支。 本地分支和遠(yuǎn)程分支本地分支是指我們?cè)谌粘i_(kāi)發(fā)中自己通過(guò) git checkout branch xxx 建立的分支,遠(yuǎn)程分支是我們經(jīng)過(guò) git push -u origin xxxx 推到 git 服務(wù)器的分支,在我們推送之后,git 會(huì)幫我們?cè)诒镜亟⒁粋€(gè)以 orgin/ 開(kāi)頭的分支,這個(gè)我們也叫遠(yuǎn)程分支。 我們?nèi)粘2僮鞯木褪潜镜胤种?xxx 和遠(yuǎn)程分支 origin/xxx ,origin/xxx 就是遠(yuǎn)程的 git 服務(wù)器在我們本地建立的一個(gè)分支的對(duì)照版本(我覺(jué)得這樣說(shuō)應(yīng)該比較容易理解),我們?nèi)粘5?nbsp;git fetch --all 就是將本地的 origin/xxx 與 git 服務(wù)器的 origin/xxx 分支進(jìn)行同步。 commit id我們每次提交代碼都會(huì)根據(jù)本次提交的內(nèi)容生成一個(gè)幾乎唯一的 id ,這個(gè) id 重復(fù)的概率幾乎為 0,我們可以這樣理解,我們每次的提交都會(huì)生成一個(gè)唯一索引的記錄,不管是本地的 git,還是遠(yuǎn)程的 git ,我們都將她理解為一個(gè)數(shù)據(jù)庫(kù),只要我們進(jìn)行了 commit 操作,那么可以幾乎確定,我們的代碼是不會(huì)丟失的,我們都可以通過(guò) commit id 找到那條提交記錄的內(nèi)容。 本篇文章不會(huì)講解,分支與分支之間的版本比較等內(nèi)容,作者比較菜,怕掌握不好度翻車。 使用指南創(chuàng)建分支創(chuàng)建分支我們可以使用 git checkout branch xxx 來(lái)創(chuàng)建一個(gè)新分支,這個(gè)很容易理解,但是如果我們現(xiàn)在在分支 branch-1,但是我們想新建一個(gè)基于遠(yuǎn)程 master 最新版本的分支,我們?cè)撛趺崔k呢,不能說(shuō)現(xiàn)在我回到 master,然后 git pull 拉取最新的 master 分支代碼,然后創(chuàng)建分支,很繁瑣對(duì)不對(duì)。 這里我們就可以進(jìn)行里一個(gè)操作了:git fetch --all 記得我們上面提到的吧,同步遠(yuǎn)程分支代碼, --all 可以改成 origin/master ,然后進(jìn)行 git checkout branch xxx origin/master 后面的 origin/master 代表我們是基于遠(yuǎn)程分支 origin/master 進(jìn)行創(chuàng)建的。 追加提交記錄比如我現(xiàn)在已經(jīng)在本地 commit 一次了,但是發(fā)現(xiàn)還有東西忘改了,如果我在 commit 一次就會(huì)生成兩條記錄,這樣從提交記錄上看可能不太好看,然后我們就可以使用 git commit --amend 對(duì)上一次的提交記錄進(jìn)行追加。 這個(gè)操作的前提是上一次提交必需沒(méi)有推送到遠(yuǎn)程分支,否則,你會(huì)發(fā)現(xiàn)操作之后在進(jìn)行 git push 會(huì)提示你版本不一致不允許提交,當(dāng)然如果你可以保證提交沒(méi)有錯(cuò)誤,且這一個(gè)分支只有你自己一個(gè)人玩,那你就可以使用 git push -f 進(jìn)行強(qiáng)制提交了,這個(gè)操作很危險(xiǎn),謹(jǐn)慎使用。 merge 還是 rebase我比較喜歡 rebase 操作,所以在這里就只會(huì)講解 rebase 操作了。rebase 的使用場(chǎng)景。 使用場(chǎng)景 1: 比如現(xiàn)在你在 branch-a 分支工作,但是這個(gè)任務(wù)有點(diǎn)困難,你已經(jīng)在這個(gè)分支工作很長(zhǎng)時(shí)間了,很長(zhǎng)時(shí)間都沒(méi)有同步 master 分支的代碼了,然后同組的小伙伴合并了一個(gè)新功能這個(gè)功能你需要使用,這個(gè)時(shí)候你就可以在當(dāng)前分支使用 git rebase origin/master 了,這個(gè)操作會(huì)將你在這個(gè)分支的提交附加于最新的 master 分支版本之后,很明顯這個(gè)操作之后你當(dāng)前本地的 branch-a 和遠(yuǎn)程的 origin/branch-a 已經(jīng)不一樣了,所以有一個(gè)缺點(diǎn)就是你只能選擇 git push -f 進(jìn)行提交。 使用場(chǎng)景 2: 你同組的小伙伴修改了你在 branch-a 分支也修改過(guò)的代碼,并且你的小伙伴已經(jīng)提交了,這個(gè)時(shí)候,你的 branch-a 分支就會(huì)和 origin/master 分支有沖突,嗯,這個(gè)時(shí)候你也可以使用 git rebase origin/master 這個(gè)操作來(lái)解決沖突,并同步最新的 master 的代碼。 使用場(chǎng)景 3: 你和小伙伴共同在 branch-a 分支提交代碼,結(jié)果小伙伴比你先提交了,這個(gè)時(shí)候你再提交會(huì)發(fā)現(xiàn)版本不一致無(wú)法提交,這個(gè)時(shí)候我們就推薦使用 git pull --rebase ,其實(shí) git pull 命令后面是有一個(gè)默認(rèn)參數(shù)的那就是 --merge,會(huì)給我們剛接觸 git 的同學(xué)造成很多麻煩。所以在這 git pull --rebase 是一個(gè)不錯(cuò)的選擇。 rebase 的另外一個(gè)騷操作:合并 commitgit rebase -i HEAD~X x 代表從當(dāng)前的提交記錄往回回溯的提交記錄的個(gè)數(shù),執(zhí)行這個(gè)操作之后我們就可以看到一個(gè)這樣的交互界面:

上面我的 x 是 5,所以在這會(huì)有 5 個(gè)記錄,接下來(lái)我們需要以一個(gè)記錄為目標(biāo),將其他的記錄全都合并到目標(biāo)記錄: 
我們將其他的 pick 改為 s,s 是指 squash,下面截圖的下面會(huì)有相應(yīng)的解釋,然后我們只需要保存退出即可,接下來(lái)會(huì)跳出一個(gè) commit message 填寫的界面: 
這個(gè)界面是讓我為新的提交記錄填寫新的 commit message ,這個(gè)可自行發(fā)揮,然后還是保存退出即可。然后我們使用 git log 就可以看到一個(gè)新的提交記錄: 
git cherry-pick我們可能會(huì)有這樣一個(gè)使用場(chǎng)景,在分支 branch-a 需要分支 branch-b 的某次提交,這個(gè)時(shí)候我們就可以先找到 branch-b 的那次提交記錄的 id,然后在 branch-a 分支進(jìn)行 git cherry-pick b-commit-id 將 branch-b 分支的提交記錄拿過(guò)來(lái)了 那如果我們只需要 branch-b 分支的某個(gè)文件呢該怎么辦呢,莫慌再交你一個(gè)操作,git checkout xxx file 這個(gè)操作可以將其他分支的文件拉取到當(dāng)前分支,注意這個(gè)操作是覆蓋式的,也就是如果你這個(gè)分支的這個(gè)文件已將存在,那么這個(gè)操作將會(huì)覆蓋你當(dāng)前分支的這個(gè)文件??梢园l(fā)揮一下 xxx 也可以是遠(yuǎn)程分支。 git checkout branch -- file那么這個(gè)操作又是干嘛的呢,這個(gè)操作可以將你的某個(gè)文件還原到某個(gè)分支的版本。如果某次你手誤提交了錯(cuò)誤的文件,但是改動(dòng)又忘了,那么這個(gè)命令或許可以幫到你。 git prune根據(jù)官方的解釋,直白一點(diǎn)的翻譯就是刪除 git 數(shù)據(jù)庫(kù)中不可訪問(wèn)的對(duì)象,那我的理解是這樣的,git prune 刪除的是你本地 .git 下的 object 目錄下,沒(méi)有被使用到的 hash 值,我理解的是它會(huì)刪除 origin/xx 開(kāi)頭的沒(méi)有用到的分支,這個(gè)分支在你的遠(yuǎn)程的 git 服務(wù)器中已經(jīng)刪除但是本地任然存在 origin/xxx 的映射,這個(gè)時(shí)候你就可以使用 git prune 來(lái)刪除本地的 origin/xxx 的映射。 但是官方推薦使用的是 git gc,而想刪除本地的 xxx 分支,就只能只用 git branch -D XXX ,在這附上一條我們部門自己寫的一個(gè)清除本地?zé)o用分支的 shell git fetch --all --prune && git branch -vv | grep gone | awk '{ print $1 }' | grep -v pit | xargs git branch -D 。 git stashgit stash 可以幫助我們來(lái)暫存一些更改,我推薦的是如果只是少部分的更改,使用 stash 是可以的,多了的話,推薦新建分支來(lái)保存更改,以免自己忘記了哪個(gè) stash。那我們?cè)撊绾稳〕鲞@些更改呢,最常用的就是 git stash pop 它會(huì)將你最新一次的 stash 從一個(gè)緩存數(shù)組里面推出來(lái),這樣的話如果我們操作不當(dāng)很可能就丟失了這些更改。
我推薦的是使用 git stash apply ,這個(gè)會(huì)將你最新一次的 stash 從緩存數(shù)組里面 copy 一個(gè)副本返還給你,缺點(diǎn)就是,你本地的 stash 數(shù)組會(huì)越來(lái)越大,當(dāng)然,你可以定時(shí)清空一下。還有一個(gè)場(chǎng)景,如果我想取出指定的 stash 該怎么辦呢,在這我們可以使用 git stash list 來(lái)查看一下自己本地的 stash 記錄的形式: 
我圈出來(lái)的就是每次 stash 的類似于 id 的一個(gè)東西,后面會(huì)顯示是在什么分支 stash 的,所以現(xiàn)在我們就可以使用 git stash pop/apply stashid 來(lái)取出指定的 stash。 后記目前覺(jué)得這些在日常工作中使用的比較多,還有一個(gè) patch 沒(méi)說(shuō),因?yàn)橛玫帽容^少,如果再想到其他的內(nèi)容我會(huì)在這篇文章上進(jìn)行修改。如果本文有錯(cuò)誤的地方還請(qǐng)大家可以指正,謝謝。 打卡送書活動(dòng) 活動(dòng)介紹:自律改變自我!打卡送書活動(dòng)啟動(dòng)! 活動(dòng)獎(jiǎng)品:技術(shù)書籍 × 7 贊助商:清華大學(xué)出版社 本書是機(jī)器學(xué)習(xí)和深度學(xué)習(xí)領(lǐng)域的入門與提高教材,緊密結(jié)合工程實(shí)踐與應(yīng)用,系統(tǒng)、深入地講述機(jī)器學(xué)習(xí)與深度學(xué)習(xí)的主流方法與理論。本書理論推導(dǎo)與證明詳細(xì)、深入,結(jié)構(gòu)清晰,詳細(xì)地講述主要算法的原理與細(xì)節(jié),讓讀者不僅知其然,還知其所以然,真正理解算法、學(xué)會(huì)使用算法。
|