git diff branch1 branch2 --stat # 顯示出所有有差異的文件列表
git diff branch1 branch2 文件名(帶路徑) # 顯示指定文件的詳細差異
HEAD:當前commit引用
$ git version # → git版本
$ git branch # → 查看本地所有的分支
$ git branch -r
# → 查看所有遠程的分支
$ git branch -a
# → 查看所有遠程分支和本地分支
$ git branch -d <branchname>
# → 刪除本地branchname分
$ git branch -m brancholdname branchnewname
# → 重命名分支
$ git branch <branchname>
# → 創建branchname分支
$ git checkout <branchname>
# → 切換分支到branchname
$ git checkout -b <branchname>
# → 等同於執行上兩步,即創建新的分支並切換到該分支
$ git checkout -- xx/xx
# → 回滾單個文件
$ git pull origin master:master
# → 將遠程origin主機的master分支合並到當前master分支,冒號后面的部分表示當前本地所在的分支
$ git push origin -d <branchname> # → 刪除遠程branchname分支
$ git fetch --p
# → 更新分支
$ git status
# → 查看倉庫狀態
$ git add xx
# → 把xx文件添加到暫存區去
$ git commit -m ' '
# → 提交文件 -m 后面的是注釋(不建議使用👎)
$ git commit -am(-a -m)
# → 提交所有的修改,等同於上兩步(不建議使用👎)
$ git commit ./xx # → 等同於git add ./xx + git commit(建議使用👍)
在 vi 下 commit 時,會展示當前分支及本次提交所修改文件等信息,如果發現提交有誤,可以及時撤銷本次提交(當然提交之后也可以撤銷,只是稍麻煩一些),相對粗暴式-m提交要更友好更安全一些~
$ git commit --amend
# → 將暫存區和當前commit合並創建一個新commit去替換當前commit
$ git stash
# → 把當前的工作隱藏起來 等以后恢復現場后繼續工作

$ git stash pop
# → 恢復工作現場(恢復隱藏的文件,同時刪除stash列表中對應的內容)

$ git fetch --all
# → 將遠程主機的更新全部取回本地
$ git merge origin/master
# → 在本地(當前)分支上合並遠程分支
$ git merge --abort
# → 終止本次merge,並回到merge前的狀態(👍)
$ git pull origin master
# → 從遠程獲取最新版本並merge到本地等同於
$ git fetch origin master + $ git merge origin/master
(前者更安全一些)
$ git push origin master
# → 將本地master分支推送到遠程origin主機的master分支
$ git log xx
# → 查看xx文件的commit記錄
$ git log -p xx
# → 查看xx文件每次提交的diff
$ git log --pretty=oneline xx
# → 查看xx文件提交的歷史記錄(只顯示哈希值和提交說明)
$ git log --pretty=raw
# → 查看commit之間的父子關系(root commit是沒有父提交的)
$ git log --graph
# → 查看當前分支commit生成的樹狀圖
$ git diff HEAD HEAD^1 -- xx
# → 查看xx文件不同版本之間的差異
$ git diff HEAD~1
# → 顯示父節點的提交
git中‘~’和‘^’的區別:
(<commit>|HEAD)^n,指的是HEAD的第n個父提交,可以通過在“^”后面跟上一個數字,表示第幾個父提交,“^”相當“^1”。例如:HEAD^2 表示HEAD的第二次父提交。(<commit>|HEAD)~n,指的是HEAD的第n個祖先提交,可以通過在“~”后面跟上一個數字,表示第幾個祖父提交,“~”相當“~1”,“~n”相當於連續的<n>個“^”。例如:HEAD~2 表示HEAD的第一個父提交的第一個父提交。
等式1:HEAD~ === HEAD^ === HEAD^1
等式2:HEAD~2 === HEAD^^ === HEAD^1^1
$ git diff --staged/--cached
# → 顯示暫存區和上一次提交的不同,git add之前忘diff的后悔葯(👍)
$ git show --stat
# → 查看最后一次的修改
$ git show HEAD
# → 查看指定版本的修改(可省略HEAD,默認當前版本) 同上
$ git show HEAD xxx
# → 查看指定版本xx文件的修改(可省略HEAD,默認當前版本)
$ git reset --hard HEAD
# → 回滾到指定版本,同時清空工作目錄的所有改動
$ git reset --soft HEAD
# → 回滾到指定版本,同時保留工作目錄和暫存區的內容,並把重置的位置所導致的新的文件差異放進暫存區(👍)
$ git reset --mixed HEAD
# → (默認)回滾到指定版本,同時保留工作目錄的內容,並清空暫存區(👍)
$ git reset --hard origin/master
# → 將本地master與遠程master同步
--hard --soft --mixed
的區別可用下圖表示:
假設當前commit和工作目錄如下所示:

1、如果這時你執行:
git reset --hard HEAD^

改動全部消失,未跟蹤文件除外⬆️
git show --stat查看此時對應的當前commit⬆️
2、如果這時你執行:
git reset --soft HEAD^
reset之前commit的改動被放進暫存區,並保留了工作目錄⬆️
git show --stat查看此時對應的當前commit⬆️
3、如果這時你執行:
git reset --mixed HEAD^
同--soft一樣保留了工作目錄,但暫存區被全部被清空,之前commit的改動被放到未追蹤文件中⬆️

git show --stat查看此時對應的當前commit⬆️
$ git reflog show --date=iso <branch name>
# → 查看分支的創建時間
$ git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d
# → 刪除在遠程已被刪除的本地分支 (慎用)

$ git remote show origin
# → 查看remote地址,遠程分支,還有本地分支與之相對應關系等信息。

$ git remote prune origin
# → 刪除了那些遠程倉庫不存在的分支 === git fetch -p
$ git config
# → 查看和編輯git的配置
格式:git config [--local|--global|--system] -l
$ git config --local -l
# → 查看倉庫級的config
$ git config --global -l
# → 查看全局級的config
格式:git config [--local|--global|--system] -e
$ git config --local -e
# → 編輯倉庫級的config
$ git config --global -e
# → 編輯全局級的config
格式:git config [--local|--global|--system] section.key value
$ git config --local push.default 'simple'
# → 修改倉庫級的push.default的默認行為
$ git config --global push.default 'current'
# → 修改全局級的push.default的默認行為
增加
格式: git config [--local|--global|--system] --add section.key value(默認是添加在local配置中)
$ git config --add cat.name songhw
# → local配置寫入 cat.name = songhw
$ git config --local --add cat.name songhw
# → 等同於上一步
$ git config --global --add cat.name lhammer
# → global配置寫入 cat.name = lhammer
格式:git config [--local|--global|--system] --get section.key(默認是獲取local配置中內容)
$ git config --get cat.name
# → 輸出songhw
$ git config --local --get cat.name
# → 輸出結果同上一步
$ git config --global --get cat.name
# → 輸出lhammer
格式:git config [--local|--global|--system] --unset section.key
$ git config --local --unset cat.name
# → 刪除local配置中的cat.name = songhw
$ git config --global --unset cat.name
# → 刪除local配置中的cat.name = lhammer

$ git rebase master
# → 在當前分支對master執行rebase
$ git rebase -i 目標commit
# → 修改歷史某一次提交
把需要修改的commit對應的操作指令從pick改為edit

$ git
rebase --continue
# → 接上一步修改完之后,繼續rebase
$ git
rebase --onto HEAD HEAD^1 <branchname> # → 撤銷指定的commit,即消失在歷史中

$ git push origin <brancename> -f
# → 忽略沖突,強制提交
$ git revert HEAD
# → 撤銷指定的commit(👍)
git revert和git rebase --onto的區別:
git revert會增加一條新的commit,它的內容與指定commit的修改是相反的,兩次相互抵消從而達到撤銷的效果,並且在commit歷史中,會存在兩條提交,一條原始commit,一條它的反轉commit,而git rebase --onto是直接將commit從歷史記錄中直接刪除。
$ git reflog HEAD
# → 查看git倉庫中引用的移動記錄,默認顯示HEAD的移動記錄
$ git checkout HEAD(c08de9a)
# →
c08de9a為brance刪除之前所在的位置
$ git checkout -b <brancename>
# → 重新創建<brancename>,找回刪除的分支
注:不再被引用直接或間接指向的commit會在一定的時間被git回收,所以通過reflog操作找回刪除的分支一定要及時,不然有可能由於commit被回收導致永遠也找不回了
$ git tag
# → 列出所有<code>tag</code>
$ git tag -l version1.*
# → 只會列出1.幾的版本
$ git tag <tagname>(version 1.0)
# → 創建輕量級的<code>tag</code>
$ git tag -a <tagname>(version1.0) -m 'first version'
# → 創建帶有信息的<code>tag</code>
$ git tag -d <tagname>(version 1.0)
# → 刪除指定<code>tag</code>
$ git checkout <tagname>(version 1.0)
# → 檢出指定<code>tag</code>
作者:LHammer
鏈接:https://juejin.im/post/5a2cdfe26fb9a0452936b07f
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。