---
# System prepended metadata

title: Git入門篇
tags: [Git]

---

### AUSTRO_07/28(日)Git入門

聲明:以下是五倍學院所學的資訊與圖文
### Git說明

-把 Git 當 FTP 在用
什麼是 FTP?

-Git 是 更有效率的備份工具 
版本控制系統（Version Control）

-什麼是分散式的版本控制系統啊?

-Concurrent Versions System (CVS) 
since 1990

-Subversion (SVN)

-Git 就像是檔案的時光機

-誰發明了 Git？
Linus Torvalds 
for managing Linux kernel 
source code in 2005

冷知識
Git 已經問世 15 年了，但大家知道其實 Linus 在 Git 出生三個月之後
就把它交給別人（濱野純）養了嗎？

-Git 的優點
開放原始碼、免費使用
速度快、檔案小
同時支援本地(不須網路)及遠端操作
容易與其它人共同協作

**不同系統要安裝的套件資訊**
![螢幕擷取畫面 2024-07-28 195614](https://hackmd.io/_uploads/rkNbGhXYA.png)
***

### Git初步設定
確認版本：
``$ git --version``

設定基本資料 
使用者名稱 + Email

```git
# 檢視⽬前設定
$ git config --list 
# 設定 username 以及 email 
$ git config --global user.name "個人名稱" 
$ git config --global user.email "個人E-mail"
```
***
### Git初始化 
讓 Git 知道這個資料夾要進行版控！
``$ git init ``
```git
# 建立⽬錄
$ mkdir git-practice 
# 進入⽬錄
$ cd git-practice 
# 初始化
$ git init 
Initialized empty Git repository in /private/tmp/gitpractice/.git/
```

![螢幕擷取畫面 2024-07-28 200151](https://hackmd.io/_uploads/Hk8872mFC.png)
***

### 檢查git狀態
``$ git status``
```git
$ git status 
On branch master 
No commits yet 
Untracked files: 
 (use "git add <file>..." to include in what will be 
committed) 
  index.html
nothing added to commit but untracked files present (use 
"git add" to track
```

![螢幕擷取畫面 2024-07-29 001203](https://hackmd.io/_uploads/BJk40JEYR.png)
***

### 加進暫存區
``$ git add 資料名稱``
```git
$ git add index.html 
$ git status 
On branch master 
No commits yet 
Changes to be committed: 
 (use "git rm --cached <file>..." to unstage) 
  new file: index.html
```

![螢幕擷取畫面 2024-07-29 001536](https://hackmd.io/_uploads/B1nnRkNtR.png)
***

### 提交到儲存庫節點
``$ git commit -m "敘述新增的資料內容"``
```git 
$ git commit -m "init commit"
[master (root-commit) 732dc8d] init commit 
 1 file changed, 0 insertions(+), 0 deletions(-) 
 create mode 100644 index.html 
$ git status 
On branch master 
nothing to commit, working tree clea
```
![螢幕擷取畫面 2024-07-29 005704](https://hackmd.io/_uploads/BJnudg4FC.png)

***

### 檢視紀錄
``$ git log``
```git
$ git log 
commit 732dc8d0091669ba20b5d9c2fa30a1251d2a2e54 (HEAD -> 
master) 
Author: Eddie Kao <eddie@5xruby.tw> 
Date: Mon Apr 1 18:32:10 2019 +0800 
 init commit
```
***

### 回復上一層檔案或目錄狀態
讓檔案或目錄回到最近一次存檔的狀態
``$ git checkout index.html``
讓當前目錄的檔案回到最近一次存檔的狀態
``$ git checkout .``
***

### 檢視每行程式碼的紀錄(找出戰犯)
系統壞掉了...， 
等等，什麼時候有這一行程式碼? 這誰寫的?
檢視每行程式碼的紀錄
``$ git blame 檔案名稱``
***

### Git分支說明
分支是 Git 很大的賣點！
為什麼要使用分支？
一開始就有一個內建的 master 分支

對分支的誤解
分支只是一張 
貼在某個 Commit 上的貼紙

冷知識
聽說現在不能用 master 分支了？
因為美國黑白人問題
***

### 建立分支
``$ git branch cat``
翻譯蒟蒻：「我要新增一個叫做 cat 的分支！」
1. 在目前 HEAD 的所在地貼上 cat 貼紙 
2. 就這樣，沒別的變化，也不會長出什麼「分支」的形狀。
![螢幕擷取畫面 2024-07-29 003018](https://hackmd.io/_uploads/S1z4feEKR.png)
***

### HEAD說明
(上帝視角)
如果 HEAD 指向 master 就可以說
「現在正在 master 分支上」
***

### 切換分支
``$ git checkout cat``
翻譯蒟蒻：「我要切換到 cat 分支！」
1. HEAD 移動到 cat 貼紙 
2. 專案會變成 cat 貼紙指到的 Commit 的狀態，在這時候其實跟 master 是一樣的。
![螢幕擷取畫面 2024-07-29 003439](https://hackmd.io/_uploads/rkUNXeEKA.png)

``$ git commit -m "add cat 1"``
翻譯蒟蒻：「我要進行一次存檔！」
1. cat 貼紙與 HEAD 往前移動。 
2. 其它分支貼紙留在原地。 
3. 如果再做一次 commit 的話...
![螢幕擷取畫面 2024-07-29 003543](https://hackmd.io/_uploads/S1euQeVYC.png)

操作步驟
```git
# 新增⼀個名為 cat 的分⽀
$ git branch cat 
# 切換到 cat 分⽀
$ git checkout cat 
Switched to branch 'cat'
```
***

### 合併分支
操作步驟
```git
# 切換回 master 分⽀
$ git checkout master 
Switched to branch 'master' 
# 合併 cat 分⽀
$ git merge cat 
Updating a511c03..93d3ace 
Fast-forward #快轉合併
 cat1.html | 0 
 cat2.html | 0 
 2 files changed, 0 insertions(+), 0 deletions(-) 
 create mode 100644 cat1.html 
 create mode 100644 cat2.html
```
**以下是圖文步驟解說**

``$ git checkout master``
翻譯蒟蒻：「我要切回 master 分支！」
1. HEAD 移動到 master 貼紙。 
2. 專案會變成 master 貼紙指到的 Commit 的狀態。
![螢幕擷取畫面 2024-07-29 003821](https://hackmd.io/_uploads/rkpW4xEKC.png)

``$ git merge cat``
翻譯蒟蒻：「我要合併 cat 分支！」
1. master 與 HEAD 移動到 cat 貼紙的所在地。 
2. 快轉（Fast-forward）合併
![螢幕擷取畫面 2024-07-29 003903](https://hackmd.io/_uploads/BJDVNxVtC.png)

合併分支可看成在移動貼紙
Git 的本體是 Commit 
分支什麼的都只是浮雲！
![螢幕擷取畫面 2024-07-29 004258](https://hackmd.io/_uploads/SJ4mBeVFA.png)
***

### 無法快轉合併狀況說明
如果各自長大的話，情況就不一樣了(無法快轉合併)

操作步驟
```git
$ git branch dog
#翻譯蒟蒻：「我要建立一個 dog 分支！」
#1. 在目前 HEAD 的所在地貼上 dog 貼紙

$ git checkout dog
#翻譯蒟蒻：「我要切換到 dog 分支！」
#1. HEAD 移動到 dog 貼紙。 
#2. 專案會變成 dog 貼紙指到的 Commit 的狀態，在這
時候其實跟 master 是一樣的

$ git commit -m "add dog 1"
#翻譯蒟蒻：「我要進行一次存檔！」
#1. dog 貼紙與 HEAD 往前移動。 
#2. 其它分支貼紙留在原地。 
#3. 如果再做一次 commit 的話..

$ git merge cat
#翻譯蒟蒻：「我要合併 cat 分支！」
#1. 長出一個合併的 Commit C8。 
#2. dog 貼紙跟 HEAD 往前移動
```
![螢幕擷取畫面 2024-07-29 004840](https://hackmd.io/_uploads/BJ8YLeEFR.png)
![螢幕擷取畫面 2024-07-29 004852](https://hackmd.io/_uploads/HJqtLx4F0.png)
***

### 刪除已合併分支
``$ git branch -d cat``
翻譯蒟蒻：「我要刪除 cat 分支！」
1. 把 cat 貼紙撕起來。 
2. 就這樣，Commit 或是檔案不會因此受到影響

分支只是一張 
貼在某個 Commit 上的貼紙
***

### 發生衝突(Conflict)rebase解決
發生衝突(Conflict)了，怎麼辦?
另一種合併分支的方式
rebase 
= re（變換）+ base（根基）

![螢幕擷取畫面 2024-07-31 103458](https://hackmd.io/_uploads/HJJ-Q7PFR.png)

``$ git rebase cat``
翻譯蒟蒻：「我要踩在 cat 分支的頭上！」
1. 複製一份 C6 並接到 C5 後面，形成 C8。 
2. HEAD 移動到 C8。 
3. 複製一份 C7 並接到 C8 後面，形成 C9。 
4. HEAD 移動到 C9。 
5. dog 貼紙往前移動到 C9，HEAD 指向 dog 貼紙。 
6. C6、C7 脫離

![螢幕擷取畫面 2024-07-31 103524](https://hackmd.io/_uploads/BJcXXXPYA.png)
***

### merge vs rebase好壞處?

rebase 
好處


壞處


merge
好處


壞處

***


### 如何回到上一步reset解決

在 Git 的世界， 
``沒有刪除 Commit 的指令``
不熟git人 對reset這個指令的誤解
聽說 --hard 不能隨便亂用

關於 reset 指令
reset = become 的概念
我想變成 XXX 的狀態
![螢幕擷取畫面 2024-07-31 104830](https://hackmd.io/_uploads/r1JfImvtC.png)

``$ git reset 9a2995``
翻譯蒟蒻：「我想要變成 C4 的狀態！」
1. 目前的分支以及 HEAD 移動到 C4。 
2. C5 暫時看不見了（注意，不是被砍掉！）。 
3. 原本 C5 的內容，會被放至工作目錄（預設行為）

mixed / soft / hard

--mixed (預設) 
把檔案丟回工作目錄

--soft
把檔案丟回暫存區

--hard
直接丟掉

![螢幕擷取畫面 2024-07-31 105102](https://hackmd.io/_uploads/SyrsIQPYC.png)
***


### 相對定位 ^ 與 ~

^ = Caret = 卡瑞特 
~ = Tilde = 提爾達

``$ git reset f8458a^``
翻譯蒟蒻：「我想要變成 C5 的前一個狀態！」
1. 目前的分支以及 HEAD 移動到 C4。 
2. C5 暫時看不見了。 
3. 原本 C5 的內容，會被放至工作目錄

![螢幕擷取畫面 2024-07-31 105551](https://hackmd.io/_uploads/BJ9avmPtC.png)

``$ git reset HEAD~2``
翻譯蒟蒻： 
「我想要變成 HEAD 的前 2 個狀態！」
1. 目前的分支以及 HEAD 移動到 C3。 
2. C4 跟 C5 暫時看不見了。 
3. 原本 C4 跟 C5 的內容，會被放至工作目錄
***


### reset 跟 checkout 指令的差別？

checkout 不像 reset 指令有相關參數可設定檔案去留

![螢幕擷取畫面 2024-07-31 105551](https://hackmd.io/_uploads/BJ9avmPtC.png)

``$ git checkout eb396d``
翻譯蒟蒻：「我要去 C3 看一下！」
1. 分支不動，但 HEAD 移動到 C3。 
2. 專案變成 C3 時候的狀態（如果原本是乾淨狀態的話）。 
3. 不像 reset 指令有相關參數可設定檔案去留
***

### 使用標籤（Tag）

什麼時候會用到標籤？
正常人應該不會想要記 
51d54ffcbd76902f2f580cf5638305eaaf6acde5 
這麼長一串數字

``$ git tag 1.0.0 51d54ffc``
(我要在 51d54ffc 這個位置貼上一個 1.0.0 的標籤)

$ git checkout 1.0.0
(我要切換到 1.0.0 這個標籤的所在地)
***

### 怎麼上傳到 GitHub ?

GitHub 簡介
要跟別人共同協作的話， 
有共用的 Git 伺服器會比較方便
GitHub = 
一款有 Web 介面的 Git 伺服器
Git 不等於 GitHub

市面上有
GitHub / GitLab / Bitbucket / Gitea

GitHub = 
全球最大的宅宅交友網站
也是開發者最好的履歷!
跟厲害的開發者們交朋友吧!
***

### 設定遠端節點

``$ git remote add origin 某個網址``
翻譯蒟蒻：「我要新增一個叫做 origin 的遠端節點，這個節點會指向某個網址」

origin 是什麼？
origin 是一个默认的远程儲存庫名称。
主要作用是让我们可以与远程儲存庫进行交互。
通过 origin，我们可以从远程儲存庫获取更新（pull），将本地的修改推送到远程儲存庫（push），以及与其他开发者协作。
repository(儲存庫)
***

### SSH 還是 HTTPS？(安全連接方式)
兩個都是用來**連接遠端倉庫**的常見方法

各有優缺點：
SSH (Secure Shell)
安全性：SSH 使用公鑰加密，提供更高的安全性。
便利性：一旦設置好 SSH 密鑰，之後的操作不需要每次輸入密碼。
防火牆問題：某些防火牆可能會阻擋 SSH 連接，這可能會帶來一些麻煩。
[設定SSH龍哥教學影片](https://youtu.be/CeC_qyQHiCE?si=sZp6fRk6ivjOFRM-)

HTTPS (HyperText Transfer Protocol Secure)
簡單性：HTTPS 設置簡單，適合初學者。
普遍性：HTTPS 使用的 443 端口幾乎在所有防火牆中都是開放的。
安全性：HTTPS 也很安全，但需要每次操作時輸入用戶名和密碼或個人訪問令牌。


如果使用 GUI 軟體來的話.. ?
***

### 推上去！push解決(從本地儲存庫傳到遠端儲存庫)

![螢幕擷取畫面 2024-07-31 113332](https://hackmd.io/_uploads/BkZieEvYR.png)

``$ git push origin master``
翻譯蒟蒻：
「我要把本地的 master 分支，推往 origin 這個遠端節點，並且在遠
端形成一個 master 分支」
***

### 拉下來！pull解決(從遠端儲存庫拉回本地儲存庫)

![螢幕擷取畫面 2024-07-31 113524](https://hackmd.io/_uploads/B1C0WVvtR.png)

``$ git fetch origin master``
翻譯蒟蒻：
「我要去 origin 這個遠端節點，去抓上面 master 分支的內容，並且
在我的電腦上建立一個 origin/master 分支」
***

### fetch 跟 pull 都是下載，有什麼差別？

git pull = git fetch + git merge

``$ git pull origin master``
翻譯蒟蒻：
「我要去 origin 這個遠端節點，去抓上面 master 分支的內容，並且
在我的電腦上建立一個 origin/master 分支，同時與我本機的 master 分支進行合併」
***

### 複製clone解決
``$ git clone 某個Git網址``
翻譯蒟蒻：「我要把某個 Git 專案，整個複製一份到我的電腦裡」

***

### 跟他人共同工作會發生的狀況!

有時候會有推不上去的情況？

![螢幕擷取畫面 2024-07-31 114550](https://hackmd.io/_uploads/ByTOmEPt0.png)

記得先拉再推

或

``git push -f``(不建議看狀況)
會覆蓋遠端儲存庫歷史
使用前記得個相關人士都知情


