Git與Github入門實踐(上)

菜鳥xk_110發表於2020-12-25

Git與GitHub入門實踐(實驗樓)學習筆記
學習網址:https://www.lanqiao.cn/courses/1035

一. Git與Github簡介

(一)Git與Github的來歷

Linux 之父 Linus 在 1991 年建立開源的 Linux 作業系統之後,多年來依靠全世界廣大熱心志願者的共同建設,經過長足發展,現已成為世界上最大的伺服器系統。系統建立之初,程式碼貢獻者將原始碼檔案傳送給 Linus,由其手動合併。這種方式維持多年後,程式碼量已經龐大到人工合併難以為繼,於是深惡集中式版本控制系統的 Linus 選擇了一個分散式商業版本控制系統 BitKeeper,不過 Linux 社群的建設者們可以免費使用它。BitKeeper 改變了 Linus 對版本控制的認識,同時 Linus 發現 BitKeeper 有一些不足,而且有個關鍵性的問題使之不能被廣泛使用,就是不開源。

在 2005 年,BitKeeper 所在公司發現 Linux 社群有人企圖破解它,BitKeeper 決定收回 Linux 社群的免費使用權。Linus 對此事調解數週無果,找遍了當時已知的各種版本控制系統,沒有一個看上眼的,一怒之下決定自己搞一個。Linus 花了十天時間用 C 語言寫好了一個開源的版本控制系統,就是著名的 Git。

2007 年舊金山三個年輕人覺得 Git 是個好東西,就搞了一個公司名字叫 GitHub,第二年上線了使用 Ruby 編寫的同名網站 GitHub,這是一個基於 Git 的免費程式碼託管網站(有付費服務)。十年間,該網站迅速躥紅,擊敗了實力雄厚的 Google Code,成為全世界最受歡迎的程式碼託管網站。2018 年 6 月,GitHub 被財大氣粗的 Microsoft 收購。2019 年 1 月 GitHub 宣佈使用者可以免費建立私有倉庫。根據 2018 年 10 月的 GitHub 年度報告顯示,目前有 3100 萬開發者建立了 9600 萬個專案倉庫,有 210 萬企業入駐。

(二)在Github上建立倉庫

首先,開啟 GitHub 註冊個人賬戶並登入。登入後,在個人主頁的右上角點選 New repository 建立新的倉庫:
在這裡插入圖片描述
開啟頁面如下圖所示,填入相關資訊。注意下圖紫色框中有兩個下拉按鈕,左邊的用來選擇忽略檔案,右邊的用來選擇所屬協議,這兩項可以不選。
在這裡插入圖片描述點選綠色按鈕建立新的倉庫,成功後自動跳轉到新建倉庫的主頁面,如下圖所示:
在這裡插入圖片描述

(三)安裝Git

接下來,我們就要嘗試使用這個倉庫。

首先,開啟終端使用 git --version 命令檢視版本:
在這裡插入圖片描述
在 Windows 系統中可以安裝 Git for Windows 客戶端

在這裡插入圖片描述

(四)克隆Github上的倉庫到本地

現在克隆前面我們在 GitHub 上建立的倉庫,使用 git clone + [倉庫地址] 命令即可,這是標準的克隆倉庫命令。

進入倉庫主目錄,倉庫主目錄中有個 .git 隱藏目錄(ls -al),它裡面包含了倉庫的全部資訊,刪掉這個目錄,倉庫就變成普通的目錄了。進入到倉庫目錄中,命令列字首發生了一些變化,出現了紅色的 master ,它就是當前所在的分支名。

當我們在 GitHub 上建立一個倉庫時,同時生成了倉庫的預設主機名 origin,並建立了預設分支 master。GitHub 可以看成是免費的 Git 伺服器,在 GitHub 上建立倉庫,會自動生成一個倉庫地址,主機就是指代這個倉庫,主機名就等於這個倉庫地址。克隆一個 GitHub 倉庫(也叫遠端倉庫)到本地,本地倉庫則會自動關聯到這個遠端倉庫,執行 git remote -v 命令可以檢視本地倉庫所關聯的遠端倉庫資訊。

Git 要求對本地倉庫關聯的每個遠端主機都必須指定一個主機名(預設為 origin),用於本地倉庫識別自己關聯的主機,git remote 命令就用於管理本地倉庫所關聯的主機,一個本地倉庫可以關聯任意多個主機(即遠端倉庫)。

克隆遠端倉庫到本地時,還可以使用 -o 選項修改主機名,在地址後面加上一個欄位作為本地倉庫的主目錄名。

另一個在其它 Git 教程中常見的命令 git init ,它會把當前所在目錄變成一個本地倉庫,因為有 GitHub 的存在,這個命令在我們的生產生活中用到的次數應該是零,除非你想費時費力自己搭建伺服器。

二. Git基礎操作

(一)Git倉庫的三大區域

Git 本地倉庫有三大區域:工作區、暫存區、版本區。這是一個概念,有這個瞭解即可,隨著使用 Git 的時間增多,慢慢就會理解這三個區域的作用以及為何要這麼設計。
在這裡插入圖片描述
注意,所有 Git 命令都以 git 開頭。

(二)一次完整的修改、提交、推送操作

首先,進入倉庫主目錄,執行 git status 檢視整個倉庫的狀態:
在這裡插入圖片描述

對工作區進行修改

建立一個檔案並再次檢視倉庫狀態,這步操作是在工作區中:在這裡插入圖片描述
如上圖所示,新建檔案後,命令列字首又發生了一些微小的變化,紅色 master 後面出現了 *星號,這表示工作區或暫存區有變化,對檔案進行增刪改操作都會出現這個星號,另外使用 git status 命令亦可檢視詳情。

新增修改到暫存區以及撤銷修改:

按照下圖的提示,使用 git add [檔名] 命令跟蹤此新建檔案,即把新增檔案新增到暫存區,以備提交:
此處輸入圖片的描述如果對多個檔案或目錄進行了增刪改,可以使用 git add 命令全部新增到暫存區。
注意這裡有個概念,當我們修改了工作區git add 命令是將這些修改新增到暫存區,暫存區記錄的只是修改。如果要撤銷暫存區的修改怎麼辦?根據上圖的提示,執行 git reset – [檔名] 或者 git rm --cached [檔名] 命令即可:
此處輸入圖片的描述上圖的命令,如果省略最後的檔名,把命令寫成 git reset – 即可把暫存區的全部修改撤銷。好,現在暫存區的修改被撤銷,又回到了工作區。

現在介紹另一個命令 git diff,它可以用來檢視工作區被跟蹤的檔案的修改詳情,此時新建檔案 one.txt 並未被跟蹤,而已被跟蹤的檔案 README.md 無修改,所以看不到。注意,只有在版本區中存在的檔案才是被跟蹤檔案。
我們先修改 README.md 檔案,然後執行此命令:
此處輸入圖片的描述此時會跳到新的頁面,即工作區修改詳情頁,按 Q 退出此頁面:
此處輸入圖片的描述
現在,將工作區的兩處修改(新增檔案 one.txt,修改檔案 README.md)全部新增到暫存區,並使用 git diff --cached 檢視暫存區的全部修改:
此處輸入圖片的描述
同樣,此命令也會跳到新的頁面,即暫存區修改詳情頁:
此處輸入圖片的描述

檢視提交歷史:

接下來,將執行 git commit 命令把暫存區的修改提交到版本區,生成一個新的版本。
在此之前,先介紹另一個命令 git log,它用來檢視版本區的提交歷史記錄,當前只有一個提交,就是在 GitHub 上建立新倉庫時的初始化提交。同樣此命令也會跳到新頁面,如下圖所示:
此處輸入圖片的描述
關於檢視提交歷史記錄的命令,有些常用的選項介紹一下:

  • git log [分支名] 檢視某分支的提交歷史,不寫分支名檢視當前所在分支
  • git log --oneline 一行顯示提交歷史
  • git log -n 其中 n 是數字,檢視最近 n 個提交
  • git log --author [貢獻者名字] 檢視指定貢獻者的提交記錄
  • git log --graph 圖示法顯示提交歷史

配置個人資訊:

接下來需要對 Git 進行一些本地配置:

  • user.email:寫入你自己註冊 GitHub 賬號的郵箱
  • user.name:你自己的 GitHub 賬號名字
    這兩個命令設定你的身份資訊如下圖。git config -l 可以檢視配置資訊
    此處輸入圖片的描述
    完成後,系統自動生成 Git 的配置檔案,就是主目錄中的隱藏檔案 .gitconfig
    此處輸入圖片的描述
    上圖所示的配置檔案也是可以直接手動修改。

提交暫存區的修改:

現在執行 git commit 命令生成一個新的提交,一個必須的選項 -m 用來提供該提交的備註:
此處輸入圖片的描述
提交後,暫存區的修改被清空,執行 git log 檢視提交記錄,紫色框中的十六進位制序列號就是提交版本號,這是很重要的資訊,每個提交都有自己單獨的版本號,就像公民身份證號一樣:
此處輸入圖片的描述
觀察上圖的提交資訊,提交版本是按時間倒序排列的,也就是最近的提交排在最上面,你可能需要檢視時間正序排列的資訊,那麼可以使用 git log --reverse 命令。
現在介紹一個超級實用、使用頻率極高但幾乎所有 Git 教程都不重視的命令 git branch -avv,它用來檢視全部分支資訊:
此處輸入圖片的描述
上圖有三行資訊,依次說明:
第一行,開頭的星號表示當前所在分支,綠色的 master 是分支名,之所以是綠色,也是因為它是當前所在分支。後面第二項是版本號,第三項中括號裡面藍色的字,表示此分支跟蹤的遠端分支的名字,當然啦,這也是克隆遠端倉庫到本地時的預設設定 – 建立 master 分支並自動跟蹤遠端同名分支;冒號後面黑色文字表示本地分支領先其跟蹤的遠端分支一個提交。最後一項是提交時填寫的備註資訊。
第二行,是 Git 指標資訊,它指向遠端倉庫的 master 分支,這行資訊暫不重要。
第三行,遠端分支資訊,詳見第一行的解釋。

在執行 commit 命令時,再介紹一個我並不推薦的選項 -a ,它的作用是將未新增到暫存區的修改,也就是工作區的修改也一併提交,但會略過未被跟蹤的檔案,比如新建檔案 one.txt,此命令的完整格式:git commit -am xxxxx 。謹慎的做法是按照前文的順序,修改工作區 - 提交到暫存區 - 隨時使用 git status 檢視倉庫狀態 - 將暫存區的修改提交到版本區生成一次新的提交。

最後一個環節,將本地新增的提交推送到 GitHub 遠端倉庫中,命令是 git push,後面不需要任何選項和引數,此命令會把本地倉庫 master 分支上的新增提交推送到遠端倉庫的同名分支上,因為當前所在的分支就是 master,而且上文提到,它已經跟蹤了遠端倉庫的同名分支:
此處輸入圖片的描述
此命令需要再次輸入你的 Github 使用者名稱和密碼,密碼為隱藏資料,輸入時看不到。推送成功後執行 git branch -avv 檢視分支情況:
此處輸入圖片的描述如上圖所示,本地分支 master 與遠端分支 origin/master 的版本號一致,通常看兩個版本號是否一致,只需比對前四位。看一下網頁上的情況:
此處輸入圖片的描述完全符合預期。
以上就是一次完整的修改 - 提交 - 推送操作。一次推送中可以包含多個 git commit 操作,也就是多個提交可以一起推送。

(三)版本回退

如果發現 one.txt 檔案內容有誤,怎麼做?可以修改此檔案然後再次新增到暫存區、提交、推送,也可以撤銷最近一次提交,修改檔案後重新提交推送。現在使用後一種方法來演示撤銷提交的操作流程。

首先執行 git reset --soft HEAD^ 撤銷最近的一次提交,將修改還原到暫存區。–soft 表示軟退回,對應的還有 –hard 硬退回,後面會講到,HEAD^ 表示撤銷一次提交,HEAD^^ 表示撤銷兩次提交,撤銷 n 次可以簡寫為 HEAD~n。軟退回一個提交後執行 git branch -avv 命令檢視分支資訊:
此處輸入圖片的描述此處輸入圖片的描述
可以看到本地倉庫的 master 分支的版本號已經發生了變化,變成了前一次提交的版本號,中括號裡也有提示資訊,本地分支 master 落後其跟蹤的遠端分支 origin/master 一個提交。
執行 git status 檢視倉庫狀態,果然上一個提交中的修改全部扔回了暫存區:此處輸入圖片的描述再次修改 one.txt 檔案,執行 git add . 命令將新的修改新增到暫存區,然後執行 git commit 命令生成新的提交:
此處輸入圖片的描述

(四)處理commit時間線分叉

執行 git statusgit branch -avv 檢視倉庫狀態和分支狀態:
 	此處輸入圖片的描述可以看到本地倉庫的 master 分支與遠端倉庫的 origin/master 分支在提交版本上有了衝突,又叫做提交時間線分叉。因為剛才的提交操作不是基於遠端倉庫 origin/master 分支的最新提交版本,而是撤回了一個版本。這種情況下也是可以將本地 master 分支推送到遠端倉庫的,需要加一個選項 -f ,它是 –force 的簡寫,這就是強制推送:
此處輸入圖片的描述
執行 git branch -avv 看一下分支資訊,本地 master 與遠端 master 的版本號一致,前四位都是 e290,在瀏覽器上重新整理 GitHub 頁面,結果如預期:
此處輸入圖片的

(五)本地倉庫commit變化記錄

假設此時發現情況不對,之前的那次版本號為 5c04 的提交是正確的,剛才的版本回退操作全都是誤操作,怎麼辦?再次執行一次版本回退嗎?當然不需要啦,我們有 git reflog 命令,它會記錄本地倉庫所有分支的每一次版本變化。實際上只要本地倉庫不被刪除,隨你怎麼折騰,都能回退到任何地方。reflog 記錄只存在於本地倉庫中,本地倉庫刪除後,記錄消失。執行此命令如下圖所示:
此處輸入圖片的描述
怎麼回退到 5c04 那個版本呢?可以直接執行命令 git reset --hard [版本號] ,如果記不清版本號,也可以根據上圖第 3 行的資訊,執行 git reset --hard HEAD@{2} 命令,其中 HEAD@{2} 就是上圖第 3 行第 2 列所示,這個命令的意思是回到當前分支最近兩次提交版本變化前:
此處輸入圖片的描述
還想反悔,剛才還是改對了,怎麼辦?再執行一次即可,這次大括號裡就是 1 了:此處輸入圖片的描述
重要的一點,本節全部命令中,只有 push 是需要聯網執行的,它對遠端倉庫進行了修改。

相關文章