# Git tutorial


## Tools
* Git https://git-scm.com/
* SourceTree https://www.sourcetreeapp.com/
* TortoiseGit https://tortoisegit.org/
## Web
* Github
* Bitbuket (Dell Ags)
## git vs svn (分散式、集中式)
- 本端的工作目錄會有完整的儲存庫
- 可以在本端離線狀態下建立版本與歷史紀錄
* 支援非線性開發模式(分散式開發)
* 提交(commit)版本速度非常快,也不用網路連線。
## branch
> 通常會從master建一個branch出來,例如AAA
* create a branch
* switch to branch
## git commit flow
* Add in Staging -> commit(local)->push(remote)
* 只有push才會真的傳到server上,commit只會到local端。
### local commit之後
```
若是上一次commit的是verion A。
但是發覺上一次的verison A有漏東西要再補
可以使用Amend Last Commit
```

### local端commit之後,如何回復?
```reset "master" to this```

## Push
* **不要**直接push到master
* 通常是建另外的branch,再讓reviewer去合併你傳上去的code到master。
## push branch to remote master
1. Create a pull request
2. Reviewer use merge or cherry-pick or rebase
## git submodule
```
各個專案共用的部份會採用submodule的分式做區分。
想想若是共用的部份都用複製貼上的話,之後一定會有不同步的情況發生。
```
## Setup ssh connection
`` genrate ssh key
- tortoisegit - PuttyGen
```
tortoisegit的ssh key只吃ppk
```
- sourcetree - ssh-keygen
---
## git commands
| 描述 | 命令 |
| ------------ | ----------------------------------------- |
| 切換分支 | git checkout XXX |
| 建立分支 | Git branch XXX |
| 建立切換 | Git checkout -b XXX |
| 刪除分支 | Git branch -D XXX |
| 查詢分支 | Git branch -a |
| 比較分支 | Git diff XXX |
| 合併commit | Git rebase -I HEAD~N |
| Rebase onto | Git rebase --onto XXX |
| Init Git SVN | Git svn init -s SVN_URL DIR |
| Fetch svn | Git svn fetch |
| Clone | Git svn clone -r rev_num:HEAD svn_url dir |
| 密碼更換 | Command line下git svn fetch |
## reference
* [猴子Git入門](https://backlog.com/git-tutorial/tw/)
* [Git教學](https://kingofamani.gitbooks.io/git-teach/content/)
* [Git learning](https://learngitbranching.js.org/?locale=zh_TW)