--- tags: Git --- # Git 學習筆記 ## <font color="#ffc000">一、 安裝軟體</font> ### <font color="#0070c0">1. Git</font> https://git-scm.com/downloads 安裝完開啟Git Bash使用。 ### <font color="#0070c0">2. Sourcetree</font> https://www.sourcetreeapp.com/ Git的圖形化介面管理的軟體工具。 ## <font color="#ffc000">二、 基本指令架構</font> ![架構圖](https://i.imgur.com/9uU4TyB.png) 圖片來源: W3HexSchool ## <font color="#ffc000">三、 常用指令</font> 筆記說明: A. [ ] 表示要自行輸入的內容。 B. SHA-1碼至少要輸入4碼,一般會輸入7碼。 ### <font color="#0070c0">1. 檢查版本</font> ``` git --version ``` ### <font color="#0070c0">2. 使用者設定</font> 通常是在此電腦上第一次用git時要設定。 <br/> **(1) 設定使用者名稱** ``` git config --global user.name "[你的名字]" ``` <br/> **(2) 設定使用者信箱** ``` git config --global user.email "[你的信箱]" ``` *--global代表為全域設定,若要在個別專案內設定可用改用--local。 ### <font color="#0070c0">3. 查詢設定內容</font> ``` git config --list ``` ### <font color="#0070c0">4. 初始化數據庫</font> ``` git init ``` 輸入後會在當前目錄建立 .git 的隱藏資料夾,可以開始輸入版本控制的相關指令。若檔案不想再進行版本控制了,刪除此資料夾即可(慎行)。 ### <font color="#0070c0">5. 縮寫</font> ``` 例如:git config --global alias.st status ``` 之後可以用git st代替git status。 ### <font color="#0070c0">6. 查詢當前狀態</font> ``` git status ``` 可查看那些檔案已加入索引但尚未提交等,各狀態說明如下: **(1) Untracked files 尚未追蹤** 檔案還沒加入索引,所以此時git還沒對檔案進行版本控制。 <br/> **(2) Changes to be committed 等待提交** 檔案已加入索引,尚未提交到本地數據庫。 <br/> **(3) Changes not staged for commit 已更改尚未提交** 檔案已加入過索引,但是之後又修改過該檔案且尚未再次提交到本地數據庫。 <br/> **(4) Committed 已提交** 檔案已提交至本地數據庫。 <br/> **(5) 檔案狀態圖表** ![檔案狀態圖表](https://i.imgur.com/gQonmMZ.jpg) 圖片來源: W3HexSchool ### <font color="#0070c0">7. 加入索引(暫存區)</font> **(1) 單獨將檔案加入索引** ``` git add [檔案名稱.副檔名] ``` <br/> **(2) 在此目錄下(通常為根目錄)的檔案全部加入索引** ``` git add . ``` ### <font color="#0070c0">8. 提交</font> 將在索引內的檔案提交至本地數據庫。 ``` git commit -m "[輸入摘要(中英文皆可)]" ``` *有輸入-m就不會進入Vim編輯器畫面輸入摘要。 ### <font color="#0070c0">9. 查看提交紀錄</font> **(1) 列出目前提交的紀錄,要離開畫面按q** ``` git log ``` <br/> **(2) 查看簡化後單行的紀錄** ``` git log --oneline ``` <br/> **(3) 可以查看更詳細的紀錄。** ``` git reflog ``` ### <font color="#0070c0">10. 修改提交摘要</font> **(1) 修改最新的一筆** ``` git commit --amend -m "[新的摘要]" ``` <br/> **(2) 選定要修改的版本區間** ``` git rebase -i [SHA-1碼] ``` *-i為啟動互動模式,會進入Vim編輯器畫面。 *SHA-1碼可以到git log 裡面查詢,在這指令輸入代表從輸入的SHA-1碼到最新的提交紀錄都列出來。 進入Vim編輯器畫面後可以看到查詢的範圍列表, 例如: pick <font color="#d92c0d">5ccba59</font> 我是摘要 將前面pick改為reword如下: reword <font color="#d92c0d">5ccba59</font> 我是摘要喔 輸入:wq存檔離開後就修改完成摘要了,如果沒要修改則輸入:q離開。 *修改完後的SHA-1碼會變更。 *在這模式下還可以做commit的合併、拆解和刪除等。 ### <font color="#0070c0">11. 還原commit</font> **(1) 回到上一次的commit狀態** ``` git reset HEAD^ ``` 還原後當前版本到還原版本之間的變更檔案會回到工作目錄,所以若要再次commit,必須要先重新加入索引git add .。 *HEAD為目前所在的分支,可以用git log查看。 *^ 為回到上一次,打兩個 ^^ 則為回到上兩次的狀態,以此類推。 <br/> **(2) 回到上一次的commit狀態(加上--hard指令)** ``` git reset HEAD^ --hard ``` 一樣為還原到上一個狀態,但是加了 --hard 後,現在版本到還原版本之間的變更檔案會全部捨棄掉。 <br/> **(3) 還原到指定的commit版本號** A. ``` git reset [SHA-1碼] [--hard] ``` B. ``` git checkout [SHA-1碼] ``` 用checkout的檔案狀態與加了 --hard 相同。 **(4) 若是切換到別的版本後,想返回** 例如目前的狀態: * <font color="#d92c0d">bc57a8f</font> (HEAD) test2 (現在位置) * <font color="#d92c0d">f6a9543</font> test1 (上一個版本) 當切換到上一版git checkout <font color="#d92c0d">f6a9543</font>後,可以再輸入git checkout <font color="#d92c0d">bc57a8f</font> 或是git reset <font color="#d92c0d">bc57a8f</font> --hard返回。 *如果忘記當初的SHA-1碼,可以使用git reflog查看。 ### <font color="#0070c0">12. 設定要忽略的檔案</font> 在根目錄下新增一個 .gitignore的檔案,內容輸入要被git忽略的檔名或資料夾, 例如: **(1) 忽略檔案** Test.html view/Test.html **(2) 忽略資料夾** node_modules /dist ## <font color="#ffc000">四、 分支常用指令</font> ### <font color="#0070c0">1. 新增分支</font> **(1) 在當前位置建立分支** ``` git branch [分支名稱] ``` 分支可以建立多個。 **(2) 在指定的 commit 上建立分支** ``` git branch [分支名稱] [SHA-1碼] ``` ### <font color="#0070c0">2. 查看分支</font> ``` git branch ``` 可以查看各分支名稱,另外在分支名稱前有*字號者為目前的所在分支位置。 ### <font color="#0070c0">3. 切換分支</font> ``` git checkout [分支名稱] ``` ### <font color="#0070c0">4. 刪除分支</font> ``` git branch -d [分支名稱] ``` *刪除時不可以在要刪除的分支上。 *若是遇到要將尚未合併的分支刪除時,要將 –d 改為 –D 則才會被強制刪除。 *被刪除分支的commit 記錄還是會存在。 ### <font color="#0070c0">5. 還原分支</font> ``` git branch [舊分支名稱] [SHA-1碼] ``` 其實就是重新再建立一個新分支。 ### <font color="#0070c0">6. 改分支名稱</font> ``` git branch -m [原分支名稱] [新分支名稱] ``` ### <font color="#0070c0">7. 合併分支</font> ``` git merge [要被合併的分支名稱] [--no-ff] ``` *被合併的分支不會被刪除,只是他們的之間的檔案會被合併成一個新的commit。 *加上--no-ff 為取消快轉模式的意思,用在兩個分支在同一線程上時,這樣在查看合併的線圖時才比較清楚。 例如: A. 用Sourcetree 來看線圖,尚未合併前的狀態 ![線圖](https://i.imgur.com/QbY3dZt.png) B. master合併dev後,會有紅色的線條可以查看,因此會知道該紅線是dev的commit紀錄 ![線圖](https://i.imgur.com/FdwlvvL.png) ### <font color="#0070c0">8. 發生衝突</font> 例如目前線圖為: ![線圖](https://i.imgur.com/Iju01i8.png) 當要用dev分支合併master時,因為彼此都有各自commit過了,若是有修改到同一個檔案,相同位置的內容,那麼就會發生衝突,這時就必須解決衝突後才能完成合併。 ```htmlembedded <<<<<<< HEAD <p>b</p> ======= <p>4</p> >>>>>>> master ``` HEAD為目前所在的分支dev,====上方為dev的內容;下方為master的內容。解決衝突的方法為把要的地方留下,例如只留下\<p>b\</p>後存檔,再依序執行git add與git commit即可。 只留下正確的內容: ```htmlembedded <p>b</p> ``` *如果當下無法解決衝突可以執行git merge --abort 指令來取消合併。 ## <font color="#ffc000">五、 遠端數據庫</font> 以下是搭配GitHub ( https://github.com/ )使用。 ### <font color="#0070c0">1. 建立</font> **(1) 登入帳號後,於GitHub頁面右上方+號新增專案** ![建立專案](https://i.imgur.com/VKrmuaH.png) **(2) 輸入專案名稱(英文)後,建立新專案** ![專案取名](https://i.imgur.com/VGD1HdC.png) ### <font color="#0070c0">2. 推送資料</font> 建立完專案後,可依照網頁提示的情況來選擇如何將本地資料推送到遠端數據庫,個人常用在本地專案的終端機輸入指令推送資料。 ![指令](https://i.imgur.com/xKfiJsi.png) **(1) 加入遠端數據庫** ``` git remote add [設定遠端數據庫的簡稱] [網址] ``` <br/> **(2) 將本地資料推送到遠端數據庫** ``` git push [設定數據庫的簡稱] [要推送的分支名稱] ``` *會需要輸入 GitHub的使用者帳號及密碼。 ### <font color="#0070c0">3. 克隆</font> **(1) 到遠端數據庫頁面點選 Code 下載自己或別人的專案** ![下載專案](https://i.imgur.com/bvnRLFd.png) **(2) 使用指令或直接下載ZIP檔** ``` git clone [HTTPS網址] ``` 到本地資料夾的終端機輸入後,就會複製整份專案。 ### <font color="#0070c0">4. 查詢遠端數據庫列表</font> ``` git remote [-v] ``` 可以查看遠端數據庫列表。 *加上 -v 可以查看更詳細的列表。 ### <font color="#0070c0">5. 更新本地數據庫</font> ``` git pull ``` 將最新的遠端數據庫內容下載下來並合併本地數據庫的內容,與其他人共同協作時會使用。 ### <font color="#0070c0">6. 多人協作</font> **(1) 複製專案到自己的遠端數據庫** A. 到要協作的專案頁面右方點選 Fork 複製到自己的 GitHub 帳號底下。 ![Fork](https://i.imgur.com/h0rvZH8.png) B. 複製完後會看到專案已經在自己的帳號底下了,並且會標示是從哪位原作者 Fork 複製過來。 ![顯示原作者](https://i.imgur.com/63bB1Ql.png) *複製過來的專案做新增修改並不會影響到原作者的專案。 <br/> **(2) 發送Pull Request(PR)申請合併** A. 如果要將修改過的專案,請求合併到原作者專案,要發送PR。在專案頁面點選 Pull request,再點New pull request。 ![PR請求](https://i.imgur.com/WoLBWdL.png) B. GitHub 會顯示自己專案跟原作的差異,沒問題後點選 Create pull request。 ![PR請求](https://i.imgur.com/koVb3fY.png) C. 輸入標題與內容,讓原作者知道大概修改了什麼,之後點選 Create pull request完成PR。 ![PR請求](https://i.imgur.com/aLPPgnr.png) D. 如果原作者收到合併請求,可以選擇是否合併來更新他的專案。 ## <font color="#ffc000">六、 參考資料來源</font> 1. [六角學院 - Git & GitHub 教學手冊](https://w3c.hexschool.com/git/cfdbd310) 2. [五倍紅寶石 - 為你自己學 Git](https://gitbook.tw/)