###### tags: `mynote` [TOC] ## git 區域劃分 ![](https://i.imgur.com/ktfwOdT.png) ## git 流程圖 ![](https://i.imgur.com/IjFWneA.png) ## <font color=red>遠端功能</font> - fork (Fork)則是把別人專案的遠端儲存庫內容複製一份到自己的遠端儲存庫,黃保翕生動的形容:「就像是在餐桌上用叉子把盤子上的一塊肉叉到自己的盤子上。」 - clone 將遠端資料庫複製到本地 ```shell= git clone url 克隆远程版本库 ``` - pull (Pull Request)是GitHub協作開發的重要功能。透過拉取要求,主動要求他人把自己的程式碼納入專案中。比方A開發者看到B開發者的專案,覺得也想參與開發,便執行Fork指令複製一份到自己的遠端儲存庫。而A開發者完成某個新功能後,向B開發者提出拉取要求,希望能把變更整併到B的專案中。透過拉取要求,開發者也能做到基本的權限控管,而不是無條件的讓別人的變更合併到自己的專案中。比方在收到拉取要求後,原專案發起者能在GitHub上比對兩個版本間差異,覺得變更有益於原專案後再合併到自己的專案。許多人使用拉取要求,在GitHub上面開始跟其他開發者展開專案的討論。 - fetch 執行 fetch,可以取得遠端數據庫的最新歷史記錄。取得的提交會導入在自動建立的分支中,並可以切換這個名為 FETCH_HEAD 的分支。 但是不影響到local的commit **VSCODE有auto git fetch不需要在做ferch** ```shell= $ git fetch <遠程主機名> <分支名> ``` ## <font color=red>分支功能</font> - ### 開分支並切過去 ```shell= git checkout -b dev ``` - ### 切換分支 ```shell= git checkout dev ``` - ### 刪除分支 ```shell= git checkout -D dev ``` ## <font color=red>查詢功能</font> - ### 查詢狀態 status ```shell= git status 查看当前工作区暂存区变动 // modified: 111.txt git status -s 查看当前工作区暂存区变动,概要信息 // M 111.txt git status --show-stash 查询工作区中是否有stash(暂存的文件) ``` git log ```shell= git log 查看提交历史 git log --oneline 以精简模式显示查看提交历史 git log -p <file> 查看指定文件的提交历史 git blame <file> 一列表方式查看指定文件的提交历史 ``` git diff ```shell= git diff 显示暂存区和工作区的差异 git diff filepath filepath路径文件中,工作区与暂存区的比较差异 git diff HEAD filepath 工作区与HEAD ( 当前工作分支)的比较差异 git diff branchName filepath 当前分支的文件与branchName分支的文件的比较差异 git diff commitId filepath 与某一次提交的比较差异 ` ## <font color=red>合併功能</font> :::danger merge前要把暫存區先commit或是清空工作區和暫存區 ::: ```shell= git merge issue1 ``` - **merge** - **fast-foward** 假設被merge的分支包含所有的主分支內容, 則叫做fast-forwar ![](https://i.imgur.com/coByTsS.png) - **normal merge** 假設被merge的分支不包含所有的主分支內容, 則會創建一個新的commit ![](https://i.imgur.com/S9oZ0XE.png) ```shell= git merge master 在当前分支上合并master分支过来 git merge --no-ff origin/dev 在当前分支上合并远程分支dev git merge --abort 终止本次merge,并回到merge前的状态 ``` - **squash** 直接建立一個新的commit可以用squash ![](https://i.imgur.com/SUnOjl3.png) - ### rebase `git A rebase B` 意思是將A分支接到B分支之後 ex: 將issue3合併到master, 如果直接使用merge的話 假設有conflict就會多產生一個commit ![](https://i.imgur.com/k1LHWwZ.png) 用rebase將issue3接到master之後(conflict還是要解決) 再做merge就不會多一個commit ![](https://i.imgur.com/GCRvCn4.png) ## <font color=red>撤銷回退</font> ![](https://i.imgur.com/ALcEF3z.png) - ### reset 恢復到任意一個commit | | mix | soft | hsar | | :----: | :-------------: | :-----------: | :-----: | | commit | move to unstage | move to stage | discard | | stage | move to unstage | remain | discard | - ### revert 再做一個新的 Commit,來取消你不要的 Commit ### **什麼時候使用 Revert 指令?** 如果是自己一個人做的專案,用 Revert 指令其實有點過於「禮貌」了,大部份都是直接使用 Reset 就好。但如果對於多人共同協作的專案,也許因為團隊開發的政策,你不一定有機會可以使用 Reset 指令,這時候就可以 Revert 指令來做出一個「取消」的 Commit,對其它人來說也不算是「修改歷史」,而是新增一個 Commit,只是剛好這個 Commit 是跟某個 Commit 反向的操作而已。 ![](https://i.imgur.com/0glxXu2.png) ### <font color=red>標籤</font> ==標籤是用於標記特定的點/提交的歷史,通常會用來標記發布版本的名稱/號碼(如:v1.0)。== - ### 輕量標籤 不可變更的暫時標籤 可以添加名稱 - ### 標示標籤 可以添加打標簽者的名稱、email及日期 可以添加名稱 可以添加註解 可以添加簽名 ### <font color=red>修改歷史</font> rebase -i :::info 如果出現fatal: It seems that there is already a rebase-merge directory,刪除.git內部哦rebase-merge資料夾 ![](https://i.imgur.com/DygSiXz.png) ::: ### <font color=red>其它功能</font> - stash 可以將stage和unstage都存起來 **使用時機:** 切換branch的時候 ```shell= git stash save #暫時儲存現狀的操作 git stash list #顯示暫存清單 git stash pop #還原(還原前要確定暫存區乾淨) git stash drop #刪除暫存的操作 ``` - git reflog 可以查詢git的歷史log ![](https://i.imgur.com/U9WSmdg.png) - gitignore ==如果檔案本來就沒有track== 直接對檔案ignore即可 ![](https://drive.google.com/u/2/uc?id=1UQW8BDNo9DrqEMwO7p5D_B9PyQZb5CXD&export=download) ==如果檔案已經track了== ```shell= git rm --cached .\filename ``` ## Application ### 1. 如何回到上一步? ```shell= git reset --hard HEAD^ ```