動畫圖解Git命令
Git是一個開源的分散式版本控制系統,可以有效、高速的處理從很小到非常大的項目版本管理,是目前使用範圍最廣的版本管理工具
儘管Git是一個非常強大的工具,但我認為大多數人都會同意我的說法,即它也可以是。。。徹頭徹尾的噩夢😐 一直覺得在腦海中想像使用Git時發生的事情非常有用:當我執行某個命令時,分支是如何交互的,它將如何影響歷史?國外來自英屬哥倫比亞的程式媛 Lydia Hallie《CS Visualized: Useful Git Commands》。在這篇文章裡面,她通過生動形象的動畫,以更加直觀的方式,向開發者展示 Git 命令中的 merge、rebase、reset、revert、cherry-pick 等常用騷操作的具體原理
1.Git | Merging (git merge)
– Fast-forward (–ff)
噹噹前分支與正在合併的分支相比沒有額外提交時,可能會發生快速向前合併,Git首先嘗試執行最簡單的選擇 Fast-forward 模式合併不會創建新的提交,而是合併當前分支中合併的分支上的提交
現在,在dev分支上所做的所有更改都在master分支上可用。那麼,No-fast-foward 是怎麼回事?
– No-fast-foward (–no-ff)
如果您當前的分支與要合併的分支相比沒有任何額外的提交,那就太好了,但不幸的是,這種情況很少發生!如果我們在當前分支上提交了要合併的分支沒有的更改,git將執行No-fast-foward 合併。使用No-fast-foward合併,Git在活動分支上創建一個新的合併提交。提交的父提交指向活動分支和要合併的分支!
合併衝突修復的過程 ,動畫演示如下:
完美的合併!🎉 主分支現在包含我們對dev分支所做的所有更改
2.Git | Rebasing (git rebase)
儘管Git擅長於決定如何合併分支並添加對文件的更改,但它不能總是獨自做出這個決定;當我們試圖合併的兩個分支在同一文件的同一行上有更改,或者如果一個分支刪除了另一個分支修改的文件,等等,都可能發生這種情況。
在這種情況下,Git將要求您幫助決定我們要保留的兩個選項中的哪一個!假設在兩個分支上
當嘗試合併分支時,Git將顯示衝突發生的位置。我們可以手動刪除不想保留的更改,保存更改,再次添加更改的文件,並提交更改
我們剛剛看到了如何通過執行git合併將更改從一個分支應用到另一個分支。將更改從一個分支添加到另一個分支的另一種方法是執行git rebase。

與合併相比,一個很大的區別是Git不會試圖找出要保留和不保留哪些文件。我們正在重新調整的分支總是有我們想要保留的最新更改!這樣就不會遇到任何合併衝突,並保持良好的線性Git歷史記錄
此示例顯示主分支上的重新調整。然而,在更大的項目中,你通常不想這樣做。
當您正在處理一個特性分支,並且主分支已經更新時,重新調整是非常好的。您可以獲得分支上的所有更新,這將防止將來的合併衝突!
> git rebase還提供了 6 種操作模式:
– reword:修改提交資訊
– edit:修改此提交
– squash:將當前提交合併到之前的提交中
– fixup:將當前提交合併到之前的提交中,不保留提交日誌消息
– exec:在每一個需要變基的提交上執行一條命令
drop:刪除提交
以 drop 為例:
或者,如果我們想將多個提交壓縮在一起以獲得更清晰的歷史記錄,沒問題!
以 squash 為例:
互動式重定基可讓您對試圖重定基址的提交有很大的控制權,即使在當前活動的分支上也是如此!
3.Git | Resetting(git reset)
以下圖為例:9e78i 提交添加了 style.css 文件,035cc 提交添加了 index.js 文件。使用軟重置,我們可以撤銷提交記錄,但是保留新建的 style.css 和 index.js 文件。
– Hard reset硬重置
硬重置時:無需保留提交已有的修改,直接將當前分支的狀態恢復到某個特定提交下。需要注意的是,硬重置還會將當前工作目錄(working directory)中的文件、已暫存文件(staged files)全部移除!如下圖所示:
4.Git | Reverting (git revert)
舉個例子,我們在 ec5be 上添加了 index.js 文件。之後發現並不需要這個文件。那麼就可以使用 git revert ec5be 指令還原之前的更改。如下圖所示:
5.Git | Cherry-picking(git cherry-pick)
舉個例子:dev 分支上的 76d12 提交添加了 index.js 文件,我們需要將本次提交更改加入到 master 分支,那麼就可以使用 git cherry-pick 76d12 單獨檢出這條記錄修改。如下圖所示:
6.Git | Fetching (git fetch)
使用 git fetch 指令將遠程分支上的最新的修改下載下來。
7.Git | Pulling (git pull)
git pull 指令實際做了兩件事:git fetch 和 git merge。
如下圖所示:
8.Git | Reflog (git reflog)
git reflog 用於顯示所有已執行操作的日誌!包括合併、重置、還原,也就是記錄了對分支的一切更改行為。
如果,你不想合併 origin/master 分支了。就需要執行 git reflog 命令,合併之前的倉庫狀態位於 HEAD@{1} 這個地方,所以我們使用 git reset 指令將 HEAD 頭指向 HEAD@{1}就可以了。
作者:碼農架構
本文版權歸作者和部落格園共有,歡迎轉載,歡迎關注微信公眾號”碼農架構”-專註於系統架構、高可用、高性能、高並發類技術分享。