這位小姐姐用動圖展示了10個Git命令,看完過目不忘!

2022-01-05 EDN電子技術設計
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 是一款非常強大的工具,但如果我說 Git 用起來簡直是噩夢,大多數人也會認同我的說法。我發現在使用 Git 時,在頭腦裡可視化地想像它會非常有用:當我執行一個特定命令時,這些分支會如何交互,又會怎樣影響歷史記錄?為什麼當我在 master 上執行硬重啟,force push 到原分支以及 rimraf 我們的 .git 文件夾時,我的同事哭了?我覺得創建一些最常用且最有用的 Git 命令的可視化示例會是一個完美的用例!下面我將介紹的很多命令都有可選參數——你可以使用這些參數來改變對應命令的行為。而我的示例只會涵蓋命令的默認行為,而不會添加(或添加太多)可選配置!

擁有多個分支是很方便的,這樣可以將不同的新修改互相隔離開,而且還能確保你不會意外地向生產代碼推送未經許可或破損的代碼修改。但一旦這些修改得到了批准許可,我們就需要將其部署到我們的生產分支中!可將一個分支的修改融入到另一個分支的一種方式是執行 git merge。Git 可執行兩種類型的合併:fast-forward 和 no-fast-forward。現在你可能分不清,但我們馬上就來看看它們的差異所在。在當前分支相比於我們要合併的分支沒有額外的提交(commit)時,可以執行 fast-forward 合併。Git 很懶,首先會嘗試執行最簡單的選項:fast-forward!這類合併不會創建新的提交,而是會將我們正在合併的分支上的提交直接合併到當前分支。

完美!現在,我們在 dev 分支上所做的所有改變都合併到了 master 分支上。那麼 no-fast-forward 又是什麼意思呢?如果你的當前分支相比於你想要合併的分支沒有任何提交,那當然很好,但很遺憾現實情況很少如此!如果我們在當前分支上提交我們想要合併的分支不具備的改變,那麼 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 不應該瞎猜我們想要保留哪些修改。

我們剛看到可通過執行 git merge 將一個分支的修改應用到另一個分支。另一種可將一個分支的修改融入到另一個分支的方式是執行 git rebase。git rebase 會將當前分支的提交複製到指定的分支之上。


完美,現在我們在 dev 分支上獲取了 master 分支上的所有修改。變基與合併有一個重大的區別:Git 不會嘗試確定要保留或不保留哪些文件。我們執行 rebase 的分支總是含有我們想要保留的最新近的修改!這樣我們不會遇到任何合併衝突,而且可以保留一個漂亮的、線性的 Git 歷史記錄。上面這個例子展示了在 master 分支上的變基。但是,在更大型的項目中,你通常不需要這樣的操作。git rebase 在為複製的提交創建新的 hash 時會修改項目的歷史記錄。如果你在開發一個 feature 分支並且 master 分支已經更新過,那麼變基就很好用。你可以在你的分支上獲取所有更新,這能防止未來出現合併衝突。交互式變基(Interactive Rebase)在為提交執行變基之前,我們可以修改它們!我們可以使用交互式變基來完成這一任務。交互式變基在你當前開發的分支上以及想要修改某些提交時會很有用。
在我們正在 rebase 的提交上,我們可以執行以下 6 個動作:
很棒!這樣我們就能完全控制我們的提交了。如果你想要移除一個提交,只需 drop 即可。

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

交互式變基能為你在 rebase 時提供大量控制,甚至可以控制當前的活動分支。
當我們不想要之前提交的修改時,就會用到這個命令。也許這是一個 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 的狀態。

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

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

完美!提交 9e78i 還原了由提交 ec5be 引入的修改。在撤銷特定的提交時,git revert 非常有用,同時也不會修改分支的歷史。當一個特定分支包含我們的活動分支需要的某個提交時,我們對那個提交執行 cherry-pick!對一個提交執行 cherry-pick 時,我們會在活動分支上創建一個新的提交,其中包含由揀選出來的提交所引入的修改。假設 dev 分支上的提交 76d12 為 index.js 文件添加了一項修改,而我們希望將其整合到 master 分支中。我們並不想要整個 dev 分支,而只需要這個提交!

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

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

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

很好,我們現在與遠程分支完美同步了,並且也有了所有最新的修改!
每個人都會犯錯,但犯錯其實沒啥!有時候你可能感覺你把 git repo 完全搞壞了,讓你想完全刪了了事。

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

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

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

作者:Lydia Hallie

翻譯:機器之心

來源:https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1

相關焦點

  • 工作流一目了然,看小姐姐用動圖展示10大Git命令
    在本文中,熟知 JavaScript、TypeScript、GraphQL、Serverless、AWS、Docker 和 Golang 的 21 歲年輕軟體顧問 Lydia Hallie 通過動圖形式直觀地介紹了這些常用 git 命令的工作過程,包你過目不忘。
  • 小姐姐用動畫圖解Git命令,一看就懂!
    是啊,要學一門技術真難,何況現在技術更新、迭代這麼快所以,對於學習Git這門技術,要是有一個一看就懂,一學就會的入門資料就好了。前不久,國外的一位小姐姐寫了一篇這樣的文章《CS Visualized: Useful Git Commands》。
  • 【Git】616- git命令的進階和複習(帶動圖效果)
    learnGit在線學習猴子都能懂的git小姐姐用動畫圖解Git個人比較推薦第二個Git學習網站猴子都能懂的git,圖文結合,簡單明了,本文將介紹一些常用 Git 指令,作為一個學習總結git rebasegit mergegit resetgit revertgit cherry-pick
  • 小姐姐用動畫圖解 Git 命令,這也太秀了吧?!
    作者是來自英屬哥倫比亞的小姐姐 Lydia Hallie,在這篇文章裡面,她通過生動形象的動畫,以更加直觀的方式,向開發者展示 Git 命令中的 merge、rebase、reset、revert、cherry-pick 等常用騷操作的具體原理。接下來,小 G 會挑選幾個最簡單的例子,讓你們看看這位小姐姐是如何用動畫來進行展示的。
  • git命令的進階和複習(帶動圖效果)
    連結:https://juejin.im/post/5e9e49356fb9a03c917fe7fd個人學習途徑主要以下幾個:learnGit在線學習猴子都能懂的git小姐姐用動畫圖解Git個人比較推薦第二個Git學習網站猴子都能懂的git,圖文結合,簡單明了,本文將介紹一些常用 Git 指令,作為一個學習總結
  • 你可能不太會用的 10 個 Git 命令
    我們將了解該如何用 Git 進行檢查、刪除和整理操作。我們還將介紹如何用 Bash 別名和 Git 編輯器配置來逃避 Vim 以節省時間。如果你不熟悉基本的 git 命令,在閱讀本文前可以先參考我之前寫的關於 Git 工作流程的文章。
  • 你可能不太會用的10個Git命令
    如果你不熟悉基本的 git 命令,在閱讀本文前可以先參考我之前寫的關於 Git 工作流程的文章。地址:https://towardsdatascience.com/learn-enough-git-to-be-useful-281561eef959本文介紹了 10 個常見的命令以及它們的一些參數。
  • Git命令的動畫展示,讓我們學習Git事半功倍
    前不久,哥倫比亞的一位小姐姐寫了一篇這樣的文章《CS Visualized: Useful Git Commands》,文章裡她通過生動形象的動畫這樣直觀的方式,向開發者展示 Git 命令中的 merge、rebase、reset、revert、cherry-pick 等常用命令的具體原理。下面我們一起看看吧。
  • ​你可能不太會用的10個Git命令
    我們將了解該如何用 Git 進行檢查、刪除和整理操作。我們還將介紹如何用 Bash 別名和 Git 編輯器配置來逃避 Vim 以節省時間。如果你不熟悉基本的 git 命令,在閱讀本文前可以先參考我之前寫的關於 Git 工作流程的文章。
  • Git: 聊聊Rebase命令
    先切換會origin分支,通過pull指令將origjn分支上的最新改動拉取下來。然後在用git checkout mywork切換會mywork分支,到這裡就能用git rebase orgin來進行變基了。
  • 常用的12個Git基本命令
    好在常用的Git命令只有幾個,並且參數都比較簡單,因此,我們會很容易地跨越這個障礙。而剛開始就直接使用GUI工具並不是我們推薦的方式,因為使用GUI不僅效率慢,還會使得你根本不了解Git本身的工作機制,一旦出現問題你將不能手動進行解決。因此,要使用GUI也要建立在能夠熟悉Git基本命令的前提下。
  • Git命令大全
    Android Studio 的 git插件 用起來很溜(當然還有其他一些工具),它們的本質都是git命令的UI化封裝。本文的命令算是很全面了,看不完沒關係,但是一定要記得收藏哦~~24隋心所欲 的博客地址:http://24suixinsuoyu.comgit init初始化一個 Git 倉庫(repository),即把當前所在目錄變成
  • 我說小夥子,你死記Git命令,不好使
    在開始本篇文章之前,我們可以先試著回答以下幾個問題:如果有感到很模糊的,那麼建議還是往下仔細看看文章吧~三大分區我們首先用一張圖來理解工作區、暫存區和倉庫的位置:我們先看由下而上的路徑,首先工作區就是我們當前的文件目錄,我們改完代碼,用git add命令把當前文件加入暫存區,然後git commit把暫存區生成的快照提交到本地倉庫,最後再用git push命令把本地倉庫的提交複製到遠程倉庫
  • Git常用命令總結
    git log --stat: show diffstat of changes introduced at each commit.     同樣是用來看改動的相對信息的,--stat比-p的輸出更簡單一些.
  • 你應該知道的10個Git命令(附連結)
    在本文中,我們將討論作為開發人員、數據科學家或產品經理應該了解的各種Git命令,如何使用Git進行檢查、刪除和整理,以及如何通過Bash別名和Git編輯器配置來逃避Vim並節省時間。這裡有10個要知道的命令和一些常見的標誌。每個命令都連結到該命令的Atlassian Bitbucket指南。
  • 這 10 幾個,高級開發用的 Git 命令,個個驚豔!
    如果你覺得 git 很迷惑人,那麼這份小抄正是為你準備的!請注意我有意跳過了 git commit、git pull/push 之類的基本命令,這份小抄的主題是 git 的一些「高級」用法。git commit --fixup HEAD~1# 或者也可以用提交的哈希值(fed14a4c)替換 HEAD~1git rebase -i HEAD~3 --autosquash# 保存並退出文件(VI 中輸入 `:wq`)rebase 的時候在每個提交上執行命令如果特性很多,一個分支裡可能有多個提交。
  • 7000+ 字帶你全面搞懂 Git 命令+原理!
    當你執行git commit,文件改動就到本地倉庫來了~Remote:遠程倉庫,就是類似github,碼雲等網站所提供的倉庫,可以理解為遠程數據交換的倉庫~Git的工作流程上一小節介紹完Git的四大工作區域,這一小節呢,介紹Git的工作流程咯,把git的操作命令和幾個工作區域結合起來,個人覺得更容易理解一些吧,哈哈,
  • 直接拿來用!10段超有用的Git命令行代碼
    本文分享了10條非常有用且先進的Git命令行語句,無論是運用在團隊環境或是在私人項目中,你都可以直接來拿用。 1.  在最後提交中更改Export(Export changes done in last commit )這個命令通常會使用定期發送已更改的項目,以方便其他人審查/集成。git archive -o ..
  • Git命令詳解與提交規範
    Remote遠程倉庫,用來託管代碼的伺服器,遠程倉庫的內容能夠被分布在多個地點的處於協作關係的本地倉庫修改,本地倉庫修改完代碼後通過 git push 命令同步代碼到遠程倉庫。以上包括Git中最常見的三條命令git add、git commit、git push的基本用法。如果涉及到這些區域文件的操作,命令如下圖所示。
  • Git鮮為人知的四個命令:bisect,blame,reflog和提交範圍
    今天我們要講的是四個鮮為人知的git命令,知道的人很少,但是很有用。1、Git bisect如果你處於一個組織良好的開發環境中,這個命令對你來說幾乎是無用的。你試著看了看代碼和錯誤日誌,但沒有任何頭緒,在qq群詢問老司機後,老司機建議你找之前正常的版本,然後對比下。因此你現在問題是要找到引入錯誤的那次commite。該怎麼做?什麼,不會了把。那麼這裡蟲蟲教你用二分法搜索來幫你尋找那次罪惡的commit。git提供了git bisect命令就是用來幹這事的。想法很easy。