---
# System prepended metadata

title: '[GIT101] Git 超新手入門'

---

# [GIT101] Git 超新手入門

[git doc](https://git-scm.com/docs)

> 共 107 min

> 這行程式碼是甚麼時候被加進去的？某個時間點我加了甚麼程式碼？

> 去哪裡看修改紀錄？ => history 或 blame

blame 跟history差不多，只是 blame 用時間序來排列

commit:向下增加版本

branch:平行一條版本分支然後再往下增加版本(注意從哪一個分支(A)上面開新分支，新分支就會從它(A)開始延伸) ，要 merge 回來(把版本放進去 另一條 branch 裡面)

# 什麼是版本控制？

> 報告用的 PPT 到底甚麼時候會是最終版?

檔案的更改變動是一個連續的過程，**每次更改檔案並產生一個新的檔案版本** => 這個過程不斷 loop 之後會累積非常多版本，造成不好管理之類的問題，所以需要透過版本控制來解決這個困擾。

* 用 hash+資料夾來區分不同版本
* 用一個檔案來存放 hash 
* 用一個檔案來存放最新版本
* 不想加入版本裡面就不要放到資料夾
    > 那為什麼要寫...? 例如放有帳密的檔案

# 常用指令
* `git init`
    初始化版本控制
* `git status`
* `git .gitignore`
    .gitignore 用來放不要加入版本控制的檔案名稱
* `git add file`, `git add .`
    加入 status stage = 加入tempory資料夾
* `git commit -am "say something"`, `git commit -m "say something"`
    加入版本控制 = 正式創造版本控制用的資料夾
    > 新檔案要先add才可以commit
    
    > `git commit -am` 對新檔案沒效
    
* `git checkout hash`
    切換版本 = 去到某個資料夾
* `git log`
    開始看 commit 紀錄
* `git commit --amend`
    我 commit 了但是想改 commit message 的解法
* `git reset HEAD^ --hard`, `git reset HEAD^ --soft`
    我 commit 了可是我又不想 commit 了的解法， hard 會把 commit 連同檔案都刪掉， soft 則會留著檔案但 commit 刪掉
* 取消已經暫存add的文件。即，撤銷先前”git add”的操作
`git reset HEAD <file>`


# 為什麼需要 branch?

在同一個源頭，平行（兩條branch互不干擾）開發然後再合併。

> 新增一個和 main 資料夾一模一樣的檔案來當作 branch
![假設藍色的 commit 之間都沒有變化](https://i.imgur.com/ulonSdT.png)

## 新增移除合併 branch

* `git branch newBranchName`
    新增 branch = 新增平行資料夾

* `git branch -d new-branchName`
    刪除 branch
* `git checkout branchName`
  * 切換到別的資料夾
  * 或者是摘下遠端的 branch
      * (`git pull origin main` 是把 main 版本從 origin 這個 respository 拉到本地端)
* `git branch -v`
    *看看現有的branch
* `git branch -m newBranchName`
    修改 branch 名稱，阿要記得先移動到該 branch 再做

    想摘下遠端的 branch 給你
* `git merge branchName` 把某一個 branchName 合併進來**當下**你在的 branch 裡面
* `git pull origin branchName` 把某一個 branch 拉下來本地端
    
## 發生衝突怎辦
conflit 衝突，兩個 branch 的相同版本的相同位置同時被修改， merge 的時候會通知，自己要手動修改

## 忽略檔案`.gitignore`

把想要忽略的檔案放到這邊

## Git hook
發生某事的時候通知我，去 .git 可以設定，不過他是用 bash 寫的，使用前要先了解一下

# Github

**使用的重點就是遠端和本地需要記得同步**

> Git : 版本控制程式 / Github : 圖形化的 git

> contributor 協作者

## 如何把 code 放上 GitHub

從 github 新增一個 respository ，然後用 git push 上去，要拿下來就是 `git pull`，從哪個 respository 拿下來就會放回哪個 respository。



```
git remote add origin https://github.com/chachachater/test.git

git push -u origin main
```

* origin 指的是
`https://github.com/chachachater/test.git`
* main 是 respository 的其中一個 branch
* GitHub 的 fork 指的是把別人的respository複製一份作為自己的respository (需要在 github上操作)，這樣就可以 clone 一份 respository 回來本地端，再從本地端 push 回去
    > 需要注意的是clone的來源，如果是從別人的respository複製回來的話，因為不是所有人都有權限來 pull request，所以fork的檔案是不一定可以 push 回去(原本的) respositary
    > 但如果先 fork 一份 respository 到自己的 Github，那麼就會有有權限來 pull request
* 兩個做了 `git init`的 directory，可不可以 push 到對方的 respository?  可以，但沒辦法 PR 成功。

## 補充資訊

* 免費的網頁空間：GitHub Pages

    可以用來展現自己的網頁作品，需要再回來看
* GitHub flow 有說明完整的fork-pull流程
`https://guides.github.com/introduction/flow/`
*   GitHub 的死對頭們：GitLab 與 Bitbucket
    GitHub 就是個放 repository 的平台，其他人也可以做