---
# System prepended metadata

title: git學習筆記 (ref 為你自己學git)
tags: [learning]

---

# git學習筆記 (ref 為你自己學git)

###### tags: `learning`

## Configuration
1. 設定使用者
    ```
    git config --global user.name "<usr_name>"
    git config --global user.email "<email>"
    
    git config --list
    ```
    - 特定專案設定特定使用者
    ```
    //該專案的路徑下
    git config --local user.name "<usr_name>"
    git config --local user.email "<email>"
    ```

2. 設定alias
    ```
    git config --global alias.<縮寫指令> "<原本指令>"
    ```
    或是直接到`/.gitconfig`中修改
    - EX1
    ```
    git config --global alias.l "log --oneline --graph"
    //之後只要輸入`git l`就可以看到精美ㄉlog圖 <3
    ```
    - EX2
    ```
     git config --global alias.ls 'log --graph --pretty=format:"%h <%an> %ar %s"'
    // output: <hash> <<name>> <time> <msg>
    ```
    
## 開始使用git
1. 初始化目錄 : 在想要進行版本控制的目錄下執行`git init`
    - 初始化之後該目錄底下會出現`.git`
    - 之後若要刪除版本控制,刪除`.git`即可
2. 查詢目錄的狀態
    `git status` 
    - Ex1
    ![](https://i.imgur.com/uar5N3h.png)
    - Ex2
    ![](https://i.imgur.com/WR1kn84.png)
3. git指令
![](https://i.imgur.com/sL6gXaz.png)

    - 把welcome.html加入版本控制
        1. 剛創檔的status
        ![](https://i.imgur.com/PSUSPER.png)
        2. `git add <file_name>` (可用`*`表示全部, ex `git add *.html`)
            確認修改此檔案,交給git處理,把檔案加到暫存區(commit之前一定要add)
            - 此時的status
            ![](https://i.imgur.com/F0EjNJz.png)
            
                :::info
                Note: `git add .` = `git add --all`
                把該目錄&子目錄下的所有檔案都加到暫存區
                :::

        3. `git commit` : 把暫存區的東西加入Repository
            - `git commit -m "<msg>"`
            - `git commit`會無視沒有`git add`的檔案
            - "**這次修改做了什麼**"
                
                :::info
                Note: 使用`git commit -a -m "<msg>"` 可以不用`git add`
                但只適用於修改檔案,如果是**新增的檔案**還是需要`git add`
                :::
            - 修改commit msg (也視為一次新的commit)
                - 修改最新Commit的msg : `--amend`
                `git commit --amend -m "<new_msg>"`
                - 修改舊commit的msg
            - 追加檔案到最新一次的commit(不想再發一次commit)
                `git commit --amend --no-edit`
                > `--amend` 表修改
                > `--no-edit` 表不要跳出修改msg的視窗
            - 取消commit
                `git reset`
                1. `git reset <old_commit_hash>` : 回復到該commit
                2. `git reset <old_commit_hash>^` : 回復成該commit的前一次commit
                3. `git reset master^^` : master指向最新一次commit,回復成最新commit的前兩次commit
                4. `git reset HEAD~5` : HEAD也指向最新一次commit,回復成前五次的commit 
                :::info
                reset有三種模式
                1. `--mixed` : 預設為此模式, 把拆出來的檔案從暫存區丟掉,但還是在工作目錄,如果需要再commit就需要`add`回去
                2. `--soft` : 移動HEAD,即把拆出來的檔案丟到暫存區,直接commit即可            
                3. `--hard` : 直接把拆出來的東西丟掉,不會存在工作目錄中
                :::
                5. 如果不小心reset成舊commit,一樣可以再reset成最新的commit
                    `git reset <restore_commit> --hard`
                    > `--hard`代表強迫放棄之前reset的內容
4. 查看log
    - `git log`
        - SHA-1 Hash: commit的身分證字號,不會重複
        - who: 誰commit
        - when: 啥時commit
        - what: commit msg
            
            :::info
            some attribute
            1. `--oneline : hash + msg`
            2. `--author='<usr_name>'` or `--author='<usr1>\|<usr2>/usr2.>.'`
            3. `--grep='<str_in_msg>'` : 搜尋msg中的特定字串 
            4. `-S "<str_in_file>"` : 搜尋commit檔案中特定字串
            5. `--since "<ex_9am>" --until "<ex_12am>" --after "<ex_2017-01>"` : 列出2017-01之後每天9am-12am的commit
            :::
   
5. 刪除檔案 : 類似修改檔案(**只要有修改,之後一定要commit**)
    - 法I: 直接刪之後,`git add`
    - 法II: `git rm <file_name>`
        :::info
        Note: 只是想刪除該檔案的git控制,而不是真的想刪檔,用`git rm --cached`
        :::
6. 改檔名
    - `git mv <old_name> <new_name>`

7. 