1. 程式人生 > >Git 學習筆記——程式設計師篇

Git 學習筆記——程式設計師篇

文章目錄

關於 Git

Git 背後的故事

偉大的作品總是誕生於偉大的時代,正如 Git 同樣誕生於一個英雄輩出、極富紛爭的年代。

2005 年,Linux 核心開發社群正面臨嚴峻的挑戰:他們不能繼續使用 BitKeeper 了(注:原因是當時BitKeeper 著作權所有者決定收回授權,核心開發團隊與其協商無果),而又沒有其他的 SCM (Software Configuration Management)可滿足他們的分散式系統的需求。Linux 之父 Linus Torvalds 接受了這個挑戰,決定開發一個新的版本控制系統,並制定了分散式、非線性、簡單快速的設計目標。週末他消失了,新的一週,Git 問世了。

自誕生以來,Git 日臻成熟完善,在高度易用的同時,仍然保留著初期設定的目標。 它的速度飛快,極其適合管理大專案,有著令人難以置信的非線性分支管理系統。今天,Git 已經成為上萬個專案的版本控制系統,並且在程式設計師中引發了開源熱潮。

基本概念

和 SVN 相比,Git 有一些獨特的術語和概念,有必要了解一下。

  1. 工作區(working tree):可以理解為客戶端電腦上的專案路徑
  2. 版本庫(repository):工作區有一個隱藏目錄 .git,這個不算工作區,而是 Git 的版本庫
  3. 暫存區(stage):存放在 .git 目錄下下的 index 檔案(.git/index)中,所以我們把暫存區有時也叫作索引(index)
  4. 預設的遠端版本庫(origin):儘管 Git 是分散式的,但它不排斥中心伺服器

工作區、版本庫中的暫存區和版本庫,以及遠端庫之間的關係如下:

在這裡插入圖片描述
圖中我們可以看出此時 “HEAD” 實際是指向 master 分支的一個"遊標"。所以圖示的命令中出現 HEAD 的地方可以用 master 來替換。

git add
暫存區的目錄樹被更新,同時工作區修改(或新增)的檔案內容被寫入到物件庫中的一個新的物件中,而該物件的ID被記錄在暫存區的檔案索引中。

git commit
暫存區的目錄樹寫到版本庫(物件庫)中,HEAD 指向分支會做相應的更新。

git reset HEAD
暫存區的目錄樹會被重寫,被HEAD 指向分支的目錄樹所替換,但是工作區不受影響。

git rm --cached
直接從暫存區刪除檔案,工作區則不做出改變。

git checkout 或者 git checkout –
暫存區全部或指定的檔案替換工作區的檔案。這個操作很危險,會清除工作區中未新增到暫存區的改動。

git checkout HEAD 或者 git checkout HEAD
HEAD 指向的分支中的全部或者部分檔案替換暫存區和以及工作區中的檔案。這個命令也是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。

git clone [email protected]:/sdyouth/xufive.git
從遠端庫克隆專案

git fetch
從遠端的分支獲取最新的版本到本地。

get push
將本地版本庫的分支推送到遠端庫上對應的分支。

術語中英文對照

為便於瀏覽,該部分內容已獨立成文,敬請移步至:Git 術語及中英文對照

安裝Git客戶端

Git 目前幾乎可以執行在包括 Linux/Unix、Solaris、Mac和 Windows 等所有平臺上。Git 各平臺安裝包下載地址為:http://git-scm.com/downloads

Linux 平臺安裝

Git 的工作需要呼叫 curl,zlib,openssl,expat,libiconv 等庫的程式碼,所以需要先安裝這些依賴工具。如果你碰巧用 Debian 或 Ubuntu,使用下面的命令,就可以直接完成Git的安裝。

sudo apt-get install git

Windows 平臺

寫這篇部落格的時候,最新的 Git 客戶端版本是 Git-2.19.1。點此下載最新的安裝檔案,然後執行,按預設選項安裝即可。我大概只更改了預設的編輯器,其他接受了預設選項。

友情提示:關於行結束符,預設的選擇是 checkout 時從 LF 轉 CRLF,commit 時 從 CRLF 轉 LF。這樣設定適合跨平臺的開發,不過 add 操作時會出現警告,忽略即可。

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

安裝完成後,右鍵選單會增加 Git GUI 和 Git Bash 兩項。使用者可以根據自己的習慣選擇使用 Git GUI 或 Git Bash 來建立、管理自己的版本庫。

在這裡插入圖片描述

在非本地版本庫的工作區開啟 Git GUI,介面如下:

在這裡插入圖片描述
這裡,可以建立本地版本庫,可以克隆遠端庫,也可以開啟本地已經存在的版本庫。

在本地版本庫的工作區開啟 Git GUI,介面如下:

在這裡插入圖片描述
版本庫中新增加的或者修改過的檔案將會出現在左側上方的視窗中。也可以點選“Rescan”按鈕重新檢查新增加的或者修改過的檔案,以更新左側上方的視窗顯示內容。

點選“Stage Changed”按鈕,新增加的或者修改過的檔案將會從左側上方的視窗移到左側下方的視窗中,完成檔案暫存。點選暫存區的單個檔案圖示,該檔案將回退到未暫存的狀態。

點選“Commit”按鈕,已經暫存的檔案將被提交到版本庫——特別說明,這裡的版本庫是指本地庫,而非遠端庫。點選“Push”按鈕,才可以將本地庫的當前分支提交到遠端庫。關於分支,將在後面詳細說明。

使用 Git

理解了 Git 的理念,使用 Git 是一個很自然的過程,不管是在 windows 平臺還是 linux 平臺上,不管用 Git GUI 還是 Git Bash。本博文主要介紹 windows 平臺上的使用,以 Git GUI 為主,間或使用 Git Bash。

客戶端生成數字證書

Git 是分散式的,可以不依賴於遠端庫而獨立工作。因此,數字證書不是必須的。如果打算連線遠端庫,這項準備工作只需要做一次。

假定有一個遠端庫:
ssh://[email protected]:22/sdyouth/git/GitTest.git

因為使用了的是預設埠,可以簡寫為:

[email protected]:/sdyouth/git/GitTest.git

出於安全考慮,只有數字證書公鑰儲存在 Git 伺服器的 Git 客戶端才能連線這個遠端庫。通常,Git 客戶端的數字證書儲存在 C:\Users\使用者名稱.ssh 路徑下。

如果 Git 客戶端不存在 C:\Users\使用者名稱.ssh 路徑,請啟動 Git Bash,嘗試從遠端庫克隆 test 專案:

$ git clone [email protected]:/sdyouth/git/GitTest.git

第一次連線到目標 Git 伺服器時會得到一個提示:

Cloning into 'GitTest'...
The authenticity of host 'sdysit.com (120.55.169.217)' can't be established.
ECDSA key fingerprint is SHA256:tTXVyJPoqCiEZP3+3E2uOOmvXIWGEWtCcUOgBhlb+iQ.
Are you sure you want to continue connecting (yes/no)? yes

選擇 yes

Warning: Permanently added 'sdysit.com,120.55.169.217' (ECDSA) to the list of known hosts.
[email protected]'s password:
Connection closed by 120.55.169.217 port 22
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

最終的結果肯定是失敗的,即使你輸入了正確的密碼。但我們已經將此伺服器加入到了已知伺服器列表中。此時 C:\Users\使用者名稱.ssh 下會多出一個檔案 known_hosts,以後在這臺電腦上再次連線目標 Git 伺服器時不會再提示上面的語句。

如果 Git 客戶端存在 C:\Users\使用者名稱.ssh 路徑,則直接在 Git Bash 執行以下命令,生成數字證書:

$ ssh-keygen -t rsa -C "[email protected]"

[email protected] 是我的使用者名稱。每個使用者都應該有自己的有別於其他使用者的使用者名稱。雖然 Git 不限定使用者的操作許可權,但是管理員需要知道來訪者是誰,以便於在該使用者離開團隊時,從服務端刪除他的數字證書公鑰。

現在,C:\Users\使用者名稱.ssh 下會多出兩個檔案 id_rsa 和 id_rsa.pub,id_rsa 是私鑰,id_rsa.pub 是公鑰。請把公鑰檔案交給管理員(出於安全考慮,這裡不討論管理員的工作),很快你就成為遠端庫的合法使用者了。管理員也許會給你一個密碼,請牢記並妥善保管。

從遠端庫克隆專案

前文已經展示過使用 Git Bash 克隆版本庫,下圖為使用 Git GUI 從遠端庫克隆 FY-3 專案到本地 D:\YouthGit 路徑下。友情提示:如果 D:\YouthGit 路徑下已經存在 FY-3 資料夾,將無法完成克隆。

在這裡插入圖片描述

建立本地版本庫

以在本地 D:\YouthGit 路徑下建立 FY-2 專案為例。啟動 Git Bash,執行以下操作即可。

[email protected] MINGW64 /d/YouthGit
$ pwd
/d/YouthGit

[email protected] MINGW64 /d/YouthGit
$ mkdir FY-2

[email protected] MINGW64 /d/YouthGit
$ cd FY-2

[email protected] MINGW64 /d/YouthGit/FY-2
$ git init
Initialized empty Git repository in D:/YouthGit/FY-2/.git/

[email protected] MINGW64 /d/YouthGit/FY-2 (master)
$ 

如果使用 Git GUI,建立本地專案版本庫如下圖所示。

在這裡插入圖片描述

關聯本地版本庫到遠端庫

在本地建立的版本庫,要關聯到遠端庫,前提是被關聯的遠端庫必須存在。以在本地 D:\YouthGit 路徑下建立 的FY-2 專案為例,使用 Git GUI 關聯到遠端庫 [email protected]:/sdyouth/git/FY-2.git,需要新增遠端庫。點選選單Remote --> Add…,在彈出視窗中正確填入遠端庫路徑,並給遠端庫取一個恰當的名字,點選 Add 按鈕即可完成操作。

在這裡插入圖片描述

檢查工作區

當工作區新增加了檔案,或者原有的檔案有改變時,啟動 Git GUI 後會自動顯示在未暫存檔案列表中。點選“Rescan”按鈕,也可以重新檢查新增加的或者修改過的檔案,以更新左側上方的視窗顯示內容。

儲存更新暫存區

點選“Stage Changed”按鈕,新增加的或者修改過的檔案將會從左側上方的視窗移到左側下方的視窗中,完成檔案暫存。點選暫存區的單個檔案圖示,該檔案將回退到未暫存的狀態。

提交更新至版本庫

點選“Commit”按鈕,已經暫存的檔案將被提交到版本庫——特別說明,這裡的版本庫是指本地庫,而非遠端庫。每次 commit 之前,請務必填寫說明,否則 Git GUI 將會拒絕執行命令。關於本次 commit 的說明,對於合作者,以及以後的開發工作有著非常重要的作用。

在這裡插入圖片描述

建立分支

假定在 FY-2 專案中建立以 master 分支當前程式碼為起點的 demo 分支,點選 Git GUI 選單 Branch --> Create…,在彈出視窗中照下圖操作即可。建立新的分支後,Git GUI 自動切換到新的分支,並更新工作區。

在這裡插入圖片描述

切換分支

點選 Git GUI 選單 Branch --> Checkout…,在彈出視窗中照下圖操作,即可切換到 master 分支,同時更新工作區。

在這裡插入圖片描述

合併分支

點選 Git GUI 選單 Merge --> Local Merge…,在彈出視窗中照下圖操作,即將 domo 分支合併到 master 分支上。

在這裡插入圖片描述

將本地的分支推送到遠端庫

點選 Push 按鈕,在彈出視窗上照下圖操作,即可將本地庫的 master 分支推送到遠端庫。

在這裡插入圖片描述

獲取遠端庫的最新版本

點選 Git GUI 選單 Remote --> Fetch from,在第三級選單中選擇恰當的遠端庫,在彈出視窗中照下圖操作,即可獲取遠端庫的最新版本。

在這裡插入圖片描述
另外,我們還可以選擇 Remote --> Rrune from 來完成更新。git fetch 和 git pull 的區別在於:

  1. git fetch:相當於是從遠端獲取最新版本到本地,不會自動merge
  2. git pull:相當於是從遠端獲取最新版本並merge到本地

在實際使用中,git fetch更安全一些,因為在merge前,我們可以檢視更新情況,然後再決定是否合併。比如,使用 Git Bash 執行 git fetch,可以完成更精確的操作。

git fetch origin master:tmp
git diff tmp 
git merge tmp

解決衝突

寫到這裡,我已經精疲力竭、無力繼續了。待我滿電覆活之後再補充吧。

Git 常用命令集

為便於瀏覽,該部分內容已獨立成文,敬請移步至:Git 常用命令集