# Git學習歷程 ## 學Git前要認知的事情 * Git是什麼? 在 2005 年 Linux 的作者 Linus Torvalds 為了管理 Linux 程式碼而開發出來的分散式版本控制系統(Version Control System),至今已有十幾年的歷史了。 * 為什麼要學Git? Git 的優點有免費、開源,速度快、檔案體積小,且Git是一種「分散式版本的版本控制系統」。 Git 可以把檔案的狀態作為更新歷史記錄保存起來。不僅可以把編輯過的檔案復原到以前的狀態,也可以顯示編輯過內容的差異。 而且在多人合作的專案下,覆蓋其他人的最新檔案時,系統會發出警告,因此可以避免在無意中覆蓋他人的編輯內容。 * Git和GitHub有什麼不同? Git 是一個分散式版本控制軟體,用於建立數據庫。(Repository) GitHub 則是一個支援Git的雲端平台,有著存取數據庫和遠端託管的服務,本體是一個 Git 伺服器,讓大家可以透過 Web 介面來操作一些原本需要複雜的 Git 指令才能做到的事。 >打個比方就像將本地端的 word, PPT 等檔案放置 dropbox, google drive 雲端上儲存相同。 * 而熱門的遠端平台大致有三個: 1. [GitHub](https://github.com/):有GitHubs Pages功能,免費方案可建立3個以下的私人專案。 2. [BitBucket](https://bitbucket.org):可建立私人數據庫,免費方案可有5人以下的團隊。 3. [GitLab](https://about.gitlab.com/):自架Gut伺服器,有提供web視覺化管理介面,用於企業內部開發。 懶人包解釋: 1. 專案開發的小型團隊可用BitBucket。 2. 想要有對外公開的網站可用GitHub。 ## Git必備環境及工具 以 **Windows** 平台為主,介紹三套費工具 * Git for Windows 一套命令提示字元 (Command Prompt) 下執行的一套指令列工具,所有 Git 的 GUI 工具,其實都是執行這些較為底層的 Git 工具,所以是一套必備的 Git 管理工具,非裝不可! 下載網址:http://msysgit.github.io/ * GitHub for Windows 由 GitHub 官方開發的工具,寫給那些對 Git 沒有很了解的人用的,用簡潔與親民的 GUI 介面。 >GitHub for Windows 內建了一個 Git Shell 工具,這工具會用到 Git for Windows,所以如果你沒有安裝 Git for Windows 的話,也將無法使用 GitHub for Windows 的 Git Shell 工具 。 下載網址:http://windows.github.com/ * SourceTree 由 ATLASSIAN 這間公司開發的免費工具,是一套非常專業的 GUI 操作工具,不僅支援 Git 版本控管,同時也支援 Mercurial 版本控管機制,這兩套版本控管機制都屬於分散式版本控管的分類。 >SourceTree 其實骨子裡也是透過 Git for Windows 工具進行版本操作,如果你沒有事先安裝 Git for Windows 的話,安裝的過程中他也會提示你要不要順便安裝起來。 下載網址:http://www.sourcetreeapp.com/ ##### 雖然為免費軟體但還是必須在安裝後 30 天內 "免費註冊" 得到序號後,才能繼續使用 ## 檢查安裝及設定環境 * 檢查Git安裝版本 ```linux $ git --version ``` 有顯示版本號即成功 * 設定環境 首先要知道的幾個基本Linux指令: | Linux指令 |說明 | | -------- | -------- | | cd | 前往資料夾 | | pwd | 取得目前資料夾位置 | | ls | 查看資料夾下的所有檔案 | | touch | 開新檔案 | | mkdir | 建立新資料夾 | | cp | 複製檔案 | | mv | 移動檔案 | | rm | 移除檔案 | | clear | 清除畫面 | |tab| 自動補上輸入指令/檔名| |q| exit檔案| |alias| 指令縮寫| CD進要版控的資料夾,來進行相關設定 ```linux $ cd xxx/xxx/xxx/<目的資料夾> ``` Git的初始化環境 (建立本地數據庫 Local Repository) ```linux $ git init //git初始化環境 ``` 若顯示 "Initialized empty Git repository in C:/xxx/xxx/Projects/.git/" ,即成功初始化環境 * 設定使用者資料 1. 設定使用者的名稱及使用者信箱 2. 設定好後,檢查設定內容 ```linux $ git config --global user.name=<自訂使用者名稱> $ git config --global user.email=<自訂使用者信箱> $ git config --list //檢查 ``` 若顯示 "user.name=<自訂使用者名稱>" "user.email=<自訂使用者信箱>" 這兩行即完成簡單設定 ## Git的根目錄 在建立數據庫(Repository)後會建立一個.git的隱藏資料夾,其中幾個目錄及重要文件: * hooks:儲存鉤子的檔案夾 * logs:儲存日誌的檔案夾 * refs:儲存指向各個分支的指針(SHA-1標識)檔案 * objects:存放git物件 * config:存放各種設定文件(Repository的設定檔) * HEAD:指向當前所在分支的指針檔案路徑,一般指向refs下的某檔案 若想查看config相關資訊 config在(windows系統) C:\USER\ $USER 下的.gitconfig (Git本身的設定檔,並不是數據庫的設定檔唷!) ## 基本指令架構 ![](https://i.imgur.com/sIY0mnk.jpg) * Git 常用指令 | Git 指令 | 指令說明 | | -------- | -------- | | git status | 查詢當前狀態 | | git add | 檔案加入到索引/暫存區 | | git commit -m "註記" | 提交更新+註記說明 | | git log | 查看commit的所有紀錄 | | git push | 與遠端數據庫資料合併(上傳) | | | | ## 將本地的資料上傳至遠端數據庫(GitHub) | Git 指令 | 指令說明 | | -------- | -------- | | git push | 上傳至遠端數據庫 | | git pull | | | git remote | 連結遠端數據庫| 新建一個repository的數據庫後,會有兩種方法連接: 1. 直接建立一個新的數據庫並連接 create .... 2. 將舊有的數據庫直接連接 push .... 再來依據需求將說明的程式碼在終端機上逐行執行即可完成本地與遠端的數據庫連接,若有成功上傳的話重新整理頁面即可看到上傳的檔案了。 ![](https://i.imgur.com/BA6MeGH.jpg) 如果無法連結成功請看SSH金鑰設定問題 * 遠端數據庫(Repository)的操作 1. 註冊遠端數據庫: <origin> 可自定義名稱 ```linux $ git remote add origin <遠端數據庫網址> ``` 3. 更新資料到遠端 MASTER 分支: git push -u <origin> master 4. -u 預設推到哪個遠端數據庫服務 ## SSH金鑰設定 當我們使用者端Client 要push資料上去 GitHub 伺服器( Server )時,需要一個安全傳輸協定。 而在 GitHub 中有兩種存取資料的連線方式一種是 https 另一種是 ssh,兩者的差別在於 https 在每次 git push 前都要輸入密碼,而 ssh 相對的就不用輸入密碼即可立即上傳,若不想每次都輸入密碼可以參考 ssh 連線方式。 >![](https://i.imgur.com/r7awp4c.png) > >1.Client 端發送 SSH 連線請求 2.Server 傳送隨機訊息 3.Client 端使用私鑰加密,並回傳加密訊息回 Server 端 4.Server 端使用公鑰解密,若訊息吻合代表用戶驗證成功 * 使用SSH與GitHub連線教學 1. 產生金鑰 用 ssh-keygen 來建立,輸入以下指令,來產生新的 SSH Key。 ```linux $ ssh-keygen -t rsa -b 4096 -C "你的信箱" //註冊GitHub的信箱 ``` ![](https://i.imgur.com/FIdhoUg.jpg) 3. 設定金鑰代理 如果沒設定代理每次上傳時還是會要求輸入密碼。 ```linux $ eval "$(ssh-agent -s)" //啟用 SSH 代理伺服器 $ ssh-add -K ~/.ssh/id_rsa //將私鑰及加入到 SSH 代理上 //儲存路徑有改的化請依照存放路徑更改=> xxx/xxx/.ssh/id_rsa ``` ![](https://i.imgur.com/0ofSbLm.png) 3. 上傳公鑰至 GitHub 進入 .shh 資料夾(.開頭的為隱藏資料夾),進入後可以看 到 id_rsa、id_rsa.pub 分別為私鑰和公鑰,打開公鑰(id_rsa.pub)把全部複製起來,接著開啟 GitHub 頁面進行設定。 ```linux $ cd ../.ssh //儲存路徑有改的化請依照存放路徑更改=> xxx/xxx/.ssh $ cat id_rsa.pub //查看檔案內容 ``` 進入GitHub頁面 > 右上角下拉選單 > settings > SSH and GPG keys > New SSH key ![](https://i.imgur.com/qaU4zut.jpg) ![](https://i.imgur.com/w4Ovdob.jpg) 將複製的公鑰全部貼上,在Add SSH Key 完成SSH配對的步驟。 之後就可以回頭去push一次檔案了。 ## Git 版本的細節 * Head:指標 * Branch:分支,預設分支為 master * origin:預設遠端數據庫名稱 * 還原先前的版本 | Git指令 | 說明 | | ---------------- |:--------------------------------:| | git checkout | 移動指標(head)的位置 | | git clean <-n-f> | 清空為加入追蹤的檔案 | | git reset HEAD | 將加入索引的檔案,退回工作目錄 | | | (仍有追蹤,但這次COMMIT會無紀錄) | ![](https://i.imgur.com/Nnc4GdE.png) * Git 分支( Branch ) 當網頁開發時,通常會有一個本地主機、正式主機及測試主機。 而可以用 Branch 來達成建立測試主機,而不影響本地及正式主機的運作 | Git指令 | 說明 | | ---------------------------- |:-------------------------------------- | | git branch <b_name> | 建立分支 b_name | | git branch | 查詢分支情況 | | git checkout <b_name> | 切換到分支 b_name | | git merge <b_name> | 將分支 b_name 與 master 合併(快轉) | | git merge <b_name> [--no-ff] | 將分支 b_name 與 master 合併(取消快轉) | >可把checkout當作切換世界(由本地主機切換到測試主機) checkout切換到別的分支後一樣要有add及commit流程才能記錄 在分支修改的檔案亦不會影響舊有的資料 >在快轉機制上: master branch的基底式同一條線,不易看出來修改的即合併的點在哪裡。 取消快轉機制上:會將branch的紀錄保留下來,從樹狀圖上可以明顯看出來分支的起點及合併點 * 待補充 * 待補充 * 待補充 * 待補充