---
# System prepended metadata

title: Git/Github 協作常用
tags: [Git/GitHub]

---

# Git/Github 協作常用

###### tags: `Git/GitHub`


## `git clone`, `git branch -r`, `git switch <remote-branch-name>`

:::spoiler 觀念與使用情境

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

### Remote Tracking Branch
> Remote Tracking Branch 會指向你**最後一次與 remote repo (GitHub repo)溝通的地方**
> 它就像是一個書籤

與 remote repo 溝通指的包括:
- clone, pull, fetch 下來
- push 上去

#### remote tracking branch syntax pattern: `<remote>/<branch>`

ex:
```bash
origin/main
upstream/feature
```

<br >

### Local Repo v.s. GitHub repo

<img src="https://i.imgur.com/ZILoKDI.png" width="350px">

:arrow_up: 本機端可以在自己的電腦上任意移動操作

<br >

<img src="https://i.imgur.com/2kK9aqs.png" width="700px">

:arrow_up: 
**Remote Tracking Branch** 則是一個對於某個 GitHub remote branch 上一次溝通的時候的狀態的 reference，我們無法在自己的電腦上直接操作他的位置

<br >

<img src="https://i.imgur.com/HtI9ieh.png" width="550px">

<img src="https://i.imgur.com/MrZYes2.png" width="550px">

:arrow_up: *因為 remote tracking branch 與 local branch 的機制，我們才會在 `git status`得到這樣的訊息*

<br >

### `git clone` 後的 Local Branch 與 Remote Branches
> 當我們 `git clone` 一個 GitHub repo，我們的本機就擁有了那個 GitHub Repo 在那個時刻所有的 data 和 Git history, 但是...


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

這個 GitHub Repo 有兩個 branch

不過，此時如果我們用 **`git branch`** 指令查看 local branch，會發現的我們 local repo 只有 GitHub repo 的 default branch

<img src="https://i.imgur.com/IShxO2s.png" width="250px">

:arrow_up: 我們 local 端只有 default branch 

<br >

### `git branch -r`
>  檢視所有 local 知道的 remote branch
>  
 <img src="https://i.imgur.com/mCBjBfD.png" width="250px">

:arrow_up: 當我們用 `git branch -r` 檢視，可以發現其實我們本機是知道所有的 remote branch 的

**事實上 `git clone` 所做的事**

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

### `git switch <remote-branch-name>`
> 1. 創建一個與 remote branch 同名的 local branch
> 2. 設定好這個同名的 branch 會去 track remote branch

example: 想要本機有 `origin/puppies` 這個 branch，並且 connect local 與 remote 的 puppie branch

<img src="https://i.imgur.com/h2sfGxi.png" width="400px">

<img src="https://i.imgur.com/sYiShxs.png" width="600px">

:::

***
### `git checkout <remote>/<branch>`
:::spoiler 用途
#### 情境：想要看我上次跟 remote repo（GitHub repo）溝通時候，這個專案 code 是怎麼樣

syntax example
```bash=
git checkout origin/main #回到上次跟 remote tracking branch 溝通的地方
git switch main # 再回來目前本機的 main branch 所在的地方與狀態
```

<img src="https://i.imgur.com/7zi9Yl8.png" width="500px">
:::

<br >

***

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

::: spoiler 解釋
#### 情況舉例
![](https://i.imgur.com/8HV9iKx.png)

### 比較

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

### `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."

#### 圖解
![](https://i.imgur.com/VfF6isO.png)

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`
![](https://i.imgur.com/5CczYmK.png)

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

### 圖解
![](https://i.imgur.com/kK4D7dW.png)

:exclamation: **pulls can result in merge conflicts!!**
:::
<br >