這有一份 Git 日常使用清單,你需要嗎?
作者:echozh
連結:https://juejin.im/post/5d5b4c6951882569eb570958
前置條件:
在正式開始之前,我們需要先確定幾個概念。下面所提到的 master 分支預設為程式碼提交的主分支。
本地分支和遠端分支
本地分支是指我們在日常開發中自己通過 git checkout branch xxx
建立的分支,遠端分支是我們經過 git push -u origin xxxx
推到 git 伺服器的分支,在我們推送之後,git 會幫我們在本地建立一個以 orgin/
開頭的分支,這個我們也叫遠端分支。
我們日常操作的就是本地分支 xxx 和遠端分支 origin/xxx
,origin/xxx
就是遠端的 git 伺服器在我們本地建立的一個分支的對照版本(我覺得這樣說應該比較容易理解),我們日常的 git fetch --all
就是將本地的 origin/xxx 與 git 伺服器的 origin/xxx 分支進行同步。
commit id
我們每次提交程式碼都會根據本次提交的內容生成一個幾乎唯一的 id ,這個 id 重複的概率幾乎為 0,我們可以這樣理解,我們每次的提交都會生成一個唯一索引的記錄,不管是本地的 git,還是遠端的 git ,我們都將她理解為一個資料庫,只要我們進行了 commit 操作,那麼可以幾乎確定,我們的程式碼是不會丟失的,我們都可以通過 commit id 找到那條提交記錄的內容。
本篇文章不會講解,分支與分支之間的版本比較等內容,作者比較菜,怕掌握不好度翻車。
使用指南
建立分支
建立分支我們可以使用 git checkout branch xxx
來建立一個新分支,這個很容易理解,但是如果我們現在在分支 branch-1,但是我們想新建一個基於遠端 master 最新版本的分支,我們該怎麼辦呢,不能說現在我回到 master,然後 git pull
拉取最新的 master 分支程式碼,然後建立分支,很繁瑣對不對。
這裡我們就可以進行裡一個操作了:git fetch --all
記得我們上面提到的吧,同步遠端分支程式碼, --all
可以改成 origin/master
,然後進行 git checkout branch xxx origin/master
後面的 origin/master
代表我們是基於遠端分支 origin/master 進行建立的。
追加提交記錄
比如我現在已經在本地 commit 一次了,但是發現還有東西忘改了,如果我在 commit 一次就會生成兩條記錄,這樣從提交記錄上看可能不太好看,然後我們就可以使用 git commit --amend
對上一次的提交記錄進行追加。
這個操作的前提是上一次提交必需沒有推送到遠端分支,否則,你會發現操作之後在進行 git push
會提示你版本不一致不允許提交,當然如果你可以保證提交沒有錯誤,且這一個分支只有你自己一個人玩,那你就可以使用 git push -f
進行強制提交了,這個操作很危險,謹慎使用。
merge 還是 rebase
我比較喜歡 rebase 操作,所以在這裡就只會講解 rebase 操作了。rebase 的使用場景。
使用場景 1:
比如現在你在 branch-a 分支工作,但是這個任務有點困難,你已經在這個分支工作很長時間了,很長時間都沒有同步 master 分支的程式碼了,然後同組的小夥伴合併了一個新功能這個功能你需要使用,這個時候你就可以在當前分支使用 git rebase origin/master
了,這個操作會將你在這個分支的提交附加於最新的 master 分支版本之後,很明顯這個操作之後你當前本地的 branch-a 和遠端的 origin/branch-a
已經不一樣了,所以有一個缺點就是你只能選擇 git push -f
進行提交。
使用場景 2:
你同組的小夥伴修改了你在 branch-a 分支也修改過的程式碼,並且你的小夥伴已經提交了,這個時候,你的 branch-a 分支就會和 origin/master
分支有衝突,嗯,這個時候你也可以使用 git rebase origin/master
這個操作來解決衝突,並同步最新的 master 的程式碼。
使用場景 3:
你和小夥伴共同在 branch-a 分支提交程式碼,結果小夥伴比你先提交了,這個時候你再提交會發現版本不一致無法提交,這個時候我們就推薦使用 git pull --rebase
,其實 git pull
命令後面是有一個預設引數的那就是 --merge,會給我們剛接觸 git 的同學造成很多麻煩。所以在這 git pull --rebase
是一個不錯的選擇。
rebase 的另外一個騷操作:合併 commit
git rebase -i HEAD~X x
代表從當前的提交記錄往回回溯的提交記錄的個數,執行這個操作之後我們就可以看到一個這樣的互動介面:
上面我的 x 是 5,所以在這會有 5 個記錄,接下來我們需要以一個記錄為目標,將其他的記錄全都合併到目標記錄:
我們將其他的 pick 改為 s,s 是指 squash,下面截圖的下面會有相應的解釋,然後我們只需要儲存退出即可,接下來會跳出一個 commit message
填寫的介面:
這個介面是讓我為新的提交記錄填寫新的 commit message
,這個可自行發揮,然後還是儲存退出即可。然後我們使用 git log
就可以看到一個新的提交記錄:
git cherry-pick
我們可能會有這樣一個使用場景,在分支 branch-a 需要分支 branch-b 的某次提交,這個時候我們就可以先找到 branch-b 的那次提交記錄的 id,然後在 branch-a 分支進行 git cherry-pick b-commit-id
將 branch-b 分支的提交記錄拿過來了
那如果我們只需要 branch-b 分支的某個檔案呢該怎麼辦呢,莫慌再交你一個操作,git checkout xxx file
這個操作可以將其他分支的檔案拉取到當前分支,注意這個操作是覆蓋式的,也就是如果你這個分支的這個檔案已將存在,那麼這個操作將會覆蓋你當前分支的這個檔案。可以發揮一下 xxx 也可以是遠端分支。
git checkout branch -- file
那麼這個操作又是幹嘛的呢,這個操作可以將你的某個檔案還原到某個分支的版本。如果某次你手誤提交了錯誤的檔案,但是改動又忘了,那麼這個命令或許可以幫到你。
git prune
根據官方的解釋,直白一點的翻譯就是刪除 git 資料庫中不可訪問的物件,那我的理解是這樣的,git prune
刪除的是你本地 .git 下的 object 目錄下,沒有被使用到的 hash 值,我理解的是它會刪除 origin/xx 開頭的沒有用到的分支,這個分支在你的遠端的 git 伺服器中已經刪除但是本地任然存在 origin/xxx 的對映,這個時候你就可以使用 git prune
來刪除本地的 origin/xxx 的對映。
但是官方推薦使用的是 git gc,而想刪除本地的 xxx 分支,就只能只用 git branch -D XXX
,在這附上一條我們部門自己寫的一個清除本地無用分支的 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 從一個快取陣列裡面推出來,這樣的話如果我們操作不當很可能就丟失了這些更改。
我推薦的是使用 git stash apply
,這個會將你最新一次的 stash 從快取陣列裡面 copy 一個副本返還給你,缺點就是,你本地的 stash 陣列會越來越大,當然,你可以定時清空一下。還有一個場景,如果我想取出指定的 stash 該怎麼辦呢,在這我們可以使用 git stash list 來檢視一下自己本地的 stash 記錄的形式:
我圈出來的就是每次 stash 的類似於 id 的一個東西,後面會顯示是在什麼分支 stash 的,所以現在我們就可以使用 git stash pop/apply stashid
來取出指定的 stash。
後記
目前覺得這些在日常工作中使用的比較多,還有一個 patch 沒說,因為用得比較少,如果再想到其他的內容我會在這篇文章上進行修改。如果本文有錯誤的地方還請大家可以指正,謝謝。
喜歡文章,點個在看
相關文章
- 這有一份 git 日常使用清單,你需要嗎Git
- 這份優化清單,你都做了嗎?優化
- 構建一份有價值的 Awesome Laravel 清單Laravel
- 這份優化清單,你做了哪些?優化
- 常用 Git 命令清單Git
- Git的日常使用Git
- 年終回顧,為你彙總一份「前端技術清單」前端
- 年終回顧 | 為你彙總一份「前端技術清單」前端
- 常用的Git命令清單Git
- git 日常使用小冊Git
- 列一份學習平臺清單
- 開發者日常使用的 Git 命令Git
- 2018你成長了麼?一份給你的前端技術清單前端
- 年終回顧,為你彙總一份「後端架構技術清單」後端架構
- 請教,這樣需不需要使用物件池,這樣設計有問題嗎?物件
- 想搞懂李飛飛的創業方向?這裡有一份機器人+3D的論文清單創業機器人3D
- 這些網路強迫症你有嗎?
- 阿里P7給你一份超詳細 Spring Boot 知識清單阿里Spring Boot
- Git常用命令清單筆記Git筆記
- 校招季到來,你可能需要這一份求職作戰計劃!求職
- 0-overlay和underlay,這兩種容器網路你分得清嗎
- Git 日常操作Git
- 日常使用 Git 的 19 個建議Git
- 你對這個行業有什麼心得嗎?行業
- 小哥哥,小姐姐,我有一份tcp、http面試指南你要嗎?TCPHTTP面試
- 還搞不定Java多執行緒和併發程式設計面試題?你可能需要這一份書單!Java執行緒程式設計面試題
- 資料庫日常管理 ? 我有這些經驗淺談交給你資料庫
- 這是一份非常全面的開源資料集,你,真的不想要嗎?
- 一份python實用”技巧“清單(按字母順序)Python
- 從一份配置清單詳解Nginx伺服器配置Nginx伺服器
- 這是一份你們需要的Windows版深度學習軟體安裝指南Windows深度學習
- 你有 Apple Watch嗎? 這個用處可大了APP
- 各位老大,請確認一下,使用ORACLE EBS 你們公司是否在這個清單中Oracle
- 有了Git這個功能,再也不需要依賴IDE了!GitIDE
- 你真的需要新款MacBook Pro嗎?Mac
- 你需要每天寫程式碼嗎?
- 你真的需要定期重灌Windows嗎?Windows
- 學Python不知道從何入手?來看看這一份Python學習任務清單!Python