git 學習心得
1. 什麼是 git
git 是「分散式」版本控制
那什麼是版本?
- 每次更新的檔案
- 每一次的更改
- 每次更新的紀錄
2. 安裝 git
- 先到 git 網站
- 右下點選 download for Windows 就會進到另一個網址並自動下載
- 安裝 git.exe(好像一直下一步就好)
提示: 安裝路徑中不要有中文字,容易出錯。
(可以參考這部五倍紅寶石的影片) - 左下角的開始找尋 Git Bash
確認電腦裡是否有安裝過 git:
1 | git --version |
3. 設定環境變數
目的:告訴 git 這台電腦的使用者是誰,牽涉到後面使用 github。
1 | # 設定環境變數 |
4. 建立 repo
repository (儲存庫) –> repo
不可能整個電腦都給 git 管,這樣範圍會太大。
所以每一個專案的進度(版本)都是獨立控管
在要被控管的專案(ex: hello-git 資料夾)底下,輸入這個指令
1 | # init 是 initial的縮寫 |
會在這個 hello-git 內建立了 .git 檔案夾,之後所有關於 git 管理的資訊都會存在這個檔案夾。
Q: 如果 hello-git 這個檔案夾(專案) 不想再被 git 管理了?
A: 直接把整個 .git 檔案夾刪掉 rm -r .git
暫存區域: 放準備要提交的檔案 (這一次要 commit 的)
5. 在 repo 中新增、修改、刪除檔案
檔案狀態
下面示意圖說明了透過指令改變狀態的生命週期,事實上,這些改變的過程,都是在更新「索引檔」的過程。
- untracked (未追蹤的,代表尚未被加入 Git 儲存庫的檔案狀態)
- unmodified (未修改的,代表檔案第一次被加入,或是檔案內容與 HEAD 內容一致的狀態)
- modified (已修改的,代表檔案已經被編輯過,或是檔案內容與 HEAD 內容不一致的狀態)
- staged (等待被 commit 的,代表下次執行 git commit 會將這些檔案全部送入版本庫)
圖片參考網址
查看 git 的狀態
1 | $ git status |
把檔案加入
1 | $ git add <file> |
提交這次的修改
1 | $ git commit -m "正確填寫這次 commit 的資訊" |
檢視這次修改的差異
工作目錄與暫存區域的比較
1 | $ git diff <file> |
暫存區域與儲存庫的比較
1 | $ git diff --cached <file> |
已經加入過的檔案,又有修改的話,一樣要再 add 一次,才可以 commit
1 | $ git add <file> |
針對已經加入過的檔案,可以直接用以下指令提交
這邊的 -a 代表 add
1 | $ git commit -am "xxxxx" |
可以「反悔」加入暫存區
1 | $ git restore --staged <file> |
反悔剛剛的修改
以前的指令是 checkout
連刪除檔案也可以反悔
1 | $ git restore <file> |
將刪除狀態加入暫存區
rm 跟 add 都可以,因為 git 是更新狀態
1 | $ git rm/add <file> |
讓檔案回到某個特定版本
<commit> 通常是複製 6~7 碼,重複的機率很低
1 | $ git checkout <commit> test.txt |
讓檔案回復到前兩個版本
1 | $ git checkout HEAD~2 test.txt |
回到現在版本
1 | $ git checkout HEAD |
- Untracked files: 代表還沒加入給 git 管的檔案(不是每個檔案都要給 git 管)
- git 的單位不是檔案,而是每次的修改。
git log
相關指令
1 | # 查看提交紀錄 |
git 運作流程
圖中的 git checkout (舊寫法) 應該為 git switch (新寫法)
圖片參考網址
6. 建立分支(branch)與合併(merge)
預設分支: master / main
Github 預設為 main,所以用 main 比較好
把 git 預設分支改成 main
進入 .gitconfig
1 | $ nano ~/.gitconfig |
加入下面這段
1 | [init] |
如果 hello-git 已經是 master 的話可以執行以下指令把主分支改成 main
1 | $ git branch -m master main |
branch
1 | # 檢視分支 |
merge
情境:
分支 main: 主分支
分支 login: 這是用開發 login 功能的
當我們把 login 功能完成後,必須把這個 login 分支「merge」回主分支去
1 | # 先切回main分支 |
如果兩個分支有提交過同一個檔案的修改,那就有可能發生衝突 conflict,此時就需要解衝突。
ex: main 有增加 h1,login 有增加 input
只能人工修改,需要跟同事討論
解完衝突之後,就要再 commit 一次 (bash 有提示)
當發 pull request 的時候,有衝突,要求開發的人回到自己的電腦,
把 main merge 進去 login 一次,再 push 一次這個 login。
git hub 教學
7. 建立 github repo
- 在 repositories 畫面按右邊綠色的 new 按鈕
- 輸入專案名稱
- public: 大家都看的到 private: 可以決定誰看的到
- 可以選用 HTTPS 或 SSH,目前我們是使用 HTTPS
在 github 上建立一個 github repo
1 | git remote add origin https://github.com/Danniel-Lu/hello-git.git |
- remote: 遠端
- add: 增加
- origin: 是這個遠端的名字,可以不要叫做 origin,但建議不要改
- https://github.com/Danniel-Lu/hello-git.git: 就是那個遠端 repo 的網址
1 | #通常第一次push要加 -u (-u:做紀錄的意思,upstream) |
- push: 推送程式碼到遠端去,而且是推到 origin 這個遠端,要推送的分支是 main
任務 8: 撰寫 readme
像是 github 專案下面會出現的文字說明就是 README.md 檔
README.md 通常都是大寫表示
使用 Markdown 語法撰寫 readme 檔案
- 介紹專案
- 解釋專案怎麼安裝
- 解釋專案怎麼使用
- …
任務 9: 了解 git flow
要合併分支,會在 github 發 pull request,再請另外一個同事幫忙做 code review。
- 測試看看要合併的這個分支功能是否正常
- 測試哪些情境?
- 開發工程師的產出是程式碼
- coding style 有沒有符合我們團隊的規範
- 看看這次的程式有沒有什麼可能的問題,例如效能問題
0. 常用的終端機指令
Windows | MacOS/Linux | 說明 |
---|---|---|
cd | cd | 切換目錄 change directory |
cd | pwd | 顯示目前所在路徑 print working directory |
dir | ls | 列出目前檔案夾的檔案列表 list |
mkdir | mkdir | 建立新的檔案夾 make dir |
copy | cp | 複製檔案 copy |
move | mv | 移動檔案 move |
del | rm | 刪除檔案 remove |
cls | clear | 清除畫面上的內容 |
cat | cat | 印出檔案內容 |
windows 的 Git Bash 可以用 Mac 的指令
1 | # 建立 hello-git 檔案夾 |
參數可以使用多個
參數的意義,不同指令會不一樣,但通常會是這樣
-a => all 全部——–ex: ls -a 列出全部檔案(列出隱藏檔
-r => recursive ->可以刪除每一層資料夾
-f => force 強制 * => 全部
/ => 根目錄
ex: rm -rf /* =>電腦會變磚塊,不能亂下
1 | . 目前的檔案夾位置 |