---
# System prepended metadata

title: GitHub 學習筆記 (三) 基本操作
tags: [github]

---

<div style="text-align:right;"><h6>2023/3/20</h1></div>

# <center>GitHub 學習筆記 (三) 基本操作 </center>
## <center> (三) 實用的基本操作 </center>
### <center> Git - some useful tool </center>


---
# **++前情提要++**

>這篇主要是記錄一些自己之後可能經常會用到的 git 操作，避免自己金魚腦一下就忘記了。

## **++(一) 在 repo 中增刪檔案/資料夾++**

>小提醒：這裡記得都要到**要操作的資料夾路徑**進行噢！

### **++刪除檔案/資料夾++**
這裡分成兩種情況，一種是**刪除local (自己電腦)和 Git上的檔案**，另一種則是**單純移除 GitHub上的檔案**並保留 local 的檔案：

```
// Remove directory from Git and local 
git rm -r 'myFolder/myFile' // This deletes from filesystem
git commit . -m "Remove directory(file)"
git push origin <your-git-branch>
```

```
// Remove directory from Git but NOT local
git rm -r --cached 'myFolder/myFile'
git commit -m "Removed folder/file from repository"
git push origin <your-git-branch>
```

## **++(二) commit 版本切換/ reset++**
> 會需要用到這個是因為有時候 remote 端的版本和 local 端的版本沒有更新到一致，導致在 push 或 pull 的時候出現問題。這時候可以先 reset 到舊版本，重新 pull 完，讓 local 端更新到最新狀態後，再 push 一次。內容主要參考以下網址：
> * [【狀況題】剛才的 Commit 後悔了，想要拆掉重做…](https://gitbook.tw/chapters/using-git/reset-commit)
> * [【狀況題】不小心使用 hard 模式 Reset 了某個 Commit，救得回來嗎？](https://gitbook.tw/chapters/using-git/restore-hard-reset-commit)

1. 更改 commit 版本
    
    首先要先確認有哪些版本紀錄：
    ```
    $ git log -2                      # previos 2 version
    $ git log --oneline               # all commit history
    e12d8ef (HEAD -> master) add database.yml in config folder
    85e7e30 add hello
    657fce7 add container
    abb4f43 update index page
    cef6e40 create index page
    cc797cd init commit
    ```
    接下來可以選擇要退回到哪個版本，相對或絕對的方式都可以。
    ```
    git reset HEAD~2                 # back to previous 2 version
    git reset 657fce7                # back to 657fce7 version
    ```
    如果想要退回剛剛 Reset 的步驟，只要 Reset 回到一開始那個 Commit 的 SHA-1 e12d8ef 就行了：
    ```
    git reset e12d8ef --hard
    ```
    剛剛看起來拆掉的 Commit 就又接回來了。在這裡使用 - - hard 參數可以強迫放棄 Reset 之後修改的檔案。
    ### 使用 Reflog
    如果一開始沒有記下來 Commit 的 SHA-1 值也沒關係，Git 裡有個 reflog 指令有保留一些紀錄。借用上面的例子，但這次改用 --hard 模式來進行 reset：
    ```
    $ git reset HEAD~2 --hard
    HEAD is now at 657fce7 add container
    ```
    不僅 Commit 看起來不見了，檔案也消失了。接著可使用 reflog 指令來看一下紀錄：
    ```
    $ git reflog
    657fce7 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~2
    e12d8ef (origin/master, origin/HEAD, cat) HEAD@{1}: checkout: moving from cat to master
    e12d8ef (origin/master, origin/HEAD, cat) HEAD@{2}: checkout: moving from master to cat    
    ```
    如果想要取消這次的 Reset，就是「Reset 到它 Reset 前的那個 Commit」（很像饒口令）。在這個例子就是 e12d8ef，所以只要這樣
    ```
    $ git reset e12d8ef --hard
    ```
    
    
2. Reset 的模式
    > git reset 指令可以搭配參數使用，常見到的三種參數，分別是 --mixed (default)、 --soft 以及 --hard，不同的參數執行之後會有不一樣的結果。

    <center>

    | 模式      | mixed 模式 | soft 模式 | hard 模式 |
    |-----------|------------|------------|------------|
    | 工作目錄 | 不變       | 不變       | 丟掉       |
    | 暫存區   | 丟掉       | 不變       | 丟掉       |

    </center>

    Reset 這個英文單字的翻譯是「重新設定」，但事實上 Git 的 Reset 指令用中文來說比較像是「前往」或「變成」，也就是「go to」或「become」的概念。實際上 git reset 指令也並不是真的刪除或是重新設定 Commit，只是「前往」到指定的 Commit，那些看起來好像不見的東西只是++暫時看不到，但**隨時都可以再撿回來**++。

## **++(三) 實用小工具++**

1. 檢查自己在哪一個remote (換來換去很容易頭昏眼花啊...)
```
git remote -v

(如果你發現你連到錯的remote...)
git remote set-url origin https://github.com/USERNAME/OTHERREPOSITORY.git 
```
2. 檢查過去的commit紀錄
```
git log
```
```
git log --oneline
```
3. 檢查目前所在的branch
```
git branch
```
### **++後記++**
>開始認真用之後發現有好多種指令要記得，剛開始不熟悉要一直翻來翻去太麻煩了，所以開了一個筆記紀錄，希望之後操作可以越來越順暢！

#### 參考網址 
1. https://docs.github.com/en
2. https://stackoverflow.com/questions/6313126/how-do-i-remove-a-directory-from-a-git-repository
3. https://git-scm.com/book/zh-tw/v2


<hr>

<div style="text-align:right;"><h6>撰於 2023/3/30</h1></div>