# [Git] Branch分支 ###### tags: `Git` ### 1. 加入Poem1.txt ``` git init git add . git commit -m 'Add poem1.txt' ``` ### 2.建立分支 ``` git branch lee-by ``` * 從特定分支(lee-by),建立新的分支(lee-by2) ``` git branch lee-by2 lee-by ``` ![](https://i.imgur.com/dcxYQs2.png) * 建立檔案2 Poem2.txt並commit ``` git add . git commit -m 'Add poem2.txt' ``` ### 3. 切換分支 * 切換後並建立檔案3 Poem3.txt並commit ``` git checkout lee-by git add . git commit -m 'Add poem3.txt' ``` #### 此時master分支只有Poem1&2.txt #### lee-by分支只有Poem1&3.txt ### 4. 利用gitk顯示分支 ``` git --all ``` ![](https://i.imgur.com/veBQsux.png) ``` git log --grahp --oneline --all --decorate ``` ![](https://i.imgur.com/t3JmpWM.png) ### 5. 合併分支 1. 切到A分支 2. B合併到A 3. 刪除B分支 ``` git checkout A git merge B git branch -d B ``` # [Cherry-Pick] 處理指定的commit節點版本 ``` git cherry-pick commit 節點辨識碼或標籤 ``` * 預設建立新節點,加入-n則不建立 * 修改檔案必須先存入Git檔案庫 * 衝突發生時 * 放棄執行,回到原本狀態 ``` git cherry-pick --abort ``` * 衝突處理好 ``` git add . git cherry-pick --continue ``` # 主分支的修改,合併到開發中的分支 ### rebase指令的使用 * 代替merge指令 * 避免分支與主分支互相交織的網狀型態,最後再合併到主分支 ![](https://i.imgur.com/kQP55EJ.png) ``` git checkout 分支名稱 git rebase master ``` * 放棄本次rebase回到上一步 ``` git rebase --abort ``` * 解決衝突後 ``` git add . git rebase --continue ``` # HEAD是甚麼? * 代表當前分支的最新提交名稱 * 建立新的數據庫時,Git會預設HEAD指向master分支 ![](https://i.imgur.com/mymfGoC.png) ([圖片參考網址](https://backlog.com/git-tutorial/tw/stepup/stepup1_3.html)) * 用~(Tilde)和^(caret),指向某個提交的相對位置 * ~(Tilde)可以指向第幾代的父代 * ^(caret) 可以指向幾世代以前的父代 ### reflog查詢舊HEAD資料 * 查詢HEAD 或 * 查詢任何分支變動的紀錄 ``` git reflog HEAD 或任何分支名稱 ``` ![](https://i.imgur.com/vWeO0Bd.png) ![](https://i.imgur.com/YFeDznU.png) * {0}表示目前最新的commit節點 * 時間越早的顯示越下面