Git教學 – 關於Git – Git安裝



Git教學 – 關於Git – Git安裝

0 0


git


On Github Spicdev / git

Git教學

什麼是Git

  • 分散式版控系統
  • 由Linus Torvalds發明
  • 初期主要用來控管Linux Kernel的原始碼

關於Git

每個人都有一份完整的儲存庫副本

  • 不需要伺服器端的支援就可以運作
  • 提交版本都僅提交到本地的儲存庫
  • 提交速度快速

使用Git版本控管時,都僅提交到本地的儲存庫

  • 每個成員都可以把儲存庫複製(Clone)下來
  • 因為在本地提交變更,沒有任何權限限制

Git擁有非常強悍的合併追蹤能力

  • 取得他人變更的版本後,隨時可透過合併進行整合
  • 合併多人的版本只要有存取共用儲存庫的權限即可

Git安裝

Git基本環境(必要)

https://git-scm.com/

安裝過程只要一直下一步即可

  • 建議在如附圖步驟中,選擇Run Git from the Windows Command Prompt,會減少之後發生不知名錯誤的機會

Ubuntu使用者

  • apt-get install git

MAC使用者

  • 已內建,不用特別安裝

GitHub Desktop(建議一併安裝)

https://desktop.github.com/

好處

  • 方便與GitHub做溝通
  • 簡單設定Git使用者資訊
  • 簡單產生SSH金鑰
  • 提供簡易GUI介面

開始使用Git

設定使用者資訊

git config --global user.name "你的姓名"

git config --global user.email "你的Email"

如果有註冊GitHub帳號,並於GitHub Desktop安裝過程中進行登入,就不需執行上述指令

Git常用操作

使用流程圖

初始化Git儲存庫

  • git init

在專案目錄下,下git init指令來開始版控

查看Git儲存庫狀態

  • git status

接續上一步,使用git status來查看儲存庫狀態

  • On branch master代表目前處於名為master分支上
  • 紅字標示的檔案為"目前未被追蹤的檔案"

將新增修改的檔案加入追蹤

  • git add "檔案名稱"
  • git add .

使用git add "檔案名稱",來將指定檔案加入追蹤。或是使用git add .來將所有未被追蹤的檔案加入追蹤

再次查看Git儲存庫狀態

  • git status

將未被追蹤的檔案都加入追蹤後,再次使用git status來查看儲存庫狀態

  • 原本紅字改為綠字,並標示為準備被提交(commit)

進行版本提交

  • git commit
  • git commit -m "提交訊息"

確定所有新增修改的檔案均已加入追蹤,即可使用git commit指令來提交版本

  • git commit指令會自動開啟系統預設文字編輯器,待使用者輸入完畢、存檔,即完成本次提交
  • 使用git commit -m "提交訊息",可以直接完成提交
  • commit內容建議清楚、明確,才能方便之後的版本追朔

再次查看Git儲存庫狀態

  • git status

提交版本後,再次使用git status來查看儲存庫狀態

  • 顯示目錄下沒有未被追蹤或是被修改的檔案

查看提交紀錄

  • git log
  • git log -"數字"

如欲查看提交的版本紀錄,可以使用git log指令

  • 黃字部分為提交版本的ID
  • 如提交紀錄太多,可以使用git log -"數字",來限制顯示的紀錄數量

流程整理

  • 初始化git儲存庫
對檔案做新增修改 git add:選擇欲加入本次版本的變更檔案 git commit:將本次版本進行提交 回到第一步

GitHub遠端儲存庫

於GitHub主頁新增儲存庫

得到遠端位址

新增遠端儲存庫位址

  • git remote add "遠端儲存庫名稱" "遠端儲存庫位址"

在本地端建立的Git儲存庫是沒有遠端位址的,使用git remote add來進行新增

  • 新增一名稱為origin,位址為git@github.com:Spicdev/guitar.git的遠端儲存庫

查看遠端儲存庫位址資訊

  • git remote -v

git remote -v,用來列出所有遠端儲存庫資訊

  • 可以看到上一步新增的遠端儲存庫資訊

上傳至遠端儲存庫

  • git push "儲存庫名稱" "遠端分支"

再來使用git push,將已有的本地儲存庫上傳至遠端儲存庫,儲存庫名稱使用前幾步新增的origin,遠端分支選master

如上傳無發生錯誤,就可以在GitHub上看到上傳的檔案了

下載遠端儲存庫

  • git clone "遠端儲存庫位址"

同一團隊的人可以藉由git clone指令來將遠端儲存庫下載至本地端

  • clone下來的專案不須在下git init指令了

從遠端儲存庫更新

  • git pull "儲存庫名稱" "遠端分支"

當遠端儲存庫資料比較新時,不要使用git clone來將檔案再次抓下來,而是使用git pull來將遠端儲存庫較新的資料更新下來

  • Git在做push時,本地的版本一定要比遠端版本新才能push成功,否則會跳出警告,提示要先pull後才能push

新增共同協作者

要進行多人協作前,必須要在遠端儲存庫Settings內的Collaborators裡新增協作者,這樣其他人才有權限進行push的動作

流程整理

  • 本地儲存庫欲上傳:git push,將檔案上傳至遠端
  • 遠端儲存庫有更新:git pull,將更新拉下至本地端
對檔案做新增修改 git add:選擇欲加入本次版本的變更檔案 git commit:將本次版本進行提交 回到第一步

流程圖回顧

Gitk

Git內建的基本GUI介面

  • 查看分支資訊有GUI介面較為方便
  • gitk指令用來開啟僅包含目前所在分支的資訊
  • gitk --all指令用來開啟包含所有分支的資訊

Git分支

每個分支可以想像成不同的資料夾,不同的資料夾代表不同的分支

  • 分支內的檔案是獨立的
  • 善用分支有助於版本的分類

察看分支

  • git branch

直接輸入git branch即可查看儲存庫有哪些分支存在,也可得知目前處於哪一分支上

  • 目前僅有master這一個分支存在
  • 目前位於master分支上(前有星號)

新增分支

  • git branch "分支名稱"

為了之後版控方便,使用git branch develop指令,新增一支名為develop的分支,之後主要開發都在此分支上進行

  • 再次使用git branch指令可以發現多了一支剛剛新增的develop分支

切換分支

  • git checkout "分支名稱"

使用git checkout "分支名稱",來進行分支切換,以在該分支下進行開發

  • 再次使用git branch查看,已確實切換至develop分支上了

不同分支上的開發

先使用gitk --all指令查看

  • 目前master分支和develop分支處於同一水平線上,代表目前兩分支狀態一樣
  • develop字型較粗,代表目前處於develop分支上

在develop分支上,我們新增一new_page.jsp的檔案,並確實進行版本提交

  • 發現develop分支和master分支不處於同一水平線上了
  • develop分支較master分支高,代表develop分支內容較新

將分支切回master,並對其中一index.jsp檔案進行編輯,且確實進行版本提交

  • 發現develop分支和master分支已經分開了,因為各有屬於各自的版本存在

Git分支合併

開發一段時間後,各分支上的版本可能有數個

  • master分支和develop分支各自都提交過兩次新版本

Git合併

  • git merge "欲合併的分支名稱"

假設develp分支上的開發已告一段落,先確認自己是否在master分支上,並使用git merge develop指令,來將develop分支上的內容合併到master上

  • git merge指令是將指令中的分支合併到目前所在的分支上,所以合併前務必確認好兩者關係

合併後的圖

  • develop分支和master分支線圖連在一起了

Git合併時的衝突

什麼時候會發生合併衝突

  • 不同分支上對同一檔案進行新增修改

現在對兩分支上的web.xml同時進行修改,並做將develop分支合併到master分支上的動作

  • 在合併時會跳出衝突警告

打開發生衝突的檔案

  • git會自動對衝突檔案做一些內容修改
  • <<<<<<<<<< HEAD到==========的中間區域是目前所在分支的內容,而從===========到>>>>>>>>>>> develop則是要合併的develop的內容

衝突處理過程

將發生衝突的檔案打開,處理內容(別忘了刪除 <<<、===、>>>) 使用git add將處理好的檔案加入追蹤 如有多個衝突檔案,反覆步驟1~2直到所有衝突處理完畢 git commit提交合併 完成
  • 多人協作合併時發生衝突,建議和對方一同討論衝突發生原因,不要獨斷處理衝突

衝突處理完畢後

Git恢復、修改狀態

修改前次commit提交的訊息

  • git commit --amend

取消剛剛的Commit,但保留修改過的檔案

  • git reset HEAD^ --soft

取消剛剛的Commit,且回到再上一次Commit的乾淨狀態

  • git reset HEAD^ --hard

復原已被更動的檔案

  • git checkout "檔案名稱"

回到某ID對應Commit的狀態,但保留修改過的檔案

  • git reset "commit ID" --soft
  • commit ID可用git log查看

回到某ID對應Commit的狀態,且回到該Commit的乾淨狀態

  • git reset "commit ID" --hard
  • commit ID可用git log查看

使用Eclipse進行Git版控

Eclipse已內建Git相關工具了,但要手動開啟視窗才能操作。選擇Git Repositories這個View

Eclipse上會出現相關的視窗,可以進行新增現有儲存庫、從遠端複製儲存庫、創建一個新的儲存庫

這裡示範使用新增現有儲存庫來將先前一直使用的guitar專案加入

成功後便會顯示於Git Repositories這個View裡

  • 加入儲存庫後Eclipse並不會同時將專案匯入,還要在自己手動匯入專案才能在Eclipse上進行後續開發

Eclipse編輯

有修改過的檔案前面會有>號標示

Eclipse版控

在Git Repositories這個View裡按右鍵可以選擇各種git操作

Switch To可以切換不同分支,也可在此新增分支

Commit裡包含commit和add功能,可在此同時輸入commit訊息並勾選想要add的檔案

在進行push和pull前先在Git Repositories這個View裡檢查是否有Remote資訊在,沒有的話要新增一個才能進行遠端操作

Show In裡的History打開後可以進行更直覺的操作

可以看到跟gitk上相仿的介面

  • develop分支字型較粗代表目前位於develop分支上
  • 右下角的視窗顯示本次commit修改過的檔案

對任意commit的點右鍵可以快速進行reset動作

對右下角檔案右鍵可以快速進行目前檔案跟之前commit檔案內容比對

左邊是目前版本,右邊是比對的之前版本

常見版控流程

集中式版控流程

集中式版控流程

  • 共用儲存庫
  • 流程容易理解
  • 類似SVN流程
  • 多人同時進行版控,容易先push的人較佔有優勢
  • 若有其他人已經先push過,必須先pull後才能push

整合管理版控流程

整合管理版控流程

專案維護人員先推送一個版本到主要儲存庫(唯讀) 專案開發成員各自複製該儲存庫回去開發 專案開發成員推送變更到自己的儲存庫 專案開發成員向專案維護人員提出要合併的請求 專案維護人員進行審核,再將變更進行合併整合 專案維護人員將合併的變更推送回主要儲存庫

流程分支圖

.gitignore忽略清單

用途

在開發專案時,工作目錄下可能經常會有新的檔案產生(可能是透過Visual Studio工具產生的那些暫存檔案或快取檔案),可能有許多檔案並不需要列入版本控管,所以必須要排除這些檔案,稱為「忽略清單」

直接在目錄下新增一個叫.gitignore的檔案即可,新增在此的檔案之後部會被加入追蹤,也不會進入版控

  • *.class代表所有class檔案不加入版控
  • *.log代表所有log檔案不加入版控
  • build/代表build資料夾下的所有檔案不加入版控

gitignore清單範本

https://www.gitignore.io/

可以自行輸入開發環境、使用語言等,來自動產生對應.gitignore檔案

其他整合Git的工具

SourceTree

https://www.sourcetreeapp.com/

Visual Studio Code

https://www.visualstudio.com/products/code-vs

其他學習Git的管道

30 天精通 Git 版本控管

https://github.com/doggy8088/Learn-Git-in-30-days

Pro Git

https://git-scm.com/book/zh-tw/v1

The end

hint:鍵盤Esc鍵可以瀏覽所有投影片、Alt+滑鼠點擊可以放大投影片
Git教學