iT邦幫忙

3

Git - 學習筆記

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

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 前必須要先設定使用者與 Email 才可以使用,所以我們先在全域設定

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

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

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

$ git init

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

Git 架構與基本知識

我們先來看一下 Git 的架構,共分為工作區暫存區本地端檔案庫遠端檔案庫,前三個皆在本地端進行,只有最後一個是在遠端的 Server 進行
Git 關係圖

  • HEAD: 目前檔案比對的基準,每次 commit 後皆會前進
  • master: 預設的分支名稱
  • .gitignore: 可忽略不必要的檔案,於根目錄加入此檔案,並在裡面輸入需要忽略的檔案名稱
  • -f: 在指令後方加上 -f 可以強制執行該指令
  • @: 可以代替指令中的 HEAD

開始使用 Git 指令

首先介紹幾個比較常用的指令

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

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

$ git commit -m "git init"
// 將暫存區的檔案執行 commit ,-m 後面為 commit 的內容
$ git commit --amend -m "git init again"
// 修改最後一次 commit 的內容
$ git commit --amend --no-edit
// 將暫存區的檔案併入最後一次 commit

$ git log
// 查詢所有 commit 紀錄
$ git log -p 
// 參數 -p 顯示 commit 詳細資訊
$ git log --oneline --graph
// 參數 --oneline 顯示更精簡的 commit 紀錄
// 參數 --graph 顯示 commit 線圖
$ git log --all
// 參數 --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 blame 檔案名稱
// 查看檔案內容 commit 的時間點與作者

$ git diff
// 查看檔案差異

diff 是比較少用的指令,在檢查檔案差異時可使用,使用方法如圖
git diff使用說明

最後介紹設定指令縮寫的方式

$ git config --global alias.縮寫 指令
// 例如 git config --global alias.co checkout

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 reset --mixed
// 清除暫存區,但工作目錄不變

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

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

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
// 刪除分支,使用 -D 可強制刪除

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

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

$ git branch -m index index2
// 修改分支名稱,將 index 分支修改為 index2

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

使用 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 "v4.0" HashID
// 在該 HashID 上貼上 v4.0的標籤

$ 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 檢舉

感謝~

我要留言

立即登入留言