# Git 概念、常用語法及 GitHub 使用介紹 ## 基本概念 1. 需要新版本,開個資料夾。 2. 不想要加入版本控制的話,就不要開資料夾。 3. 避免版本號衝突,用亂碼來命名資料夾。 4. 開一個檔案來存最新檔案。 5. 開一個檔案來存歷史紀錄(誰先誰後)。 ## Git 運行概念 1. 新的檔案,尚未加入版本控制(`git add`)也還沒建立好版本(`git commit`)的內容,不可以直接用 `git –am “版本名”` 的方式加入並建立版本,一定要先將這個檔案加入版本控制( `git add + 內容經過更改的那個檔案名稱`),再 `git commit –m”再版的版本名”`,才可以將檔案建立起版本。(就像是需要先將檔案加入另一個資料夾中,再命名一次資料夾名稱) 2. 舊的檔案(之前已經有加入版本控制過、建立好版本過的),就可以直接透過` git –am”版本名”`加入版本控制並建立版本。 3. 使用 `git branch –v` 確認狀態時,分支前面有*者,為目前所在的分支。 4. 使用 `git merge + 分支名稱`,將分支合併進原本的分支後,分支就會變成最新的 commit(變成了最新版的資料夾),這時利用 `git log` 就可以看的到歷程。也因為合併是採複製的概念,所以這時可以用 `git branch –d+分支名稱`,再將原先被合併進來的分支刪除。 5. 團隊協作時,先使用 `git clone` 將專案下載下來本地進行編輯。如果這個專案沒有開放權限,就可以先用 `fork` 到自己的遠端,再下載下來本地編輯。 ## Git 運行基本順序 1. `git init`:初始化。 2. `git status`:確認狀態。 3. 將不要的檔案都放入 .gitignore: .gitignore 版本控制後,讓其他夥伴也知道你把甚麼檔案放進去。 4. `git add.`:將所有檔案都加入版本控制(加入資料夾)。 5. `git commit –am”版本名稱”`:建立版本及版本名(命名資料夾名稱)。 6. `git branch –v`:確認主幹及分支。 ## 名詞介紹 * **untracked**:不加入版本控制。 * **staged**:加入版本控制,但尚未正式建立新版。 * **conflix** :衝突。當不同分支發展不同功能後,要重新組合合併在一起時,在同個檔案有不同的地方,導致無法順利合併時,稱之。 * **hook**:發生某件事情時通知我。 * **git repository**:版本倉庫或版本資料庫,如 .git 檔案。 ## 常用語法 1. `git init`:初始化 git。 2. `git status`:git 目前版本狀態查詢。 3. `git add`:git add +檔案,將檔案加入版本控制。例:`git add 123`,將檔案名稱123加入版本控制。 4. `git add .`:一次將目前所有檔案都加入版本控制。 5. `git rm --cached`:git rm --cached +檔案,將檔案移除版本控制。 6. `git commit`:新建版本(就像新建一個資料夾),輸入 `git commit` 後就會進入到編輯器vim,在裡面可以新增 commit message (版本敘述,就像是資料夾名稱一樣),一樣是`:q!`或是`:wq`跳回。 7. `git commit –m “版本敘述”`:不進入vim,直接在 terminal 新增 commit message。例:`git commit –m “ first virtion”`。 8. `git commit –am “版本敘述”`:將所有檔案加入版本控制並建立版本(git add + git commit –m”版本敘述”)的綜合功能。 9. `git log`:查看版本歷史紀錄。每個版本上方會寫commit 後面接一串英數交雜,這個就是版本(編)號。 10. `git log --oneline`:查看簡單的版本歷史紀錄,此時的版本號會是簡易的前七碼。 11. `git checkout`:git checkout + 完整的版本號。將版本更改到版本號的那個版本。 12. `git checkout master`:將版本更改到最新的版本。 13. .gitignore:不想要被版本控制的檔案。先用touch 建立 .gitignore 檔,再將其他不想被版本控制的檔案加入 .gitignore 檔(透過 vim .gitignore,再輸入不想被版本控制的檔名,按 `:wq`離開),這樣即便之後一次用 `git commit –am`,.gitignore 檔也不被被版本控制。 14. `git diff`:再更改後的檔案再次加入版本控制前,可用 `git diff` 看出版本更改的東西在哪。 15. `git branch –v`:確認主幹及分支。 16. `git branch + 分支名稱`:新增分支並命名。 17. `git branch –d +分支名稱`:刪除分支。 18. `git checkout + 分支名稱`:移動到該分支。 19. `git merge +分支名稱`:`git merge A`,將 A 分支合併進目前所在的分支。 20. `git push + 遠端主機(git hub)名稱(通常叫做 origin) + 本地分支名稱`:將本地已經 commit 的版本上傳更新到 git hub。若之後有在本地新增 branch,也是一樣用此語法。 22. `git pull +遠端主機(git hub)名稱(通常叫做 origin) + 遠端分支名稱`:將遠端的分支下載下來(通常發生在多人協作時,需要將別人修改過上傳到 github 的分支再次下載下來使用)。 23. `git clone +網址`:將遠端的 repository 下載下來。 24. `git commit --amend`:更改已經 commit 的 commit message。會進入到編輯器裡,在裡面直接更改並儲存離開。 25. `git reset HEAD^`:(已經 commit)回到 commit 前的那個狀態(還保留此次修改的版本,只是尚未 commit),通常發生在 commit 後但又發現有錯需要更正內容。 26. `git reset HEAD^ --hard`:(已經 commit)回到上一個版本的狀態(此次 commit 的內容完全消失)。 27. `git reset +版本號`:(已經 commit )回到該版本號的狀態(等同於放棄目前最新的狀態)。 28. `git checkout --`:(尚未 commit)回到上一個版本的狀態(等同於放棄此次修改的東西)。 29. `git branch –m + 新的 branch 名稱`:(必須在欲修改的那個 branch 上)修改 branch 名稱。 30. `git checkout + 遠端的 branch 名稱`:將遠端的branch下載下來。 ## GitHub 使用教學 ![](https://i.imgur.com/kvPZ5HZ.jpg) 1. 將已經建好的 repository 放上 GitHub:點選右上角的 + → new repository,在輸入相關資料即可。 進來後就會有一些提示,像是用 git remote add + 代號 + github 提供的網址,並 git push –u + 代號 + master(主幹)。 2. commits 點進去可看到所有的版本。 3. contrinutor 代表共有幾個人協作此專案。 4. branch 可知道此專案有幾個分支。 5. Issue 為問題討論區。 6. clone or download 點進去可直接下載壓縮檔,或是有網址可在 cmder 內使用 git clone 語法下載。 7. fork 點選後再點自己的帳號,將別人的 repository 複製到自己的遠端。 8. setting 可以調整這個專案的權限。 9. pull requests 點進去後可將遠端的分支 merge 在一起,merge 後記得將被合併的那個分支刪掉。可以用 git pull 下載下來本地,使用 git log 確認 commit 狀態。 ## 問題解決 1. 用 `git init` 時,出現 Reinitialized existing Git repository:執行 `rm –rf .git`。 2. 當衝突產生時,先使用 `git status`,就會發現發生衝突的檔案,在使用 `vim` 進去手動編輯,移除黃底的欄位後,在另外將檔案編輯完成,即可再 commit。 ![](https://i.imgur.com/5Mtu7Aq.jpg) 3. 使用 `git pull` 將遠端的分支下載下來,若是與本地的分支有衝突時,一樣是需要透過 `vim` 手動修改。修改完畢後再 commit 一次,若有需要也可以再 push 回遠端。 4. 我 commit 了但又發現有東西要新增或修改怎麼辦?可使用 `git reset HEAD^` 回到 commit 前的狀態,再度進行修改後 commit。 5. 新增 branch 時打錯 branch 名稱。首先假設目前在 master,剛新增了一個 branch 叫做 wrongname。那就要先用 `git checkout wrongname` 跳到 wrongname,在這邊在用 `git branch –m rightname`。這樣就可以將 branch 改成 rightname了。 ## 補充 * 感謝第四期的同學提供圖片: ![](https://i.imgur.com/LASNgiv.jpg) ## 學習資源 * [學習 GIT 分支](https://learngitbranching.js.org/index.html?locale=zh_TW) ###### tags: `Git`