iT邦幫忙

3

Git - 學習筆記

git
Ares 2019-03-25 21:17:471344 瀏覽

Terminal 指令

認識Git之前首先要介紹幾個簡單的 Terminal 指令

Windows MacOS/Linux 功能
cd cd 切換目錄
cd pwd 顯示目前所在資料夾
dir ls 目前資料夾的檔案列表
md mkdir 創建資料夾
type nul> touch 建立檔案
copy cp 複製檔案
move mv 移動檔案
del rm 刪除檔案
cls clear 清除Terminal內容

※各個終端機指令皆有差異,Git bash 操作方式與 Mac 較相同

範例如下( Windows )

$ cd ..
// 回到上一層

$ cd test
// 移動到下一層的 test 資料夾

$ md test
// 建立 test 資料夾

$ type nul> test.txt
// 建立 test.txt 檔案

$ copy test.txt test2.txt
// 複製 test.txt 後建立一檔案為 test2.txt

$ move test.txt aa\bb.txt
// 將 test.txt 移動至 aa 資料夾內,並改名為 bb.txt

$ del test.txt
// 刪除 test.txt 檔案

Git 初始化

Git 關係圖
使用 Git 前必須要先設定使用者與 Email 才可以使用,所以我們先在全域設定

$ git config --global user.name "你的使用者名稱"
$ git config --global user.email "你的Email"

$ git config --list
// 查看設定

設定完成後開啟專案資料夾,輸入以下指令進行

$ git init

初始化後會在資料夾內新增一個 .git 資料夾,版本控管文件都存於此資料夾內,如果刪除此資料夾就無法再次復原檔案了!

Git 小知識

  • HEAD
    目前檔案比對的基準,每次 commit 後皆會前進
  • master
    預設的分支名稱
  • .gitignore
    可忽略不必要的檔案,於根目錄加入此檔案,並在裡面輸入需要忽略的檔案名稱

開始使用 Git 指令

比較常用指令

$ git status
// 觀看目前資料夾狀態

$ git add .
// 將所有檔案加入暫存區

$ git commit -m "git init"
// 將暫存區的檔案執行 commit ,-m 後面為 commit 的內容

$ git commit --amend -m "git init"
// 修改最後一次 commit 的內容

$ git log --all
// 查詢所有 commit 紀錄,加上 --all 則顯示包含 branch 的紀錄

以下指令較不常用到

$ git reset index.html
// 將 index.html 取消加入暫存區

$ git add -u
// 將有 commit 過且修改的檔案放入暫存區

$ git show HashID
// 查看某次 commit 與它上一版的差異細節(沒有輸入 HashID 預設為最後一次 commit)

$ git cat-file -p HashID
// 查看 HashID 的內容,HashID 至少四碼以上

$ git diff
// 查看檔案差異

git diff使用說明

Git 如何還原?

還原總共分為三種,分別是 revertcheckoutreset

使用revert

$ git revert HashID -n
// 復原 commit 並自動加一個 commit,加上 -n 則不會自動 commit

使用checkout

$ git checkout index.html
// 將 index.html 檔案還原至暫存區的狀態,暫存區沒有則還原至 HEAD

使用reset

$ git reset --hard
// 將檔案還原至 HEAD 的狀態,並清除暫存區

$ git reset HashID --hard
// 重設 HEAD 到某個 commit 並清除暫存區

$ git reflog
// 查看 HEAD 的移動紀錄

$ git reset --mixed
// 清除暫存區,但工作目錄不變

$ git reset HashID --mixed
// 清除暫存區,重設 HEAD 到某個 commit,但工作目錄不變

revert、checkout、reset 的差異

revert

  • 改變工作目錄的檔案
  • HEAD 與 master 維持不動
  • 需要按照順序還原 commit
  • 自動 commit

revert -n

  • 改變工作目錄的檔案
  • HEAD 與 master 維持不動
  • 不會 commit

checkout 檔案

  • 改變工作目錄的檔案
  • HEAD 與 master 維持不動

checkout commit or checkout branch

  • 重設工作目錄的檔案
  • HEAD 移動至 commit
  • master 維持不動

reset --hard

  • 重設工作目錄 & 暫存區
  • HEAD 與分支移動至commit

reset --mixed

  • 重設暫存區
  • HEAD 與分支移動至commit

reset --soft

  • HEAD 與分支移動至commit
指令 工作目錄 暫存區 HEAD 分支 備註
revert 重設 重設 往前 不變 新增 commit
revert -n 重設 不變 不變 不變
checkout 檔案 重設 不變 不變 不變
checkout 分支/commit 重設 不變 重設 不變
reset --hard 重設 重設 重設 重設
reset --mixed 不變 重設 重設 重設
reset --soft 不變 不變 重設 重設

操控 Git 分支

$ git branch
// 查看所有分支

$ git branch 分支名稱
// 新增分支

$ git branch 分支名稱 -d
// 刪除分支

$ git checkout 分支名稱
// 將HEAD移動到該分支

$ git checkout -b 分支名稱 
// 新增分支並切換HEAD

checkout 會將原本分支的異動套用到新分支,若新分支有其他修改導致無法套用,則無法切換分支

$ git log --all --graph
// 有線圖的 log 紀錄

使用 Checkout 切換分支有三種情況

  1. 正常切換
  2. 將檔案異動帶著一起切換
    成功切換至其他分支,但工作目錄維持修改的部分
  3. 無法切換
    修改的檔案與分支檔案有衝突,解決方法如下:
  • reset 將修改的部分捨棄
  • commit 下次需要時再回來使用檔案
  • stash 將檔案收藏起來
$ git stash save index
// 將檔案收藏為index

$ git stash list
// 收藏列表

$ git stash pop
// 取出最後一個收藏

合併分支

$ git merge dev
// 將 dev 合併到目前分支 (使用快進合併)

$ git merge --no-ff dev
// 將 dev 合併到目前分支 (不使用快進合併)

快進合併的意思是,只需移動分支即可完成合併,不使用快進合併則會產生一個 commit
(merge 預設是使用快進合併)

合併檔案遇到衝突怎麼辦?

遇到衝突通常都是因為兩個人一起 commit 同一個部分,此時則須兩人一起討論需如何修改,最後將不必要的部分刪除,將檔案加入暫存區,並再次 commit ,然後新增訊息或 :q 離開~

使用 rebase 讓線圖變為一條線

假設我們要將 dev 分支合併到 mester,則先切換到 dev,然後輸入指令

$ git rebase master

同上面,先將不必要的部分刪除,將檔案加入暫存區,並輸入以下指令

$ git rebase --continue

這時分支就合併完成了,並且也變成了一條線拉~

在 commit 上貼上標籤

$ git tag -a "v4.0" -m "update"
// 在目前 HEAD 上貼上 v4.0的標籤,訊息為 update

$ git tag -d "v4.0"
// 刪除 v4.0 標籤

$ git cat-file -p "v4.0"
// 查看 v4.0 標籤的訊息

Git 遠端操作

$ git init --bare
// 建立遠端檔案庫

$ git remote add origin 路徑
// 將本地端的檔案庫連結至遠端

$ git remote show origin
// 查看檔案庫資訊

$ git ls-remote 路徑
// 查看遠端分支

$ git fetch
// 抓取遠端 commit 紀錄

$ git merge origin/master
// 將本地端合併遠端分支

$ git branch -u origin/master master
// 將遠端的 master 設定為預設分支

$ git pull
// 等於 fetch + merge

$ git romote remove origin
// 刪除遠端檔案庫

$ git clone 路徑 資料夾名稱
// 複製遠端資料

$ git push
// 將分支推送至遠端,加上 -f 可以強制推送

$ git clean -f
// 把沒有版控的檔案刪除

$ git gc
// 清理沒有用到的 Object

1 則留言

1
Homura
iT邦高手 1 級 ‧ 2019-03-26 08:54:35

建立資料夾的Bash指令應該是mkdir

Ares iT邦新手 5 級‧ 2019-03-26 10:04:14 檢舉

感謝~

我要留言

立即登入留言