tags: mynote

git 區域劃分

git 流程圖

遠端功能

  • fork

    (Fork)則是把別人專案的遠端儲存庫內容複製一份到自己的遠端儲存庫,黃保翕生動的形容:「就像是在餐桌上用叉子把盤子上的一塊肉叉到自己的盤子上。」

  • clone
    將遠端資料庫複製到本地

    ​​​​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

    ​​​​$ git fetch <遠程主機名> <分支名>

分支功能

  • 開分支並切過去

    ​​​​git checkout -b dev
  • 切換分支

    ​​​​git checkout dev
  • 刪除分支

    ​​​​git checkout -D dev

查詢功能

  • 查詢狀態

    status
    ​​​​git status 查看当前工作区暂存区变动 // modified: 111.txt ​​​​git status -s 查看当前工作区暂存区变动,概要信息 // M 111.txt ​​​​git status --show-stash 查询工作区中是否有stash(暂存的文件)
    git log
    ​​​​git log 查看提交历史 ​​​​git log --oneline 以精简模式显示查看提交历史 ​​​​git log -p <file> 查看指定文件的提交历史 ​​​​git blame <file> 一列表方式查看指定文件的提交历史
    git diff
    ​​​​git diff 显示暂存区和工作区的差异 ​​​​git diff filepath filepath路径文件中,工作区与暂存区的比较差异 ​​​​git diff HEAD filepath 工作区与HEAD ( 当前工作分支)的比较差异 ​​​​git diff branchName filepath 当前分支的文件与branchName分支的文件的比较差异 ​​​​git diff commitId filepath 与某一次提交的比较差异 ​​​​`

合併功能

merge前要把暫存區先commit或是清空工作區和暫存區

git merge issue1
  • merge

    • fast-foward

      假設被merge的分支包含所有的主分支內容, 則叫做fast-forwar

    • normal merge

      假設被merge的分支不包含所有的主分支內容, 則會創建一個新的commit

      ​​​​​​​​git merge master 在当前分支上合并master分支过来 ​​​​​​​​git merge --no-ff origin/dev 在当前分支上合并远程分支dev ​​​​​​​​git merge --abort 终止本次merge,并回到merge前的状态
    • squash
      直接建立一個新的commit可以用squash

  • rebase

    git A rebase B 意思是將A分支接到B分支之後
    ex: 將issue3合併到master, 如果直接使用merge的話
    假設有conflict就會多產生一個commit


    用rebase將issue3接到master之後(conflict還是要解決)
    再做merge就不會多一個commit

撤銷回退

  • 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 反向的操作而已。

標籤

標籤是用於標記特定的點/提交的歷史,通常會用來標記發布版本的名稱/號碼(如:v1.0)。

  • 輕量標籤

    不可變更的暫時標籤
    可以添加名稱
  • 標示標籤

    可以添加打標簽者的名稱、email及日期
    可以添加名稱
    可以添加註解
    可以添加簽名

修改歷史

rebase -i

如果出現fatal: It seems that there is already a rebase-merge directory,刪除.git內部哦rebase-merge資料夾

其它功能

  • stash
    可以將stage和unstage都存起來

    使用時機: 切換branch的時候

    ​​ git stash save #暫時儲存現狀的操作 ​​ git stash list #顯示暫存清單 ​​ git stash pop #還原(還原前要確定暫存區乾淨) ​​ git stash drop #刪除暫存的操作 ​​
  • git reflog

    可以查詢git的歷史log

  • gitignore
    如果檔案本來就沒有track
    直接對檔案ignore即可

    如果檔案已經track了

    ​​​​git rm --cached .\filename

Application

1. 如何回到上一步?

git reset --hard HEAD^