Git與Github入門實踐(上)
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 status 和 git 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 是需要聯網執行的,它對遠端倉庫進行了修改。
相關文章
- Git與GitHub入門Github
- Git 和 GitHub:從入門到實踐2 Git 和 GitHub 基礎配置Github
- GitHub Actions 入門實踐Github
- Git與GitHub入門簡明教程Github
- 《GitHub 入門與實踐》閱讀筆記(第4章)Github筆記
- git 入門教程之github 教程Github
- Kafka 入門與實踐Kafka
- TypeScript入門與實踐TypeScript
- Docker 入門與實踐Docker
- locsut 入門與實踐
- GitOps快速入門與實踐Git
- git與githubGithub
- github actions 入門指南及部落格自動部署實踐Github
- Git入門與開發Git
- 微信小程式入門與實踐微信小程式
- Kubeflow實戰: 入門介紹與部署實踐
- git上傳至githubGithub
- 《Django入門與實踐教程》完整版Django
- 《Kafka入門與實踐》讀書筆記Kafka筆記
- Kafka v2.3 快速入門與實踐Kafka
- Docker入門實踐Docker
- BoltDB 入門實踐
- MQ 入門實踐MQ
- GitHub入門Github
- 基於Github Actions + Docker + Git 的DevOps方案實踐教程GithubDockerdev
- babel 修改抽象語法樹——入門與實踐Babel抽象語法樹
- Docker基礎、Machine、Compose、Swarm入門與實踐DockerMacSwarm
- 入門看看?Chrome外掛初窺與實踐Chrome
- 玩轉git與github--git命令Github
- redux 入門到實踐Redux
- Docker入門實踐(三)Docker
- Docker入門實踐(四)Docker
- Nginx入門實踐(二)Nginx
- Git入門Git
- 從零入門 Serverless | 線上應用的 Serverless 實踐Server
- 最火的容器技術|Docker入門與實踐Docker
- Spring Boot Docker入門模板與4個最佳實踐Spring BootDocker
- Spring Security系列之極速入門與實踐教程Spring