---
# System prepended metadata

title: Git
tags: [Video Course, Basic Tools]

---

# Git
:::info
日期 : 2024/03/31
課程影片 : [Git 跟Github 實用攻略](https://www.youtube.com/watch?v=Luu7V9Nx1EM)
:::

Git
---
* 程式碼總結


第一次上傳文件的所有程式碼：
```
git init
git config --global user.email "email"
git config --global user.name "user name"
git add . // 添加資料夾下面的所有文件
git commit -m "first commit" // ""是提交說明
git remote add origin https://github.com/repository網址
git push -u origin master // 上傳到github倉庫(-u代表現在為空)
```
上傳時倉庫非空時，最後一句改為：
```
git push origin master
```

-----


Git語法
---
* 程式碼總結

```python
git init：建立 .git 資料夾進行追蹤（.git資料夾是隱藏起來的）。

git status：git 狀態。

git add index.html：上傳單一檔案到 staging area.

git add . ：上傳全部檔案到 staging area。

git add -u：只上傳修改過的檔案到 staging area.

git commit -m "填寫此版本資訊"：commit 到 Local Repository。

git log：commit 的歷史。

git stash : 獲取目前工作目錄的 dirty state，並保存到一個未完成變更的 stack，以方便隨時回復至當初的 state。

git reflog：commit 的歷史（包含被 reset 過的檔案）。

git reset HEAD^：還原 commit 並將檔案退回到工作目錄，一個^代表退回一個，也可用數字 HEAD^2。

git reset HEAD^ --hard：還原 commit 並刪除檔案。

git reset < commit 編號 > ：可以還原已被刪除的 commit。

git revert : 去除錯誤更新

git rebase -i HEAD~融合數字 : 融合多個log紀錄(只需選一個)

git branch：查看分支。

git branch name：新增分支。

git branch - < old name >< new name >：更改分支名字。

git branch -D [BRANCH_NAME] : 強制刪除指定分支（須先切換至其他分支再做刪除）。

git checkout：移動分支。

git merge：合併分支，有兩種情況。

git reset --hard [HASH] : 強制恢復到指定的 commit（透過 Hash 值）。

git checkout [HASH] : 切換到指定的 commit（與 git checkout [BRANCH_NAME] 相同)。
```

```python
專案遠端指令
git remote：查看遠端數據庫列表。

git remote -v：查看遠端數據庫列表（含 url）。

git remote add <遠端數據庫名稱><遠端數據庫url> ：建立遠端數據庫。

git push : 將本地端 Repository 的 commit 發佈到遠端。

git push origin <數據庫名稱，預設為 origin>：上傳到遠端數據庫。

git push -u origin branch : 上傳新的分支到github上

git pull <數據庫名稱>＜分支名稱＞ ：下載同步更新本地數據庫。

git pull origin main : 把主線分支的存檔抓到支線上

git clone "url"：下載遠端數據庫。
```

-------



```python
git status : 顯示工作目錄狀態，整體版控情況，會顯示已經改過的檔案為紅色

git show (change things) :  查看被改的地方，刪除為紅，新增為綠

git log : 整個文件被編輯的歷程

git commit --amend (do not go code review everytime) : 可以改commit內容或是code，換code內容的話，需要先add，再用amend

git commit --amend --no-edit : amends a commit without changing its commit message

git commit -m "test" : 註解


git add 

git checkout branch名 : 移到該線上

git merge branch名 : 在主線上，把支線合併

git merge main : 在支線上，把主線合併


git rebase -i origin/mianline的log id : 

git rebase -i HEAD~融合commit總量 : 把多個commit合成一個，融合多個log紀錄(只需選一個)

git fetch : 把遠端最新內容拉到local

git pull  : 把遠端最新內容拉到local後直接合併

如果remote有A-B-C-DEV_COMIT
我現在有A-B-C-YU
先git fetch 再來 rebase -i origin/mianline
可以變成A-B-C-DEV_COMIT-YU

冒號+x+! : 儲存退出
冒號+q+! : 退出
```
![image](https://hackmd.io/_uploads/rJIDocLQC.png)


-------

.gitignore 可以加上不想要被 commit 的檔案
*.gitignore 需要加到 repo


-------

cherry-pick
---
只挑自己想要的commit合併到master

* master
第一個commit: 新增 test.py
接著第二個commit: 在 test.py 新增兩個 func1, func2

* 切分支作
現在因為要新增一些功能，所以我切出一條 dev 的分支，在上面開始做一些開發的動作：
    1. 新增 func3
    2. 新增 func4
    3. 新增 readme.md 文件，並加註說明
    4. 新增 hot_fix function

* 情境
需要加readme但不想要把整個dev都合併到master裏頭

```
$ git checkout master // 轉到
$ git cherry-pick 49a43bf // 要拼接的commit hash(按照先後順序)
```


-------






參考資料
https://blog.csdn.net/weixin_43629813/article/details/113824388
https://medium.com/%E7%A8%8B%E5%BC%8F%E4%B9%BE%E8%B2%A8/git-cherry-pick-%E4%BD%BF%E7%94%A8%E5%A0%B4%E6%99%AF-59ac61723bfe
https://jim1105.coderbridge.io/2022/08/21/git-commands/





