---
# System prepended metadata

title: '[GIT101] Git 超新手入門(筆記)'
tags: [Lidemy學院, '[GIT101] Git 超新手入門']

---

# [GIT101] Git 超新手入門(筆記)
###### tags:`Lidemy學院` `[GIT101] Git 超新手入門`
## 在開始學習 Git 前的預備知識
### 什麼是版本控制？
說穿了其實大家都曾經做過版本控制，因為改了檔案之後想要保存上一次的歷史紀錄嘛

例如說：report.doc, report2.doc, report_final.doc, report_finalfinal.doc.....

其實這樣子就是版本控制了，但是會碰到哪些問題？

1. 多人協作有困難
2. 檔案多了、時間久了以後很難管理
所以你需要一套專門來做版本控制的軟體，沒錯，就是 Git！
* 甚麼是版本控制
* 為甚麼要學版本控制

版本控制可以分一人或多人，基本上我們希望，將每一個檔案不同的版本，都保存下來。

多人(團隊)版本控制，就會需要一個穩定版的版本，將他放在遠端，個人的檔案會在本地端，這樣遠端有一個穩定版，個人本地端，有個人去撰寫程式，程式完成在放到遠端，供他人使用。

==Git : 就是幫忙做版本控制的程式==
___
### 如何安裝 Git - Windows
在 Windows 上面要安裝 Git 很簡單，只要去官網上面下載即可

[git下載](https://git-scm.com/)

右邊 Downloads 點下去，一直下一步就好了

安裝完以後可以在 git-bash 試著輸入：git --version 並且按 enter，看有沒有印出什麼訊息就知道是否成功了！
### 如何安裝 Git - Mac
在 Mac 底下的話請你打開 Terminal（右上角搜尋的按鈕按下去，輸入 terminal 就找得到了），並且輸入 git --version，按下 enter。

如果你的 MacOS 版本是 10.9 以上，就會自動跳出視窗指引你去安裝，或是你也可以參考 Git 官網的教學，直接下載安裝檔。
___
## 看穿 Git 的把戲
### 其實都一樣啦：從資料夾到 Git
這一個單元是讓你輕鬆理解 Git 的最好機會，你千萬不要把 Git 想成是什麼超級困難的軟體，絕對不是，它其實是很直覺的，你會覺得困難是因為你對那些指令不熟悉，以及你以為 Git 帶來一些新的概念。

不是的，其實那些概念你早就知道了，只是你沒有注意過而已。

這一個單元會從「自己來做版本控制」開始，一步步推導出一個版本控制應該要有哪些功能，只要你能理解我們這個單元在做的事情，你之後一定能搞懂 Git！

==先自己思考，怎麼做版本控制==

總結:
1. 需要新版本 : 開一個資料夾
2. 不想加入版本控制 : 不要加入資料夾
3. 避免版本號衝突 : 用看似亂碼的東西當作資料夾名稱
4. 知道最新版本 : 用一個檔案來存

==其實Git就是做這些事==
___
### 一元復始：git init
講完了 Git 的運作模式以後，終於要進入到實際的操作了，這一個單元要介紹的是最簡單的指令：git init。

```
//git 初始化
git init
```
___
### 你還好嗎：git status
```
//版本控制的狀態
git status
```
___
### 選我選我選我：git add
* untracked : 不加入
* staged : 加入版本控管
```
//決定是否加入版本控制
git add <file>

//回到上一個狀態
git rm --cached <file>

//全部加入檔案版本控制
git add .
```
___
### 把你寫進我的故事裡：git commit
```
//新建一個版本，會進入vim視窗，編輯敘述
git commit

//新建一個版本，並加入敘述
git commit -m"敘述"

//加入版本控制跟新建一個版本
git commit -am"敘述"
```
___
### 歷史紀錄一目了然：git log
```
//看commitID跟歷史紀錄...
git log

//簡短的歷史紀錄
git log --oneline
```
___
### 想回到過去：git checkout
```
//回到某一個版本
git checkout <版本號>

//回到 master 這個 branch 的最新版本
git checkout master
```
___
### 不重要的邊緣人：.gitignore
* .gitignore裡加的檔案名稱後，要Enter多留一行空行，用git status看時才會被忽略掉
```
//要忽略的檔案
.gitignore
```
___
### Git 基本指令複習
```
//第零步
git init

//第一步-建立.gitignore忽略不要的檔案
touch .gitignore

//第二步-將所有檔案加入版本管理
git add .

//第三步-建立第一個commit
git commit -am"init"
```
```
//專案建立後:
//假設1:有新檔案
//記得將檔案加入版本管理
git add .

//想要一個新版本
git commit -am"msg"
```
```
//模擬git
1.加入版本控制(git add) => 把東西放入temp資料夾

2.新建版本(git commit) => 把temp資料夾複製改名為版本名稱

3.切換版本(git checkout) => 去到某一個資料夾底下
```
___
## Git 的平行時空：branch
### 為什麼我們需要 branch?
git 重要的2個觀念
* commit
* branch

**為甚麼需要branch**(分支) : 是為了將修改記錄的整體流程分開儲存，讓分開的分支不受其他分支的影響，所以在同一個數據庫裡可以同時進行多個不同的修改。

分開的分支還是可以和其他分支合併的。

>[分支 (branch)](https://backlog.com/git-tutorial/tw/stepup/stepup1_1.html)
___
### 一眼看穿 branch
**來思考該怎麼實作branch**

假設 : 用資料夾去模擬，有兩條branch，main跟new-feature，開發後，commit進度都不同，思考如何開發與merge等等問題。
___
### 給我一個新的宇宙：git branch
```
//建立分支
git branch <branch-name>

//查看有甚麼分支
git branch -v

//刪除分支
git branch -d <branch-name>
```
___
### 跨越宇宙：git checkout
```
//切換分支
git checkout <branch>
```
___
### 當兩個宇宙合併：git merge
```
//合併分支
git merge <branch>
```
___
### 當世界崩塌：conflict
當merge後，遇到conflict(衝突)要怎辦，到需要修改的檔案，修改程式，為合併後，須保存的程式。
1. 保留要保存的程式
2. `git commit -am"msg"`
3. 如本地跟遠端conflict，在將本地跟遠端同步`git push origin main`
___
## GitHub：全球最大工程師交友平台
### 我跟 Git 到底什麼關係？
Git : 版本控制的程式
GitHub : 放 Git repository 的地方(其實還有很多功能)
___
### GitHub 導覽：視覺化的 repository
branch : 有機個branch
commits : 有機個commit
commitsID : 可以看這commit改了甚麼
點個別檔案 : 可以看檔案內容，點blame，分別哪一行是誰修改的，可以知道是誰修改的
new pull request : 可以在GitHub做merge，給檔案建議，審核
lssues : 問題討論區
contributor : 看有誰跟你協作專案
files changed : 可以看檔案改了甚麼，可以幫助審核程式
___
### 如何把 code 放上 GitHub
到[GitHub](https://github.com/)，new repository，git101_test，做練習，將本地端的檔案，放到GitHub的repository。
```
git remote add origin https://github.com/tonytoolsn/git101_test.git

git branch -M main

git push -u origin main
```
[GitHub以Main取代Master作為新Git儲存庫預設名稱](https://www.ithome.com.tw/news/140094)
___
### 我就是潮流：git push
```
//將本地最新改變放到GitHub
git push origin main

//如將新分支，放置GitHub
git push origin <branch>
```
___
### 跟隨潮流：git pull
```
//將GitHub最新改變抓下來
git pull origin <branch>
```
___
### 抓到你了：git clone
* Fork : 能將他人公開專案，複製到自己的github下
```
//到github的專案下，複製https或ssh
git clone <https://...>
```
___
### GitHub 整合實戰
```
//第一步-github開新的repository

//第二步-將資料push上，github

//第三步-如github上有新資料，就pull

//第四步-如將本地分支程式push上github，可以使用github的pull request，進行git merge
```
___
### 免費的網頁空間：GitHub Pages
1. GitHub任一repository，點setting
2. 到GitHub Pages，假設放在master branch上，save
3. GitHub會給一個網址，點入網址，並在網址後輸入檔案名稱，能看到網頁
___
### 工程師之間的協作：GitHub Flow
GitHub Flow : GitHub建議的開發流程
1. 開新branch : `git branch <branch>`
2. 切到新branch : `git checkout <branch>`
3. 將檔案做改動後 : `git commit -am"msg"`
4. push上GitHub : `git push origin <branch>`
5. GitHub上 : 點caeate pull request操作，可以指定誰review你的程式碼
6. GitHub上 : 點files change，可以看程式改動，或加入留言
7. GitHub上 : 確定程式修改完後，可以點review change，的Approve
8. GitHub上 : 點merge pull request，並點delete branch，刪除分支
9. 本地端回到master : `git checkout master`
10. 同步下來 : `git pull origin master`
11. 刪除本地端的branch : `git branch -d <branch>`

>[GitHub Flow](https://guides.github.com/introduction/flow/)
>[讓我們來了解 GitHub Flow 吧！](https://medium.com/@trylovetom/%E8%AE%93%E6%88%91%E5%80%91%E4%BE%86%E4%BA%86%E8%A7%A3-github-flow-%E5%90%A7-4144caf1f1bf)
>[三種版控流程](https://medium.com/@lf2lf2111/%E4%B8%89%E7%A8%AE%E7%89%88%E6%8E%A7%E6%B5%81%E7%A8%8B-29c82f5d4469)
___
### GitHub 的死對頭們：GitLab 與 Bitbucket
>[GitLab](https://gitlab.com/gitlab-org/gitlab)
>[GitLab維基百科](https://zh.wikipedia.org/wiki/GitLab)
>[Bitbucket](https://bitbucket.org/)
>[Bitbucket維基百科](https://zh.wikipedia.org/wiki/Bitbucket)
___
## Git 狀況劇
### 我 commit 了但是想改 commit message
```
//改 commit message
git commit --amend 
```
___
### 我 commit 了可是我又不想 commit 了
```
//不會保留改動後的狀態，回到 commit 前一步。
git reset HEAD^ --hard 

//會保留改動後的狀態，回到 commit 前一步。
git reset HEAD^ --soft 

//會保留改動後的狀態，回到 commit 前一步，
git reset HEAD^ --mixed 

但是檔案是 Untracked 或 Modified，mixed預設可省略。
```
[Git reset 的三種模式( soft mixed hard )比較](https://ithelp.ithome.com.tw/articles/10187303)
___
### 我還沒 commit，但我改的東西我不想要了
```
//回到上一個commit的狀態 
git checkout --<file>

//或
git restore <file>
```
___
### 我想改 branch 的名字
```
//改branch的名稱
git branch -m <branch>
```
___
### 想摘下遠端的 branch 給你
```
//遠端的branch存到本地端
git checkout <遠端的branch>
```
___
## 客製化各個階段：Git hook
### hook 是什麼？
在程式裡的意思指，發生某事的時候通知我

例如:
1. 有人commit，通知我
2. 有人push，通知我，等等

___
### Git hook 簡介加簡單示範
常用在檢查commit前或push前，有甚麼資訊不能保存等等
```
cd .git/

cd hooks/

//去設計些hook，使用

例如:
//新增pre-commit檔案

//輸入
echo "輸入錯誤..."    //輸出訊息

#if(){}...           //條件判斷

exit 0               //通過，1為不通過
```
___
## 使用者設定

要開始使用 Git，首先要做的第一件事（應該也只要做一次就好），就是設定使用者的 Email 信箱以及使用者名稱。請打開你的終端機視窗，輸入下面這兩行指令：
```
$ git config --global user.name "Eddie Kao"
$ git config --global user.email "eddie@5xruby.tw"
```
輸入完成之後，可以再檢視一下目前的設定：
```
$ git config --list
user.name=Eddie Kao
user.email=eddie@5xruby.tw
```
[使用者設定 - git](https://gitbook.tw/chapters/config/user-config)
___
## 總結
了解commit跟branch的觀念，如何解決conflict，git與github是甚麼，如何push跟pull，開發時需要注意甚麼跟流程等等，還有許多git指令須學習，但等有需要再查詢即可。
>[為你自己學 Git](https://gitbook.tw/)
>[Git教學](https://backlog.com/git-tutorial/tw/contents/)
[為你自己學 Git](https://gitbook.tw/)
___
## 如何上傳到，github。
1.new repository
![](https://i.imgur.com/z8i2pmA.png)
2.填 Repository name，按 Create repository。
![](https://i.imgur.com/WxuttGS.png)
3.先依照用第一個流程走。
![](https://i.imgur.com/BWNxf1I.png)
4.先 cmd 到 (Desktop/)桌面
```
pwd

cd Desktop/
```
![](https://i.imgur.com/IwEs44c.png)

![](https://i.imgur.com/J8KhUmo.png)

![](https://i.imgur.com/mSvybRG.png)

5.新增 20220113/ 資料夾
```
mldir 20220113

cd 20220113/
```
![](https://i.imgur.com/ldNHA9j.png)

6.下 github 指令。
`3. 這地方`如果你的也是 master。
把 main 要改成 master。

```
echo "# 20220103" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M master
git remote add origin https://github.com/tonytoolsn/20220103.git
git push -u origin master
```
![](https://i.imgur.com/Urkp25z.png)
沒登入過的要登入。
![](https://i.imgur.com/Z6gB33R.png)
