【Git】616- git命令的進階和複習(帶動圖效果)

作者:老鄭的技術雜貨鋪
鏈接:

https://juejin.im/post/5e9e49356fb9a03c917fe7fd

1. 學習途徑

個人學習途徑主要以下幾個:

  • learnGit在線學習

  • 猴子都能懂的git

  • 小姐姐用動畫圖解Git

個人比較推薦第二個Git學習網站猴子都能懂的git,圖文結合,簡單明瞭,本文將介紹一些常用 Git 指令,作爲一個學習總結

  • git rebase

  • git merge

  • git reset

  • git revert

  • git cherry-pick

  • git fetch

  • git pull

  • git reflog


2. 分支的合併(merge)

對於merge而言,又有兩個合併策略:

  • fast-forward

  • no-fast-forward

假設bugfix分支是從master分支分叉出來的,以這個圖作爲初始分支狀態

2.1 fast-forward

git merge默認採用fast-forward的方式,執行git merge等同於執行git merge --ff,–ff是fast-forward的簡寫。特點:

  • 快進操作:只更新指針的指向,不會創造一個新的commit節點。

  • 缺點:一旦刪除分支或者分支指針往前走,會丟掉分支信息(原來這個分支的做了什麼在log中體現不出來)

  • 觸發時機:合併 bugfix分支到master分支時,如果master分支的狀態沒有被更改過,這樣的合併被稱爲fast-forward(快進)合併


2.2 no-fast-forward

--no-ff 指的是強行關閉fast-forward方式,使得每一次的合併都創建一個新的commit記錄。完整的命令如下

//即在合併分支命令加入 --no-ff 後綴的方式運行
$ git merge --no-ff -m "merge with no-ff" dev
  • 如何設置默認爲no-fast-forward模式


//第一種方案:全局設置禁用fast-forwardgit config --global --add merge.ff false//第二種方案:某個分支單獨禁用fast-forwardgit config branch.【分支名】.mergeoptions  "--no-ff"
  • 觸發時機:
    比如master分支的歷史記錄有可能在bugfix分支分叉出去後有新的更新。

    此時如果把bugFix合併到master,合併兩個修改會生成一個提交。這時,master分支的HEAD會移動到該提交上。


3. 變基(rebase)

reabse和merge其實都可以看作爲合併操作,rebase 的優勢就是可以創造更線性的提交歷史,還是以這張圖爲列

執行以下命令:

//rebase bugfix分支到master分支
➜  ~ git:(master) ✗ git rebase bugfix

現在 bugFix 分支上的工作在 master 的最頂端,同時我們也得到了一個更線性的提交序列。rebase之後,唯一的問題就是 master的HEAD位置還沒有更新。所以需要【將master的HEAD移動到bugfix的HEAD

~ git:(bugFix) ✗ git checkout master
~ git:(master) ✗ git merge bugFix 或者git rebase  bugFix

由於篇幅原因,有興趣的可以在瞭解下交互式變基,交互式變基修改commit,如commit的合併、順序調整、commit的提交日誌修改。


4. 重置(reset)

撤銷變更方式有兩種。其中一種就是git reset(控制當前分支回撤到某次提交時的狀態。),這個部分這篇文章小姐姐用動畫圖解Git講的相對好一些


4.1 軟重置

最大的特點:撤回到特定提交之後,已有的修改會保留

以下圖爲例:9e78i 提交添加了 style.css 文件,035cc 提交添加了 index.js 文件。使用軟重置,我們可以撤銷提交記錄,但是保留新建的 style.css 和 index.js 文件。

4.2 硬重置

最大的特點:無需保留提交已有的修改,直接將當前分支的狀態恢復到某個特定提交下,,硬重置還會將當前工作目錄(working directory)中的文件、已暫存文件(staged files)全部移除


使用 git status 查看,發現當前操作空間空空如也。Git 丟棄了 9e78i 和 035cc 兩次提交引入的修改,將倉庫重置到 ec5be 時的狀態

5. 還原(revert)

雖然在你的本地分支中使用 git reset 很方便,但是這種“改寫歷史”的方法對大家一起使用的遠程分支是無效的,所以要使用revert

  • 最大的特點:用於還原某次提交的修改時,會創建一個包含已還原更改的 新提交記錄

  • 比如:我們在 ec5be 上添加了 index.js 文件。之後發現並不需要這個文件,可以執行git revert ec5be 指令還原之前的更改


    新的提交記錄 9e78i 還原了 ec5be 引入的更改。git revert 可以在不修改分支歷史的前提下,還原某次提交引入的更改

6. 檢出提交(cherry-pick)

如果某個分支上的某次提交的修改正是當前分支需要的,那我們可以使用 git cherry-pick 命令檢出某次的提交更改,作爲新的提交添加到當前分支上面

//命令形式爲:
git cherry-pick <提交號>...

比如:dev 分支上的 76d12 提交添加了 index.js 文件,我們需要將本次提交更改加入到 master 分支,那麼就可以使用 git cherry-pick 76d12 單獨檢出這條記錄修改。

7 git fetch

比如:你和你的同事在master分支上工作,如果你的同事將他做的更改提交到了遠程分支上(orgin/master),而這些提交是你本地沒有的,此時,就要使用 git fetch指令將遠程分支上的最新的修改下載下來

git fetch 指令並沒有影響本地分支,即head指針位置未改變

8. 拉取(pull)

git pull 指令實際做了兩件事:git fetchgit merge這裏,相當於在get fetch基礎上,移動了Head指針。這裏就不具體闡述了


9. Reflog

git reflog 是一個非常有用的命令,用於顯示所有已執行操作的日誌!包括合併、重置、還原:基本上記錄了對分支的任何更

  • 使用場景:假設你不小心使用 git reset 命令硬重置倉庫到某個提交。後面突然想到,重置導致了一些已有的正常代碼的誤刪


  • demo我們不想合併 origin/master 分支了。執行 git reflog 命令,我們看到合併之前的倉庫狀態位於 HEAD@{1} 這個地方,我們使用 git reset 指令將 HEAD 頭指向 HEAD@{1}


10. 補充

10.1 commit --amend

可以更新先前的commit的提交信息,並且本地倉庫中並不會產生一個新的commit


10.2 squash merge

可能你遇到過想要合併多個 commit 爲一個,這時候就可以用squash merge把某個分支上的所有提交都合併成一個提交

git merge --squash 分支名

1. JavaScript 重溫系列(22篇全)

2. ECMAScript 重溫系列(10篇全)

3. JavaScript設計模式 重溫系列(9篇全)

4. 正則 / 框架 / 算法等 重溫系列(16篇全)

5. Webpack4 入門(上)|| Webpack4 入門(下)

6. MobX 入門(上) ||  MobX 入門(下)

7. 59篇原創系列彙總

回覆“加羣”與大佬們一起交流學習~

點擊“閱讀原文”查看70+篇原創文章

點這,與大家一起分享本文吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章