我的學習途徑主要如下幾個:css
我的比較推薦第二個Git學習網站猴子都能懂的git,圖文結合,簡單明瞭,本文將介紹一些經常使用 Git 指令,做爲一個學習總結html
git rebase
git merge
git reset
git revert
git cherry-pick
git fetch
git pull
git reflog
對於merge而言,又有兩個合併策略:git
fast-forward
no-fast-forward
假設bugfix分支是從master分支分叉出來的,以這個圖做爲初始分支狀態 bash
git merge默認採用fast-forward的方式,執行git merge等同於執行git merge --ff
,–ff是fast-forward的簡寫。特色:學習
--no-ff 指的是強行關閉fast-forward方式,使得每一次的合併都建立一個新的commit記錄。完整的命令以下fetch
//即在合併分支命令加入 --no-ff 後綴的方式運行
$ git merge --no-ff -m "merge with no-ff" dev
複製代碼
//第一種方案:全局設置禁用fast-forward
git config --global --add merge.ff false
//第二種方案:某個分支單獨禁用fast-forward
git config branch.【分支名】.mergeoptions "--no-ff"
複製代碼
reabse和merge其實均可以看做爲合併操做,rebase 的優點就是能夠創造更線性的提交歷史,仍是以這張圖爲列 動畫
//rebase bugfix分支到master分支
➜ ~ git:(master) ✗ git rebase bugfix
複製代碼
~ git:(bugFix) ✗ git checkout master
~ git:(master) ✗ git merge bugFix 或者git rebase bugFix
複製代碼
因爲篇幅緣由,有興趣的能夠在瞭解下交互式變基,交互式變基修改commit,如commit的合併、順序調整、commit的提交日誌修改。網站
撤銷變動方式有兩種。其中一種就是git reset(控制當前分支回撤到某次提交時的狀態。),這個部分這篇文章小姐姐用動畫圖解Git講的相對好一些spa
最大的特色:撤回到特定提交以後,已有的修改會保留3d
如下圖爲例:9e78i 提交添加了 style.css 文件,035cc 提交添加了 index.js 文件。使用軟重置,咱們能夠撤銷提交記錄,可是保留新建的 style.css 和 index.js 文件。
最大的特色:無需保留提交已有的修改,直接將當前分支的狀態恢復到某個特定提交下,,硬重置還會將當前工做目錄(working directory)中的文件、已暫存文件(staged files)所有移除
雖然在你的本地分支中使用 git reset 很方便,可是這種「改寫歷史」
的方法對你們一塊兒使用的遠程分支是無效的,因此要使用revert
git revert ec5be
指令還原以前的更改
若是某個分支上的某次提交的修改正是當前分支須要的,那咱們可使用 git cherry-pick
命令檢出某次的提交更改,做爲新的提交添加到當前分支上面
//命令形式爲:
git cherry-pick <提交號>...
複製代碼
好比:dev 分支上的 76d12 提交添加了 index.js 文件,咱們須要將本次提交更改加入到 master 分支,那麼就可使用 git cherry-pick 76d12
單獨檢出這條記錄修改。
好比:你和你的同事在master分支上工做,若是你的同事將他作的更改提交到了遠程分支上(orgin/master
),而這些提交是你本地沒有的,此時,就要使用 git fetch
指令將遠程分支上的最新的修改下載下來
git pull
指令實際作了兩件事:git fetch
和 git merge
這裏,至關於在get fetch基礎上,移動了Head指針
。這裏就不具體闡述了
git reflog 是一個很是有用的命令,用於顯示全部已執行操做的日誌!包括合併、重置、還原:基本上記錄了對分支的任何更
能夠更新先前的commit的提交信息,而且本地倉庫中並不會產生一個新的commit
可能你遇到過想要合併多個 commit 爲一個,這時候就能夠用squash merge
把某個分支上的全部提交都合併成一個提交
git merge --squash 分支名
複製代碼