工作流一目了然,看小姐姐用動圖展示10大Git命令

2020-12-06 機器之心Pro

選自dev.to

作者:Lydia Hallie

機器之心編譯

參與:Panda、杜偉

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 命令的可視化示例會是一個完美的用例!下面我將介紹的很多命令都有可選參數——你可以使用這些參數來改變對應命令的行為。而我的示例只會涵蓋命令的默認行為,而不會添加(或添加太多)可選配置!

本文作者Lydia Hallie。

合併

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

可將一個分支的修改融入到另一個分支的一種方式是執行 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 歷史記錄。

上面這個例子展示了在 master 分支上的變基。但是,在更大型的項目中,你通常不需要這樣的操作。git rebase 在為複製的提交創建新的 hash 時會修改項目的歷史記錄。

如果你在開發一個 feature 分支並且 master 分支已經更新過,那麼變基就很好用。你可以在你的分支上獲取所有更新,這能防止未來出現合併衝突。

交互式變基(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 提交吧!

完美!提交 9e78i 還原了由提交 ec5be 引入的修改。在撤銷特定的提交時,git revert 非常有用,同時也不會修改分支的歷史。

揀選(Cherry-picking)

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

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

現在 master 分支包含 76d12 引入的修改了。

取回(Fetching)

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

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

現在我們可以看到自上次推送以來的所有修改了。這些新數據也已經在本地了,我們可以決定用這些新數據做什麼了。

拉取(Pulling)

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

很好,我們現在與遠程分支完美同步了,並且也有了所有最新的修改!

Reflog

每個人都會犯錯,但犯錯其實沒啥!有時候你可能感覺你把 git repo 完全搞壞了,讓你想完全刪了了事。

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

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

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

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

原文連結:https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1

相關焦點

  • Git命令解析-patch、apply、diff
    可以使用gitdiff>patchfile將差異輸出到patch文件,保存或者分享給他人。使用gitdiff命令可以查看工作區修改的內容,gitdiff—cached命令查看添加到暫存區但還未提交的內容。這兩種命令會生成兼容unix系統的標準格式patch。
  • Git常用命令總結及其用法說明
    以下是小編在工作中總結的關於git命令的一些使用方法,僅供參考。>用git status查看一下,已經得到了自己想要的效果3、git取消忽略某個指定的文件git update-index --no-assume-unchanged config.conf4、將當前版本回退到上一個版本,命令如下:
  • 你需要知道的 12 個 Git 高級命令 - OSCHINA - 中文開源技術交流...
    學習Git,首先當然是學習Git的基本工作流。相比於SVN等傳統版本控制系統來說,Git是專為分布式版本控制而生的強大工具。使用Git時常用的命令有pull、commit、push等,貌似很簡單。不過,有時你會遇到合併衝突的情況,Git這時會將衝突標記出來,需要你手工來解決。有時,你會不小心將代碼提交到錯誤的分支上,並且又推送到了遠程倉庫。
  • 一起學習分布式管理工具git
    1.工作原理流程Workspace:工作區,就是你在電腦裡能看到的目錄Index / Stage:暫存區Repository:倉庫區(或本地倉庫)Remote:遠程倉庫git工作流程下面這個圖展示了工作區、版本庫中的暫存區和版本庫之間的關係:
  • 31個機械製圖原理動圖,一目了然
    好久沒有分享機械製圖的知識了,今天分享31個原理動圖,一目了然! 9、虎鉗 10
  • 用動圖展示振動和波動的規律,再也不怕看不懂了
    用動圖展示振動和波動的規律,再也不怕看不懂了
  • 動圖展示10款經典車型的進化史
    動圖展示10款經典車型的進化史 2018-04-23 11:55 來源: 東方網 女大十八變,越變越好看!
  • 大型倉庫git clone性能優化之部分克隆
    隨著Git倉庫變得越來越大,由於性能導致的可用性問題會越來越突出。比如git clone一個大型倉庫會下載整個倉庫對象和每次迭代的副本,下載過程會非常耗時,耗帶寬,而且常常會導致中斷。為了解決這個問題通常有兩個方法:第一個是方法是對倉庫從新規劃,把大的文件提取出來使用Git LFS保存。
  • 是時候表演真正的技術了——11個Git面試題目,你會多少?
    拉取請求(pull request)是當有人用倉庫,建立了自己的分支,做了些修改並合併到該分支(把自己修改應用到別人的代碼倉庫)。 3: 「git pull」和「git fetch」之間有什麼區別? 簡單來說,git pull 是 git fetch + git merge。 當你使用 pull,Git 會試著自動為你完成工作。
  • 論文LaTeX、項目README:無腦套用格式、開源模板最高10萬贊
    比如說 Git 用的 gitignore 文件,模板放到 GitHub 上竟然能有 9.6 萬的 Star 量,這些小而好用的模板項目,確實能省不少事。gitignore 模板做項目不論是做研究,還是平常寫一些小項目,Git 總是必不可少的。若不用 Git 追蹤所有代碼修改痕跡,總感覺改代碼、測試代碼會比較心虛。
  • 誰動了我的主機?之活用History命令
    當然,一些不好的操作習慣也可能通過命令歷史洩露敏感信息。 下面我們來介紹如何讓history日誌記錄更細化,更便於我們審計分析。 1、命令歷史記錄中加時間 默認情況下如下圖所示,沒有命令執行時間,不利於審計分析。
  • 基於工作流理論的民用飛機排故路徑
    圖1 Aalst工作流網模型的基本結構 工作流發展的主要方向是交互式工作流技術,它集成工作流的管理和仿真,為工作流模型研究提供了新的思路 圖4 擴展C_net結構示 ②邏輯模型和語義模型:工作流模型可分為工作流邏輯和工作流語義兩部分,前者用於描述所有事件共同的路徑框架
  • MPB:中科院微生物所蔡磊組-​基於擴增子數據的系統發育樹的構建和展示
    此外IQ-TREE軟體的模型選擇速度比jModelTest快10-100倍,其自展支持率估算比RAxML軟體快10-40倍並且支持宏基因組等大數據計算 (Minh 等, 2020)。IQ-TREE軟體的下載界面:     (http://www.iqtree.org),選擇下載最新版64位的IQ-TREE (v2.2.2) 軟體 (如圖3),解壓後將其放在C:\bin目錄中。
  • 酷斃的數學GIF動圖:看無盡的雪花-數學,GIF,動圖, ——快科技(驅動...
    本期酷炫動圖,讓我們回到好久不見的數學主題。本期動圖文件相對不是那麼大,不過心疼流量的手機黨還是請迅速關閉此頁面。直與彎在我當年學習的人教版的教材中,是把圓剪成了一個個小扇形,然後把它們近似地拼成一個長為πr,寬為r的矩形。扇形裁得越小,拼出來的東西也就越接近矩形,然後用矩形的面積公式就可以計算了。而這裡用了另一種辦法:把圓拆成一個個同心的細圓環。然後,把這些圓環展開,變成高為r,底邊長為2πr的的三角形。當然,這談不上是嚴謹的證明,但其中已經蘊含了一些微積分的思想。
  • 酷斃的數學GIF動圖:看無盡的雪花
    在我當年學習的人教版的教材中,是把圓剪成了一個個小扇形,然後把它們近似地拼成一個長為πr,寬為r的矩形。扇形裁得越小,拼出來的東西也就越接近矩形,然後用矩形的面積公式就可以計算了。而這裡用了另一種辦法:把圓拆成一個個同心的細圓環。然後,把這些圓環展開,變成高為r,底邊長為2πr的的三角形。當然,這談不上是嚴謹的證明,但其中已經蘊含了一些微積分的思想。
  • 輕便小巧功能強大,Windows 做動圖用它就夠了 | 愛範兒
    輕便小巧功能強大,Windows 做動圖用它就夠了 很多人都不知道,Windows 還有自帶的錄屏功能。
  • 深維科技動圖加速方案助力南瓜電影,打造全新媒體展示體驗
    近日,國內首款基於FPGA異構計算的SaaS動圖轉碼產品,正式上線阿里雲市場。該產品由北京深維科技研發,已經上線為南瓜電影的影片動態海報功能提供服務。除視頻點播外,未來還有望在UGC視頻、電子商務、興趣社群、社交媒體等多個領域得到廣泛應用。該產品充分利用WebP動圖格式的畫質高、文件體積小的優勢,用高畫質動圖取代原有海報靜圖,帶來了媒體展示的全新體驗。
  • 零境交錯新角色-黑鳳蝶·黑雪姬技能動圖展示
    零境交錯新角色-黑鳳蝶·黑雪姬技能動圖展示 作者:佚名來源:網絡發布時間:2019-07-18 14:10:00 零境交錯新角色,零境交錯主戰黑雪姬,零境交錯黑雪姬技能零境交錯新角色-黑鳳蝶·黑雪姬技能動圖展示11月5日更新後至11月14日24點,限定角色「二刀流·桐人(主戰)」、「黑鳳蝶·黑雪姬(主戰)」步入零境世界!
  • 一張動圖給你看蝌蚪變成青蛙的全過程!看仔細別眨眼!
    一張動圖給你看蝌蚪變成青蛙的全過程!看仔細別眨眼!你對的起臉上這麼多的口紅印嗎,小姐姐借一下肩都不行你快別表演了,我真的看不下去了!我不要,哥,這真使不得老婆第一次下廚,被一條魚嚇到怎麼說走就走啊,我還沒嘚瑟完呢小姐姐,你這是什麼舞蹈?
  • 我們知道光速極快,NASA科學家卻用3幅動圖證明光速慢地折磨人
    真空中的光速約為每秒299,792公裡,美國宇航局的一名科學家用動圖模擬展示了光環繞地球所需要的時間,同時還用另外兩幅動圖展示了光從地球到月球,以及地球到火星所需要的時間。這幾張有趣的物理動畫向您展示了宇宙的速度極限可以有多快(或多慢),看完之後您或許會感慨宇宙空間的浩渺。