10 大 Git 命令動圖學習版來嘍 這下總該過目不忘了

2020-09-17 上海大數據股份

如果你還有些分不清楚Git merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……這些 git 命令執行,你有必要收藏一下這篇乾貨。這是Lydia Hallie小姐姐在使用「複雜」的Git時,痛定思痛決定用動圖形式直觀地介紹了這些常用 git 命令的工作過程,包你過目不忘。

合併

擁有多個分支是很方便的,這樣可以將不同的新修改互相隔離開,而且還能確保你不會意外地向生產代碼推送未經許可或破損的代碼修改。但一旦這些修改得到了批准許可,我們就需要將其部署到我們的生產分支中!

可將一個分支的修改融入到另一個分支的一種方式是執行 git merge。Git 可執行兩種類型的合併:fast-forward 和 no-fast-forward。現在你可能分不清,但我們馬上就來看看它們的差異所在。

  • Fast-forward (—ff)

在當前分支相比於我們要合併的分支沒有額外的提交(commit)時,可以執行 fast-forward 合併。Git 很懶,首先會嘗試執行最簡單的選項:fast-forward!這類合併不會創建新的提交,而是會將我們正在合併的分支上的提交直接合併到當前分支。

完美!現在,我們在 dev 分支上所做的所有改變都合併到了 master 分支上。那麼 no-fast-forward 又是什麼意思呢?

  • No-fast-foward (—no-ff)

如果你的當前分支相比於你想要合併的分支沒有任何提交,那當然很好,但很遺憾現實情況很少如此!如果我們在當前分支上提交我們想要合併的分支不具備的改變,那麼 git 將會執行 no-fast-forward 合併。

使用 no-fast-forward 合併時,Git 會在當前活動分支上創建新的 merging commit。這個提交的父提交(parent commit)即指向這個活動分支,也指向我們想要合併的分支!

沒什麼大不了的,完美的合併!現在,我們在 dev 分支上所做的所有改變都合併到了 master 分支上。

合併衝突

儘管 Git 能夠很好地決定如何合併分支以及如何向文件添加修改,但它並不總是能完全自己做決定。當我們想要合併的兩個分支的同一文件中的同一行代碼上有不同的修改,或者一個分支刪除了一個文件而另一個分支修改了這個文件時,Git 就不知道如何取捨了。

在這樣的情況下,Git 會詢問你想要保留哪種選擇?假設在這兩個分支中,我們都編輯了 README.md 的第一行。

如果我們想把 dev 合併到 master,就會出現一個合併衝突:你想要標題是 Hello! 還是 Hey!?

當嘗試合併這些分支時,Git 會向你展示衝突出現的位置。我們可以手動移除我們不想保留的修改,保存這些修改,再次添加這個已修改的文件,然後提交這些修改。

完成!儘管合併衝突往往很讓人厭煩,但這是合理的:Git 不應該瞎猜我們想要保留哪些修改。

變基(Rebasing)

我們剛看到可通過執行 git merge 將一個分支的修改應用到另一個分支。另一種可將一個分支的修改融入到另一個分支的方式是執行 git rebase。

git rebase 會將當前分支的提交複製到指定的分支之上。

完美,現在我們在 dev 分支上獲取了 master 分支上的所有修改。

變基與合併有一個重大的區別:Git 不會嘗試確定要保留或不保留哪些文件。我們執行 rebase 的分支總是含有我們想要保留的最新近的修改!這樣我們不會遇到任何合併衝突,而且可以保留一個漂亮的、線性的 Git 歷史記錄。

交互式變基(Interactive Rebase)

提交執行變基之前,我們可以修改它們!我們可以使用交互式變基來完成這一任務。交互式變基在你當前開發的分支上以及想要修改某些提交時會很有用。

在我們正在 rebase 的提交上,我們可以執行以下 6 個動作:

  • reword:修改提交信息;
  • edit:修改此提交;
  • squash:將提交融合到前一個提交中;
  • fixup:將提交融合到前一個提交中,不保留該提交的日誌消息;
  • exec:在每個提交上運行我們想要 rebase 的命令;
  • drop:移除該提交。

很棒!這樣我們就能完全控制我們的提交了。如果你想要移除一個提交,只需 drop 即可。

如果你想把多個提交融合到一起以便得到清晰的提交歷史,那也沒有問題!

交互式變基能為你在 rebase 時提供大量控制,甚至可以控制當前的活動分支。

重置(Resetting)

當我們不想要之前提交的修改時,就會用到這個命令。也許這是一個 WIP 提交或者可能是引入了 bug 的提交,這時候就要執行 git reset。

git reset 能讓我們不再使用當前檯面上的文件,讓我們可以控制 HEAD 應該指向的位置。

  • 軟重置

軟重置會將 HEAD 移至指定的提交(或與 HEAD 相比的提交的索引),而不會移除該提交之後加入的修改!

假設我們不想保留添加了一個 style.css 文件的提交 9e78i,而且我們也不想保留添加了一個 index.js 文件的提交 035cc。但是,我們確實又想要保留新添加的 style.css 和 index.js 文件!這是軟重置的一個完美用例。

輸入 git status 後,你會看到我們仍然可以訪問在之前的提交上做過的所有修改。這很好,這意味著我們可以修復這些文件的內容,之後再重新提交它們!

  • 硬重置

有時候我們並不想保留特定提交引入的修改。不同於軟重置,我們應該再也無需訪問它們。Git 應該直接將整體狀態直接重置到特定提交之前的狀態:這甚至包括你在工作目錄中和暫存文件上的修改。

Git 丟棄了 9e78i 和 035cc 引入的修改,並將狀態重置到了 ec5be 的狀態。

還原(Reverting)

另一種撤銷修改的方法是執行 git revert。通過對特定的提交執行還原操作,我們會創建一個包含已還原修改的新提交。

假設 ec5be 添加了一個 index.js 文件。但之後我們發現其實我們再也不需要由這個提交引入的修改了。那就還原 ec5be 提交吧!

揀選(Cherry-picking)

當一個特定分支包含我們的活動分支需要的某個提交時,我們對那個提交執行 cherry-pick!對一個提交執行 cherry-pick 時,我們會在活動分支上創建一個新的提交,其中包含由揀選出來的提交所引入的修改。

假設 dev 分支上的提交 76d12 為 index.js 文件添加了一項修改,而我們希望將其整合到 master 分支中。我們並不想要整個 dev 分支,而只需要這個提交!

取回(Fetching)

如果你有一個遠程 Git 分支,比如在 GitHub 上的分支,當遠程分支上包含當前分支沒有的提交時,可以使用取回。比如當合併了另一個分支或你的同事推送了一個快速修復時。

通過在這個遠程分支上執行 git fetch,我們就可在本地獲取這些修改。這不會以任何方式影響你的本地分支:fetch 只是單純地下載新的數據而已。

拉取(Pulling)

儘管 git fetch 可用於獲取某個分支的遠程信息,但我們也可以執行 git pull。git pull 實際上是兩個命令合成了一個:git fetch 和 git merge。當我們從來源拉取修改時,我們首先是像 git fetch 那樣取回所有數據,然後最新的修改會自動合併到本地分支中。

Reflog

git reflog 是一個非常有用的命令,可以展示已經執行過的所有動作的日誌。包括合併、重置、還原,基本上包含你對你的分支所做的任何修改。

如果你犯了錯,你可以根據 reflog 提供的信息通過重置 HEAD 來輕鬆地重做!

假設我們實際上並不需要合併原有分支。當我們執行 git reflog 命令時,我們可以看到這個 repo 的狀態在合併前位於 HEAD@{1}。那我們就執行一次 git reset,將 HEAD 重新指向在 HEAD@{1} 的位置。

可以看到最新的動作已被推送給 reflog。

以上就是本期分享乾貨,你都學會了嘛!

文章部分素材來源:程序猿

相關焦點

  • 工作流一目了然,看小姐姐用動圖展示10大Git命令
    merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……你知道這些 git 命令執行的究竟是什麼任務嗎?如果你還有些分不清楚,那千萬不能錯過這篇文章。在本文中,熟知 JavaScript、TypeScript、GraphQL、Serverless、AWS、Docker 和 Golang 的 21 歲年輕軟體顧問 Lydia Hallie 通過動圖形式直觀地介紹了這些常用 git 命令的工作過程,包你過目不忘。
  • 記不住Git那麼命令?動圖展示10個Git常用命令,建議收藏
    Git merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……你知道這些 git 命令執行的究竟是什麼任務嗎?如果你還有些分不清楚,那千萬不能錯過這篇文章。
  • git 命令初探二
    git 的學習必須要明白分布式管理的模式,如上圖需要牢記,這樣你操作起來更加得心應手說明:workspace:工作區staging area:暫存區/緩存區local repository:或本地倉庫remote repository:遠程倉庫明白上面的圖例後我們緊接著學習git的分支管理,這是一個很輕大的版本控制,很多優點,可以自行百度一查
  • git 命令初探一
    根據上一次的git 的環境搭建,今天小編帶來進一步的學習,今天學習一些git的命令,怎麼建立倉庫管理自己的項目文件等,廢話不多說,直接開始講解。首先默認各位看官已經學習了上一篇的環境搭建,不知道的再回頭看一看吧,再看這篇文章。
  • 一看就懂:十幾張動圖教你快速學會Git命令!
    從一個分支獲取變更到另一個分支的方式之一是執行​git merge​命令。Git 有兩類合併操作:​fast-forward​ 和​no-fast-forward​。這麼說你可能沒什麼概念,我們來看看區別吧。
  • 這才是真正的Git——Git實用技巧詳解
    這篇文章因為更多的是列舉實際應用的技巧,所以文章結構會顯得散亂一些,也不會像前兩篇文章那樣要求大家順序閱讀。每個點都是互相獨立的,大家可以根據自己的需要學習。在這篇文章裡我會使用操作錄屏的方式來介紹例子,希望這種方式可以讓你更直觀的了解命令的使用方法。
  • 通過圖解的方式學習常用Git命令
    本文通過圖解的方式介紹git 中的最常用命令。如果你稍微理解 git 的工作原理,這篇文章能夠讓你理解的更透徹。基本用法上面的四條命令在工作目錄、stage 緩存(也叫做索引)和 commit 歷史之間複製文件。
  • 你可能不太會用的10個Git命令
    選自towardsdatascience作者:Jeff Hale機器之心編譯參與:李詩萌、Chita本文討論的是開發人員、數據科學家或產品經理應該了解的各種 Git 命令。我們將了解該如何用 Git 進行檢查、刪除和整理操作。我們還將介紹如何用 Bash 別名和 Git 編輯器配置來逃避 Vim 以節省時間。
  • Git命令的動畫展示,讓我們學習Git事半功倍
    如果我們在當前分支上提交了要合併的分支所沒有的更改,則git將執行no-fast-forward合併。通過無快進合併,Git 在活動分支上創建了一個新的合併提交。提交的父提交既指向活動分支又指向我們要合併的分支!沒什麼大不了的,完美的合併! master現在,分支包含我們在dev分支上所做的所有更改。
  • Git入門之四-Git本地基礎操作命令使用
    在上節介紹完Git的基礎概念Git入門之三-Git的基礎概念之後,本節我來根據以下流程圖介紹一下Git本地倉庫、暫存區及工作區之間的基礎操作命令,請對照流程圖中的內容及之後的命令介紹以便更好的理解命令的作用。
  • 熟悉Git使用的一些實操練習命令
    關於Git文檔,有官方的文檔(中文版)、其他一些文檔,還有我總結的gitlabFAQ(github:/bollwarm/gitlabFAQ)提到一些信息,以及我發的很多相關文章都是很好的學習材料。但是有時候可能要的是不需要深思熟慮、不需要深究細節的信手粘來的"傻瓜"式實操文檔。所以今天蟲蟲就給你總結了這樣一份材料,供你跟著實際操作聯繫。
  • 《git-簡明指導》學習記錄
    閱讀《git - 簡明指南/(git-the simple guide)》(http://rogerdudler.github.io/git-guide/index.zh.html)學習筆記,作者:Roger Dudler 羅傑·杜德勒以下只是個人學習記錄,如果要看教程,請直接點擊上面的書名,上面的教程再清楚不過了;git 安裝
  • git常用命令整理
    --hard <1094a> 回退到制定版本git reflog 查看每次命令的commit idgit checkout -- <file name> 把文件在工作區的修改全部撤銷,回到暫存區狀態(消除 add .
  • 不會 git 命令沒關係!通過 pycharm 玩轉 git
    前言小夥伴們,大家好,木森老師今天又來免費分享技能啦 ! 今天分享的是在pycharm中如何使用git去github上拉取和提交代碼。git這個工具相信大家都聽說過,只不過很多小夥伴不會git的命令或者命令記得不太清楚,並沒有熟練掌握這個工具的使用。那麼今天在這個給大家分享一個不用命令來操作git的方法,就是通過我們python的IED工具pycharm來操作git(註:主要面向正在使用python的小夥伴),接下來直接進入主題!
  • 學習git這一篇就夠了
    >當前項目下的.git文件夾下的config文件中。git是以行為單位來管理版本的,所以cccccccc表示為刪除,cccccccc@@@@@@表示為追加。$ WebService %遠程倉庫克隆說明當我們想從github或者碼雲下載他人的項目進行學習閱讀的時候,我們可以使用克隆命令。
  • 你應該知道的10個Git命令(附連結)
    在本文中,我們將討論作為開發人員、數據科學家或產品經理應該了解的各種Git命令,如何使用Git進行檢查、刪除和整理,以及如何通過Bash別名和Git編輯器配置來逃避Vim並節省時間。這裡有10個要知道的命令和一些常見的標誌。每個命令都連結到該命令的Atlassian Bitbucket指南。檢查事項讓我們先看一下檢查變化。
  • Git命令解析 - init、add、commit
    由此引出三個邏輯區域,他們和文件狀態以及部分對應操作的關係如下圖。高層命令和底層命令:Git 最初是一套面向版本控制系統的工具集,它包含很多用於完成底層工作的命令。這些命令被設計成能以UNIX 命令行的風格連接,或由腳本調用來完成更複雜的工作。
  • 你需要知道的 12 個 Git 高級命令
    學習Git,首先當然是學習Git的基本工作流。相比於SVN等傳統版本控制系統來說,Git是專為分布式版本控制而生的強大工具。使用Git時常用的命令有pull、commit、push等,貌似很簡單。不過,有時你會遇到合併衝突的情況,Git這時會將衝突標記出來,需要你手工來解決。有時,你會不小心將代碼提交到錯誤的分支上,並且又推送到了遠程倉庫。
  • git進階命令
    對git很多人只知道clone、pull、push,作為強大的命令行工具,git有很多方便易用的命令行,這篇主要收集git命令使用的一些常用小技巧。git stash應用場景當正在某個分支A上開發某個項目,這時項目中出現一個bug需要緊急修復,但是正在開發的內容只是完成一半還不想提交,這時git stash命令可以將修改的內容保存至堆棧區
  • 這7個常用Git命令或概念你都知道嗎?
    全文共1667字,預計學習時長5分鐘以「; 」(分號)分隔的多個git命令以分號分隔可使用多個Git命令:$ git --version; git branch // separated by semi-colon