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