高頻使用的 Git 命令

前言

彙總下我在項目中高頻使用的git命令及姿式。git

不是入門文檔,官方文檔確定比我全面,這裏是結合實際業務場景輸出。github

使用的 Git版本:git version 2.24.0npm

命令

git log

查看日誌,常規操做,必備緩存

# 輸出概要日誌,這條命令等同於
# git log --pretty=oneline --abbrev-commit
git log --oneline

# 指定最近幾個提交能夠帶上 - + 數字
git log --oneline -5

# 提供相似 GUI 工具的 log 展現
git log --graph --date=relative --pretty=tformat:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%an %ad)%Creset'
複製代碼


image.png

git status

查看工做區狀態的東東,不如GUI直觀,可是命令行也有一些用的bash

# 等同 git status --long,查看當前工做區暫存區變更
git status

# 概要信息 (--short)
git status -s

# 查詢工做區中是否有stash存在(暫存的東西),有則提醒該工做區有幾個 stash
git status  --show-stash
複製代碼

git checkout

用來切換到對應記錄的,能夠基於分支,提交,標籤。app

切提交和標籤通常用來熱修復或者老版本須要加新特性。編輯器

# 分支切換
git checkout dev # local branch

# 切換遠程分支
git checkout origin/test # remote branch

# 基於遠程分支建立本地分支,並跟蹤對應來自 'origin' 的遠程分支
git checkout --track origin/feature-test # new local branch wih remote branch

# 基於本地分支開出新分支
git checkout -b testbranch # new local branch with current branch

# 完全丟棄某個文件的改動
git checkout -- file

# 放棄本地全部改動
git checkout .

# 切換上一個分支
git checkout -
複製代碼

git commit

每天打交道的命令,這裏說一些很常見的姿式工具

# 新修改的內容,添加到上次提交中,減小提交的日誌
# --no-eidt:是跳過進入編輯器,直接提交
# git commit --amend這條命令等同於
# $ git reset --soft HEAD^
# $ ... do something tree ...
# $ git commit -c ORIG_HEAD
git commit --amend --no-edit

# 跳過校驗直接提交,包括任何 githooks
git commit --no-verify -m "xxx"

# 帶提交概要信息
git commit -m "xxx"

# 指定目錄格式提交
# -t <file>, --template=<file>
# 也能夠從全局或者項目級別指定提交的模板文件
# git config [--global] commit.template xxx
# 如今通常都是 用社區的npm規範包,commitizen 和 commitlint 來規範提交
git commit -t templateFile

# 提交信息從文件讀取,能夠結合上面的一塊兒用
git commit -F
複製代碼

git reset

不得不說,代碼回滾中這個命令也是用的不少,並且是 --hard測試

# 硬性回滾,簡單粗暴,直接拋棄回滾以後改動(log 仍是有保留,內容不要而已)
git reset --hard commit_sha1

# 軟性回滾, 跟 rebase 常規用法差很少的效果,能夠把提交的東西丟回暫存區和工做區,
# HEAD 的指向改變會對應的 commit,以後再考慮怎麼 commit
git reset --soft commit_sha1

# 軟回滾一個版本,能夠理解爲撤銷最近一次的 commit
git reset --soft HEAD~1

# 清除暫存區但保留工做區變更。
git reset --mixed commit_sha1

# 保留工做區和暫存區之間的差別。
git reset --merge commit_sha1

# 保留工做區和HEAD之間的差別
git reset --keep commit_sha1

複製代碼

git revert

通常用於master 的代碼回滾,由於多人在上面協做,ui

revert 能夠平穩的回滾代碼,但卻保留提交記錄,不會讓協做的人各類衝突!

# 回滾到某個 commit
git revert commit-sha1
複製代碼

git rebase

變基在項目中算是很頻繁的,爲何這麼說。

好比你開發一個新的 feature, 遵循最小化代碼提交的理念。

在整個功能開發完畢的時侯,會有很是多的 commit,用 rebase 可讓咱們的commit記錄很乾淨

# 帶 -i 能夠進入交互模式,效果以下
git rebase -i git-sha1|branch(HEAD)

# 如果中間毫無衝突,變基則一步到位,不然須要逐步調整。
git rebase --continue # 提交變動後繼續變基下一步
git rebase --skip # 引發衝突的commits會被丟棄,continue提示沒有須要改動的也能夠用這個跳過
git rebase --abort # 如果變基改殘廢了,可是走到一半,能夠完全回滾變基以前的狀態
複製代碼

image.png

  • pick: 是保留該 commit(採用)
  • edit: 通常你提交的東西多了,能夠用這個把東東拿回工做區拆分更細的 commit
  • reword: 這個能夠從新修改你的 commit msg
  • squash: 內容保留,把提交信息往上一個 commit 合併進去
  • fixup: 保留變更內容,可是拋棄 commit msg
  • drop: 用的比較少,無用的改動你會提交麼!!!

忽然發現截圖還有幾個新的行爲,估計是新版本帶來的,

從字面上就能夠看出來大致的意思, 就是把回滾和打標籤這些放到變基中簡化操做。

舒適提示:

  • 本地提交以前,最好把基準點變爲須要合併的分支,這樣提交 PR/MR 的時侯就不會衝突(本地來解決衝突)
  • 不要在公共分支上變基!!!一變其餘協做者基本都一堆衝突!除非大家有很清晰的分支管理機制

git merge

# --ff 是指fast-forward命令,當使用ff模式進行合併時,將不會創造一個新的commit節點。
# --no-ff,保留合併分支的提交記錄,通常主幹用的比較多.
# --ff-only 除非當前HEAD節點爲最新節點或者可以用ff模式進行合併,不然拒絕合併並返回一個失敗狀態。
# --squash 則相似 rebase squash,能夠把合併多個 commit 變成一個
git merge --no-ff branchName
複製代碼

git pull

git pull中用的最可能是帶--rebase(-r)的方式(變基形式拉取合併代碼),保持分支一條線。

默認的pull會走ff模式,多數狀況會產生新的commit,部分參數與 merge提供一致。

git push

當本地分支存在,遠程分支不存在的時侯,能夠這樣推送關聯的遠程分支

# 這樣會直接新建一個同名的遠程分支
git push origin localbranch 


# 刪除遠程分支(--delete)
git push -d origin branchName

# 推送全部標籤
git push --tags

# 推送 commit 關聯的 tags
git push --follow-tags

# 強制推送(--force)
git push -f origin branchName # 通常合理的項目,主幹都作了分支保護,不會容許強推行爲

# 有時候真的須要強推的時侯,但可不能夠柔和一點呢?
# 就是當前遠程分支和你本地一致,沒有別人提交的狀況下能夠強推
# --force-with-lease: 如果遠程有人提交,這次強推失敗,反之成功
git push --force-with-lease
複製代碼

git remote

這個東西用在你須要考慮維護多個地方倉庫的時侯會考慮,或者修改倉庫源的時侯

# 常規關聯本地 git init 到遠程倉庫的姿式
git remote add origin url

# 新增其餘上游倉
git remote add github url

# 修改推送源
git remote set-url  origin(或者其餘上游域) url
複製代碼

git branch

該命令用的最多的就是刪除本地分支,重命名分支,刪除遠程分支了

# 分支刪除,拷貝,重命名,參數如果大寫就等同多了--force,強制執行
# -c, --copy : 複製分支,
# -C:等同於 --copy --force
# -d, --delete: 刪除分支
# -m, --move:移動或者重命名分支
git branch -d branchName
git branch -M oldBranch newNameBranch


# 手動指定它的當前分支的上游分支,兩個寫法一致的
# 有關聯通常也有取消關聯,--unset-upstream
git branch --set-upstream-to=origin/xxx 
git branch --set-upstream-to origin xxx 

複製代碼

git stash

暫存用的最多時侯就是你擼代碼擼到一半,忽然說有個緊急 BUG 要修正。

或者別人在你這裏須要幫忙排查代碼,你這時候也會用到。

強烈建議給每一個 stash 添加描述信息!!!

# 緩存當前工做區的內容到stashName, save 這個如今不怎麼推薦用,圖方便也能用
# -a|--all: 除了未跟蹤的文件,其餘變更的文件都會保存
# -u|--include-untracked:包括沒有添加到暫存區的文件
git stash save stashName
git stash -u save stashName

# 如今基本推薦用 push,由於有 pop,語義上和維護上更清晰
# 上面有的參數,它也有,還有-m 來備註這個 stash 的大概狀況
git stash push -m "更改了 xx" 

# 有保存那確定也有取用的
# pop: 取會刪除對應的保存記錄
# apply: 取但保留記錄
# 0就是--index,這個東西哪裏來的呢?
git stash apply stash@{0}
git stash pop stash@{0}

# 查看stash 保存記錄
# eg: stash@{0}: On dev: 測試
git stash list


# 只想刪除暫存記錄怎麼辦:
# clear : 清空全部 stash
# drop: 清除指定的 stash
git stash clear # 慎用!
git stash drop stash@{0}

# 想看 stash 作了什麼改動,相似簡化版的git diff
git stash show stash@{0}
複製代碼

git reflog

這個命令的強大之處,是記錄了全部行爲,包括你 rebase,merge, reset 這些

當咱們不當心硬回滾的時侯,或變基錯了均可以在這裏找到行爲以前的commit,而後回滾。

固然這個時間回溯也只在本地有用,你推送到遠程分支的破壞性改動,該涼仍是得涼。

# 最近五次行爲,不帶-n 則默認全部
git reflog -5
複製代碼

git cherry-pick

這個東西你能夠理解爲你去買橘子,你會專門挑一些符合心意的橘子放到購物籃中。

你能夠從多個分支同時挑取部分須要的 commit 合併到同一個地方去,是否是賊騷。

這貨和變基有點相似,可是僅僅相似,挑過來的 commit 如果沒有衝突則追加。

有衝突會中斷,解決後 --continue

# 在當前分支挑其餘分支的 commit,把那部分的變更那過來
git cherry-pick commit-sha1

# 支持一次性拿多個
git cherry-pick master~4 master~2

# 支持區間, 區間中間是 .. 
git cherry-pick startGitSha1..endGitSha1

# --continue:繼續 pick,通常有衝突解決後才須要這樣
# --skip:跳過此次進入隊列下一次行爲 
# --abort : 徹底放棄 pick,恢復 pick 以前的狀態
# --quit: 未衝突的自動變動,衝突的不要,退出此次 pick
# 這幾個狀態跟變基差很少,解決衝突繼續,跳過處理,放棄此次pick,不輸出錯誤
複製代碼

git rm

這個命令在舊的版本用的比較最多的姿式是爲了從新索引.gitignore 的範圍

# 刪除某個文件的索引
# --cache 不會刪除硬盤中的文件,只是 git 索引(緩存)的關係!!!
git rm --cache -- file

# 遞歸清除所有全部索引(也能夠理解爲緩存吧),這個姿式適合從新讓.gitignore 新範圍生效
git rm -r --cached .  
git add .
git commit -m "xxx"
複製代碼

git rev-parse

這個估計通常人用的不是不少,能夠經過這個快速獲取部分git 倉庫的信息

我在弄腳本的時侯就會從這裏拿東西

# 獲取最新有效的commit
# --short:顯示七位的 sha1,不帶就是所有
# --verify: 校驗是否有效commit
# HEAD: 當前分支的head 指向
git rev-parse --short HEAD --verify

# 顯示倉庫的絕對路徑
git rev-parse --show-toplevel #eg: /Users/linqunhe/Code/aozhe/thinking-ui

# 顯示版本庫.git 目錄所在的位置
git rev-parse --git-dir

# 顯示全部關聯引用的 git sha1
git rev-parse --all
複製代碼

git diff

對於這個命令,在終端比對用的不是很頻繁,除了少許改動的時侯可能會用這個看看。

其餘狀況下我更傾向於用 GUI 工具來看,由於比對更加直觀。

總結

git 的經常使用命令其實很好掌握,不少命令都有 Linux 的影子。

列出來的命令都是高頻使用的,或許有一些更騷的姿式沒有摸索到,

有更好建議的,或者發現不對之處的請留言,會及時修正,謝謝閱讀。

相關文章
相關標籤/搜索