這有一份 git 平常使用清單,你須要嗎

前置條件:git

在正式開始以前,咱們須要先肯定幾個概念。下面所提到的 master 分支默認爲代碼提交的主分支。shell

本地分支和遠程分支

本地分支是指咱們在平常開發中本身經過 git checkout branch xxx 創建的分支,遠程分支是咱們通過 git push -u origin xxxx 推到 git 服務器的分支,在咱們推送以後,git 會幫咱們在本地創建一個以 orgin/ 開頭的分支,這個咱們也叫遠程分支,咱們平常操做的就是本地分支 xxx 和遠程分支 origin/xxxorigin/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 進行強制提交了,這個操做很危險,謹慎使用。app

merge 仍是 rebase

我比較喜歡 rebase 操做,因此在這裏就只會講解 rebase 操做了。rebase 的使用場景。fetch

  • 使用場景 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-idbranch-b 分支的提交記錄拿過來了code

那若是咱們只須要 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 沒說,由於用得比較少,若是再想到其餘的內容我會在這篇文章上進行修改。若是本文有錯誤的地方還請你們能夠指正,謝謝。

相關文章
相關標籤/搜索