# Git / Github 常用進階指令
## `git pull` v.s. `git fetch`
### 本機上 git 的 branch 與 GitHub 上的 Remote Branch

<br >
#### `git pull` v.s. `git fetch`
> #### 都是把 code 從 GitHub 上拿下來的方式
> #### Retrieve changes from a remote repository
#### 情況舉例

### 比較

### `git fetch`
Fetching allows us to download changes from a remote repository, BUT those **changes will NOT be automatically integrated into our working files.**
:arrow_right: It lets you see what others have been working on, WITHOUT having to merge those changes into your local repo.
:thought_balloon: "please go and get the latest information from Github, but don't screw up my working directory."
#### 圖解

I now have those changes on my machine, but if I want to see them I have to checkout origin/master. My master branch is untouched!
#### syntax
<img src="https://i.imgur.com/uzKeMma.png" width="270px">
<img src="https://i.imgur.com/mMP1Hzw.png" width="330px">
<br >
### `git pull`

#### :thought_balloon: "go and download data from Github AND immediately update my local repo with those changes"
### 圖解

:exclamation: **pulls can result in merge conflicts!!**
<br >
## `git reset`
> #### Undo & Time-Traveling
### `git reset <commit-hash>`
#### 情境:git commit 以後,才發現想要那個 commit 在另一個 branch
<img src="https://i.imgur.com/PV71SNH.png">
:arrow_up: 已經 commit 了,卻發現不是要 commit 在這個 branch 上
<img src="https://i.imgur.com/Mp8LMDe.png">
:arrow_up: 用 **`git reset <commit-hash>`** 可以 undo 這個 commit 的紀錄,但到這個 commit 的時間點所做的內容仍然還在(然後就可以重新 commit 在另一個 branch )
### `git reset --hard <commit-hash>`

:arrow_up: 用 **`git reset --hard <commit-hash>`** ,會 undo 這個 commit,並且 time travle 到這個 commit 時間點之前的內容
<br >
### `git reset HEAD~<commitBackwardNum>`
#### 情境:想要回頭看前面的 commit 的狀態

:arrow_up: 用 **`git reset HEAD~<commitBackwardNum>`** ,可以讓我們 time travel 回到前 n 個 commit
<br >
## `git rebase`
(下次再補細節,先大致介紹)
> ### 1. As an alternative to merging
> ### 2. As a cleanup tool
### As an alternative to merging
#### issue with `git merge` during collaboration
<img src="https://i.imgur.com/UFa4yz2.png" width="400px">
:arrow_up: 同時有很多branch,想要 update 到最新的版本的話,我們的 commit 紀錄會有很多是 merge

<img src="https://i.imgur.com/QK0XSqS.png" width="300px">
<br >
### As a cleanup tool
> #### REWRITE, DELETE, RENAME, or even REORDER commits
#### Interactive Rebase
搭配使用:`pick`, `reword`, `edit`, `fixup`, `drop`

