動畫圖解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。
![](//img2020.cnblogs.com/blog/1837087/202004/1837087-20200430220707113-449163643.gif)
與合併相比,一個很大的區別是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}就可以了。


作者:碼農架構

本文版權歸作者和部落格園共有,歡迎轉載,歡迎關注微信公眾號”碼農架構”-專註於系統架構、高可用、高性能、高並發類技術分享。


Tags: