git stash pop冲突_这有一份 git 日常使用清单,你需要吗?
點(diǎn)擊上方“前端教程”,選擇“星標(biāo)”
每天前端開發(fā)干貨第一時間送達(dá)!
作者: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?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ù)有點(diǎn)困難,你已經(jīng)在這個分支工作很長時間了,很長時間都沒有同步 master 分支的代碼了,然后同組的小伙伴合并了一個新功能這個功能你需要使用,這個時候你就可以在當(dāng)前分支使用?git rebase origin/master?了,這個操作會將你在這個分支的提交附加于最新的 master 分支版本之后,很明顯這個操作之后你當(dāng)前本地的 branch-a 和遠(yuǎn)程的?origin/branch-a?已經(jīng)不一樣了,所以有一個缺點(diǎn)就是你只能選擇?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,其實(shí)?git pull?命令后面是有一個默認(rèn)參數(shù)的那就是 --merge,會給我們剛接觸 git 的同學(xué)造成很多麻煩。所以在這?git pull --rebase?是一個不錯的選擇。
rebase 的另外一個騷操作:合并 commit
git 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)前分支的這個文件。可以發(fā)揮一下 xxx 也可以是遠(yuǎn)程分支。
git checkout branch -- file
那么這個操作又是干嘛的呢,這個操作可以將你的某個文件還原到某個分支的版本。如果某次你手誤提交了錯誤的文件,但是改動又忘了,那么這個命令或許可以幫到你。
git prune
根據(jù)官方的解釋,直白一點(diǎn)的翻譯就是刪除 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 stash
git stash?可以幫助我們來暫存一些更改,我推薦的是如果只是少部分的更改,使用 stash 是可以的,多了的話,推薦新建分支來保存更改,以免自己忘記了哪個 stash。那我們該如何取出這些更改呢,最常用的就是?git stash pop?它會將你最新一次的 stash 從一個緩存數(shù)組里面推出來,這樣的話如果我們操作不當(dāng)很可能就丟失了這些更改。
我推薦的是使用?git stash apply,這個會將你最新一次的 stash 從緩存數(shù)組里面 copy 一個副本返還給你,缺點(diǎn)就是,你本地的 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)行修改。如果本文有錯誤的地方還請大家可以指正,謝謝。
覺得本文對你有幫助?請分享給更多人
關(guān)注「前端教程」,一起提升前端技能!
好文章,我在看?? 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的git stash pop冲突_这有一份 git 日常使用清单,你需要吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: github mysql 数据恢复_记一
- 下一篇: 权限管理系统中 管理员能看到所有用户的密