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

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