動畫:掃盲 Git 版本控制

2021-03-06 小鹿動畫學編程

最近不少讀者和鹿哥反饋說,能不能掃盲一下 git,無論是 github 開源項目網站還是團隊合作,都少不了 git 版本控制的使用。加上很多的在校生沒有過多接觸過 git,所以呢,鹿哥決定最基礎的講起,請大佬多多包涵我這基礎的內容。

因為 git 涉及到的內容太多,寫一篇太長,在閱讀體驗上不友好,那麼分為兩篇吧。本篇主要分享一些 git 常用的操作以及命令背後的原理。

當我們做項目的時候,少不了來回的改動項目功能和代碼,一般我們修改的會覆蓋以前的內容,但是突然有一天,老闆不要新的需求了,而是要原來的那個功能,咋辦呢,只能一點點刪了最新的代碼,然後再重新寫原來的功能。

如果當項目變的龐大,需要多個人進行開發,每個人開發的功能各不相同,合併項目時,不得不手動合併,萬一出現各種 bug,每個人都要改動整體項目,刪除或增加部分代碼,萬一合併錯誤,導致整個項目處於一個未知的狀態,此時項目代碼變得異常混亂。

版本控制就是來解決以上這兩種情況的,你改動了哪些地方,都會被版本控制系統所記錄,對於以上第一種情況,我寫的新功能老闆不要了,我可以通過版本控制回退到未修改之前的狀態,對於上邊團隊合作,可以通過版本控制直接合併,無需手動一點點的複製粘貼。

說起 Git 的崛起特別有意思,最早的版本控制是出於 BitKeeper 公司的。而且應用於最大的開源系統 Linux,Linux 的作者Linus 早就把 Linux 作為全世界的開源項目,Linux 的誕生少不了世界很多開源貢獻者的參與。

因為貢獻的開發者來自世界各地,就會出現上述出現的問題,前期只能靠 Linus 手動合併代碼,後來系統變的原來越龐大,不得不使用 BitKeeper 公司的版本控制,但是  BitKeeper 公司呢,看了他們這麼熱愛開源,就免費讓 Linux 的開發者們使用。

面對來自世界各地 Linux 的開發者,更何況這些人都是牛人,風雲四起,不得不打算搞點事情。於是對 BitKeeper 公司版本控制下手了,對公司內部的協議進行了逆向工程(反編譯),但是很不幸運,被人家知道了。

這下可好了,本來人家公司讓你免費試用,你非要破解人家東西,還讓人家知道了,弄得 Linux 的作者 Linus 不得不去道歉,但是 Linux 道歉沒有妥協,最後人家  BitKeeper 公司收回了免費使用權。

兄弟們,既然人家不讓用了,那就自己動手豐衣足食唄。牛人 Linus 僅僅花費了十天的時間用 C 編寫出了 git 的第一個版本。我和我的小夥伴們驚呆了!

git 經過幾年火了起來,不愧是玩 Linux 的牛人,git 不僅性能極大的得到提升,而且開源免費,這就使得 git 在 2008 年入住全球最大的開源社區,為開源項目免費提供存儲,導致了很多開發者喜歡上了 git,現如今 git 也稱為最流行的分布式版本控制系統。

git 之前的版本控制是 SVN 和 CVS,但是這兩者有很明顯的缺點,它是集中式的版本控制,什麼是集中式的?就是必須提供一臺伺服器,團隊合作都圍繞著這個伺服器進行合併。它是基於區域網的,比如現在有些公司還在使用 SVN,一旦到了家裡辦公,所寫的代碼就不能提交到這個伺服器。

但是 git 就不同了,任何地方,任何地點,不同區域網下,想什麼時候提交就什麼時候提交,而且提交的速度非常的快,到底有多快,一會體驗一下就知道了。

以上 git 的歷史和特點就暫時介紹這些,感興趣童鞋可以去網上多多查閱相關 git 內容。

對於 git 的安裝不在過多的費口舌,直接去官網下載即可。

下面直接在本地版本倉庫講起吧。我們通過下邊的命令創建一個本地 git 版本倉庫。

這個命令執行後,發生了什麼?我們可以理解為初始化當前所在項目,創建一個空的倉庫,我們稱為 1 號倉庫,我們對這個倉庫可以進行一系列的各種增加、移除等操作。

此時會在當前目錄下生成一個 .git 文件,那麼這個文件就是來記錄當前版本庫裡內容變化的。

我們完全可以把這個倉庫當成現實中的存儲貨物的倉庫,當然,倉庫肯定要有個管理員的,這個管理員就是上邊的 .git 同學。

然後我在此目錄下創建一個項目文件,叫做「project.md」,然後執行下邊命令。

以上過程就相當於,此時鹿哥開著拖拉機拉著一批貨物來了,要在倉庫中存一批貨物。但是管理員說必須老闆同意了之後才讓我存,那麼這批貨就先暫時存放 2 號倉庫中。

2 號倉庫又稱臨時倉庫,只能存放臨時貨物,等老闆籤字畫押了,才能將 2 號臨時倉庫的內容正式存入大倉庫中,那麼 add 就是添加到 2 號臨時倉庫中。

我們可以通過讓倉庫管理員輸入以下命令,看看鹿哥的貨物是否存入了 2 號暫存倉庫中。

 對,沒錯,是鹿哥的那批貨物。

這時,老闆同意可以把暫存在 2 號倉庫的貨物放到 1 號正式倉庫中了,那麼管理員開始輸入命令,將暫存倉庫的貨物進行錄入正式倉庫。

1git commit -m '2020 3/24 鹿哥的貨物 10噸'

commit 就是正式提交的意思,-m 是提交的內容的信息。在正式開發中,你每提交一次代碼肯定是要說明提交的那些內容,是修改了還是增加了功能,這東西都要寫上說明,因為萬一項目出現問題,會通過提交的信息進行回退。

是的,這些提交記錄都是由管理員記錄的,我們通過以下命令看一下管理員的記錄本。

這個記錄中,包括是誰提交了代碼,什麼時間提交的,提交的信息是什麼,都會在管理員這個小本本上記錄著。

有時候我們的程式設計師可能喝了酒去提交代碼,不小心把沒有做完的功能代碼提交上去了。第二天,酒醒了,突然發現自己手賤,咋辦?

不慌,我們可以撤銷(也叫做回滾)喝醉酒前的代碼狀態。還是拿貨物的例子去說明,比如鹿哥不想存入那 20 噸了,我應該咋辦?執行下面命令。

該命令的意思是回滾當上次提交代碼之前,也就是喝醉酒之前代碼的狀態。此時鹿哥的 20 噸就相當於沒有在存在倉庫中。我們在看一下管理員的記錄。

那麼問題來了,鹿哥,萬一遇到一個能喝的程式設計師,喝的大醉,一下提交了好幾次代碼,需要回滾好幾次,你這一次次的太慢了吧。

也是哈,如果我們想回滾哪一次就回滾哪一次,應該怎麼做?我們先可以通過一個命令,查看一下我們管理員執行命令的記錄。

每個命令前邊都有一個提交的 id,我們通過這個 id,執行下面命令,想回滾到哪一次就回滾到哪一次。

1git reset --hard 3cc34bb(提交 ID) 

除此之外,我們在寫代碼時,還會經常出現一下兩種情況。

如果我們提交完成了,老闆讓我增加一個功能,這時,我寫了一天,在沒有提交(git add)之前老闆告訴我,不想要這個功能了,那麼此時我們咋辦?不怕,我們執行下面命令,直接丟棄工作區(目前項目)的修改。

1git checkout -- project.md(文件名)

但是我們已經提交到了暫存庫中,然後又修改了內容,老闆才告訴我這個功能不要了,我們就用以上回滾的方式,丟棄緩存區的添加。

1git reset HEAD project.md(文件名)

如果我們不小心刪除了我們項目的部分代碼,此時本地項目和倉庫中項目不一致,應該咋辦?

要麼將倉庫的項目也進行刪除,就是正常的進行提交修改就行了。要麼就恢復本地項目誤刪除的文件,也是使用上邊我們說到的命令。

1git checkout -- project.md(文件名)

上邊只是你自己在本地玩耍,提交代碼,以後到了公司一個大項目肯定是很多人一塊完成的,那麼就必須有一個統一的遠程倉庫用來存儲各個開發者由本地倉庫提交的代碼進行合併。等到項目開發完成,我們直接用遠程倉庫的代碼上線就可以了。

是的,想必你已經想到了,Github 可以創建一個遠程的倉庫,倉庫可以任何人都可以提交,也可以規定某些開發者可見(私有倉庫與公有倉庫)。

在 Github 上創建遠程倉庫:

我們創建完成之後,必須讓本地倉庫和遠程倉庫進行關聯,關聯之後才能夠將本地的代碼進行提交。

本地倉庫和遠程的倉庫通信需要 SSH 加密的,需要設計一樣的秘鑰才可以進行通信。

創建秘鑰:


本地倉庫設置密鑰需要和遠程倉庫及逆行加密通信。在 window 下創建 SSH Key,一路回車。在用戶主目錄裡找到.ssh目錄,裡面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能洩露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。

1ssh-keygen -t rsa -C "youremail@example.com"

Github設置 key:

在遠程倉庫設置一個或多個公鑰知道有哪裡的本地倉庫要通信。

登陸GitHub,打開「Account settings」,「SSH Keys」頁面。然後,點「Add SSH Key」,填上任意Title,在Key文本框裡粘貼id_rsa.pub文件的內容,點「Add Key」,你就應該看到已經添加的Key 。

我們通過上邊設置好之後,就可以將本地倉庫關聯遠程倉庫了。

1git remote add origin 遠程倉庫地址

通過這一條命令就可以關聯遠程倉庫,遠程倉庫的地址在這。

我們現在只是關聯上遠程倉庫,而沒有將本地的分支推上去,對於分支的概念涉及到挺多內容,暫時不在這一節展開講。

1git push -u origin master

通過上邊的命令,將本地倉庫的主分支和遠程的主分支關聯(可以理解為當前版本代碼會有一個指針指向當前版本)。這樣本地有什麼改動的,通過提交到遠程倉庫,遠程倉庫的分支內容也會進行改變。

有時候,你可能沒有參與項目的創建,而是老闆把你臨時派到了其他項目組協助一起做項目。

此時你本地是沒有項目的,所以要在遠程倉庫把其他組的項目拉下來,然後再進行快速開發。我們把遠程倉庫項目拉下來的過程稱為克隆倉庫。通過以下命令來進行。

此時我們可以進行愉快的開發了。

本篇主要涉及到的一些 git 基礎操作,後續還會有如何解決代碼衝突以及分支的各種概念,以及遇到項目 bug 如果暫存手頭的工作等。

今天文章到這裡結束了,雖然這篇內容接近基礎,但是寫起來真是費勁,本想著周一發表,看到文章涉及到的太少,然後第二天又補充了很多,全文 4230 字,如果對大家有幫助,歡迎點讚和留言,鹿哥唯一剩下的動力靠你們啦!

相關焦點

  • Git版本控制常用命令
    Git簡介Git是一個開源的分布式版本控制系統,可以有效、高速地處理從很小到非常大的項目版本管理。 Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體。
  • 1小時搞懂 Git 版本控制
    因為不懂得 Git 版本控制的原理,總是將代碼推送不到遠程伺服器,同時還出現一大堆錯誤,只好不停地去詢問他原因。(這是建立在你動手的前提之下,當然本次 Chat 我會盡力講的通俗易懂)在使用 Git 之前,我們先需要學習一些 Git 知識鋪墊,以備我們後面更好的學習 Git 版本控制。Git 知識鋪墊程式設計師為什麼要使用 Git 版本控制?現在的軟體項目通常是由一個研發小組共同分析、設計、編碼、維護以及測試的。
  • Git 入門指引--「就是這麼任性,我只用 Git 控制版本!」
    > 本文面向初次接觸版本控制系統的 Git 用戶,旨在介紹一些關於版本控制和 Git 的簡單概念。導言Git 是目前最先進的版本控制系統,擁有最多的用戶數量並管理著數量龐大的實際軟體項目。風靡全球的 Github 更是讓 Git 版本控制系統名聲大震。本文以 「版本控制系統」 為切入點,介紹相關概念和簡單的 Git 用法 (在 GitCafe 上演示)。什麼是版本控制系統?
  • Git 版本控制,看這篇就夠了 (一)
    本文核心點:Git的基本概念安裝Git配置用戶信息創建Git託管的項目工作區與暫存區一、什麼是Git1. git的概念git是世界上目前最先進的分布式版本控制系統,致力於團隊、個人進行項目版本管理2. git的歷史git是linux的創始人linus,在付費版本控制工具BitMover收回對Linux社區免費使用權利的時候,一怒之下花費兩個星期的時間寫出來的。(不要逼牛筆的人)二、開始1.
  • git 版本控制初學者指南
    雷鋒網 AI 科技評論按,如果你還不熟悉版本控制你是否曾經將你的代碼搞得一團糟,甚至覺得從頭開始會更容易?有了版本控制,你可以返回到之前的某一個版本,而不需要在凌晨 2 點從頭再來。備忘清單使用 git bash 或終端導航到實際的項目文件夾。這將在你的項目中創建一個 .git 存儲庫。存儲庫或「repo」是你隨著時間推移對項目所做的所有更改的集合。這是你在新項目要做的第一件事。設置每次提交時使用的信息,這只需要在第一次安裝 Git 時設置一次就好。
  • 乾貨 | git 版本控制初學者指南
    Python算法學習與機器學習算法報導  編輯:Cookies來源:AI科技評論AI 科技評論按,如果你還不熟悉版本控制有了版本控制,你可以返回到之前的某一個版本,而不需要在凌晨 2 點從頭再來。開始Git 很複雜,有很多東西需要學習,但是要入門,你只需要知道一些關鍵的東西就可以開始了。你使用 Git 的次數越多,你將發現,這些知識絕對不夠,但當遇到這種情況時,有許多資源可以幫助你。所以,可以從這裡開始你的學習,但也要不斷擴展你的知識。
  • 非程式設計師如何使用 Git——版本控制你的生活
    在協同工作和版本控制方面,Git 絕對是一個優秀的工具,但其優點並不被大眾所熟知。在過去的幾年中,由於大眾對於文字處理,電子表格(譯者註:這裡暗指Word和Excel,下同。)
  • Git發布2.30版本
    Git 2.30版本已於北京時間今天凌晨3點發布,是該廣受歡迎的分布式修訂版本控制系統的最新穩定版本更新,Git由Linux內核發明者Linus大神於2005年推出。
  • Git命令的動畫展示,讓我們學習Git事半功倍
    Git幾乎是每個程式設計師的標配,當然有時候也是噩夢,因為如果不是對他的各種命令非常熟悉的話,各種繞腦的命令會把我們弄暈,因為很多時候我們並不知道這個命令內部到底是怎麼樣的,如果每一個命令都有相對應的動畫,我們是不是理解起來更容易一些呢?
  • Git版本管理完全指南—學好Git一文足矣
    4. git reset HEAD file  撤回暫存區的文件修改到工作區4、標籤操作1. git tag 標籤名 添加標籤(默認對當前版本)2. git tag 標籤名 commit_id 對某一提交記錄打標籤3. git tag -a 標籤名 -m '描述'  創建新標籤並增加備註4. git tag 列出所有標籤列表5.
  • git 1.7.10發布,分布式版本控制工具
    2012-04-14.上一個版本是2012-01-29的1.7.9完全改進:Compatibility Notes ----  * From this release on, the "git merge" command in an interactive    session will start an editor when it automatically
  • Git 前時代:使用 CVS 進行版本控制 | Linux 中國
    如果你的軟體工程師職業生涯跟我一樣,也是晚於此時間的話,Git 可能是你用過的唯一版本控制軟體。雖然其陡峭的學習曲線和不直觀地用戶界面時常會遭人抱怨,但不可否認的是,Git 已經成為學習版本控制的每個人的選擇。Stack Overflow 2015 年進行的開發者調查顯示,69.3% 的被調查者在使用 Git,幾乎是排名第二的 Subversion 版本控制系統使用者數量的兩倍。
  • Git入門篇之版本回溯
    它類似於系統還原,當我們誤操作時,可以啟動還原操作退回至上一個版本進行還原。除了使用git status查看當前狀態,還可以使用git diff查看具體操作。接下來我們做還原或者說是回溯到之前的版本,使用git reset --hard HEAD^這裡做說明HEAD指代當前版本,那麼後面跟的^意思就是回溯到上一個版本,同理^^指代回溯兩個版本。
  • Git 1.9.0 發布,分布式版本控制系統 - OSCHINA - 中文開源技術...
    分布式版本控制系統GIT發布1.9.0正式版。2014-02-15.新的產品系列。
  • Git v2.0.1 發布,分布式版本控制 - OSCHINA - 中文開源技術交流社區
    分布式版本控制系統GIT發布2.0.1。2014-06-25。上個版本是2014-05-29日的2.0。
  • 版本管理工具Git,你用對了了嗎?這一招絕對好用
    對於開發人員來說,一個團隊一起開發,那麼肯定會涉及到團隊協作開發,這個時候版本管理工具就起了很大的作用,今天我們就來說說超強版本管理工具git應該怎麼用才最好,怎麼用能最大程度保證master分支代碼的乾淨。
  • Git教程(一)
    戳 這裡 的生信草堂公眾號原文,請多關注哦~Git 是什麼Git是目前世界上最先進的分布式版本控制系統(沒有之一)。Git非常適合用於項目版本控制和協作工作。誠然,Git剛開始學習起來可能非常棘手,但只要勤加練習,在苦苦掙扎之後,你會發現它會遠遠超出你的期望。分布式版本控制為什麼Git對於管理生物信息數據是必不可少的Git允許你創建項目的快照使用版本控制系統,你可以在開發中的特定點處創建當前項目的快照。
  • Git 2.10.0 發布,分布式版本控制系統
    git diff" output. * "upload-pack" allows a custom "git pack-objects" replacement when   responding to "fetch/clone" via the uploadpack.packObjectsHook.
  • GitNote - 基於Git的跨平臺筆記軟體 可任意恢復筆記版本記錄
    ­  2017 年,我用 electron 和 JavaScript 編寫了基於 git 的 GitNote 筆記軟體,這個採用一個 React開發的版本,這是一個沒有發布的版本.­  2018 年,我用 Vue重構了 GitNote,更強大的 GitNote.
  • git 1.7.10發布,分布式版本控制工具 - OSCHINA - 中文開源技術...
    2012-04-14.上一個版本是2012-01-29的1.7.9完全改進:Compatibility Notes ----  * From this release on, the "git merge" command in an interactive    session will start an editor when it automatically