?Git 常用操作總結

LHammer發表於2018-04-01
使用Git差不多有一年了,命令列也用的越來越多,所以把工作中常用到的操作在這裡總結一下,以便更好的回顧與查詢。

我司Git基本工作流程:

$ git co(checkout) -b develop   # → 建立開發分支develop

$ git push   # → 推送當前分支(develop)到遠端倉庫

------------遵循小批量提交原則------------

$ git st(status)   # → 檢視當前分支工作區、暫存區的工作狀態

$ git diff   # → diff檔案的修改(⚠️很重要很重要很重要) 

$ git ci(commit) .   # → 提交本次修改

------------以上三步使用最頻繁-----------

$ git fetch --all   # → 拉取所有遠端的最新程式碼 

$ git merge origin/develop   # → 如果是多人協作,merge同事的修改到當前分支(先人後己原則)

$ git merge origin/master   # → 上線之前保證當前分支不落後於遠端origin/master,一定要merge遠端origin/master到當前分支 

$ git push   # → 推送當前分支到遠端倉庫 

$ git merge --no-ff origin/develop   # → 同事review code之後管理員合併origin/develop到遠端主幹origin/master

--------分--------割--------線--------

? 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 pull origin master --allow-unrelated-histories   # → 允許合併兩個不同專案的歷史記錄

$ 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(建議使用?)

?Git 常用操作總結在 vi 下 commit 時,會展示當前分支及本次提交所修改檔案等資訊,如果發現提交有誤,可以及時撤銷本次提交(當然提交之後也可以撤銷,只是稍麻煩一些),相對粗暴式-m提交要更友好更安全一些~

git commit --amend # → 將暫存區和當前commit合併建立一個新commit去替換當前commit

git stash # → 把當前的工作隱藏起來 等以後恢復現場後繼續工作

?Git 常用操作總結

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

?Git 常用操作總結

git fetch --all  # → 將遠端主機的更新全部取回本地

git merge origin/master  # → 在本地(當前)分支上合併遠端分支 

$ git merge --no-ff origin/develop   # → 在本地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 remote add origin ssh://git@139.129.97.36:10022/fe-dev.git   # → 關聯遠端倉庫


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 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複製程式碼

gitrebase --continue  # → 接上一步修改完之後,繼續rebase

$ gitrebase --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>

……

refs:


相關文章