---
# System prepended metadata

title: Git 學習筆記
tags: [Git]

---

---
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/)

