說明

常用 Git Commands 記錄

Commands

Common

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 拉 remote 的 code 下來
git pull

# 拉 remote 的 code 下來
git pull --progress -v --no-rebase "origin"

# 查看 log
git log --stat -p .

# 查看 log
git show {{commit id | 前 6 碼}}

# show repo file list
git ls-files
git ls-tree --full-tree -r --name-only HEAD

# 列出目前資料夾的 Repo file list
git ls-tree -r HEAD --name-only

# 修改 remote origin 的 url
git remote set-url origin {git url}

# Checkout
git clone {git url}

# 刪除檔案
git rm {file path}

Commit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 查看目前的狀態
git status .

# 只看有變動的檔案
git ls-files -m

# 新增或將修改的檔案加入待上傳區
git add {{file path}}

# 一次加入所有被更動的檔案,包含 modified 及 deleted
git add -u

# 直接將所有有更動的檔案加入待上傳區
git add -e
# 會進到 vi 看所有檔案異動,如果對某個檔案有問題
# 1. 可以按 i 進到 insert mode
# 2. 然後對那個檔案的某一新增行進行異動
# 3. 再案 esc 退出 insert mode 後
# 4. 鍵入 :wq 存檔離開
# 5. 這時後這個檔案就不會進到 add 中
# 如果都沒問題
# 1. 直接鍵入 :q 存檔離開

# 查看差異
git diff {file path}

# 只查看檔名跟狀態的差異
git diff --name-status

# 將待上傳區的檔案移出
git restore --staged {file path}

# commit code to local branch
git commit
# 會進到 nano 中
# 1. 第一行為 commit message 的標題(僅限一行)
# 2. 第二行保留空白
# 3. 第三行以後是 commit message 的內容(可略過不寫)
# 4. ctrl + o, enter to save file
# 5. ctrl + x, exit
# 6. 如果不想存了,可以透過 ctrl + q 直接離開

Push

1
2
3
4
5
6
7
8
9
# 查詢 remote name
git remote -v
origin ...
origin ...
# 開題的 origin 就是 remote name

# 推送某個 branch 到某個 remote
git push {remote name} {branch name}
# git push origin main

Branch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看本地端的 branch
git branch

# 查看本地及遠端的 branch
git branch -a

# new branch
git branch {new branch name}

# switch / change to branch
git checkout {to branch name}

# merge branch
git merge {from branch name}

# 還原 merge
git merge --abort

# delete branch locally
git branch -d {branch name}

# delete branch remotely
git push origin :{branch name}

Conflict

  • Solution A

    1. git status 看是那個檔案的狀態是 both modified
    2. 透過 vi 或其它的文字編輯器查看異動地方,並修正
    1
    2
    3
    4
    5
    <<<<<<< HEAD (目前的 branch)
    <div>我是 Cat</div>
    =======
    <div>我是 Dog</div>
    >>>>>>> master (合併進來的)
    1. 利用 git add {file path} to mark resolution
    2. git commit
  • Solution B

    1. git status 看是那個檔案的狀態是 both modified
    2. 直接使用某一方的 Code
    1
    2
    3
    4
    5
    # 對方
    git checkout --theirs {file path}

    # 我方
    git checkout --ours {file path}
    1. git commit

Delete Remote Commit

  1. 刪掉 現存的所有的 clone

    最好是團隊所有人都刪掉,如果沒先刪掉的話,就算 A 刪掉了 XXX Commit ,但 B 在刪之前就先把 XXX Commit 拉下來了,這時後 A 刪完後, B 又再拉下來後就會把 XXX Commit 又再 Merge 進去

  2. 重新抓 Code 下來
  3. 把 Tag 都抓下來
  4. 退回到想要的版本(軟退回,保留檔案)
  5. 重新 commit code
  6. 強制 push 上去蓋掉 remote 上的 trunk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 1. 刪除 clone
rm -rf {folder name}

# 2. 重新抓 Code 下來
git clone {repository URL}

# 3. 把 Tag 都抓下來
git pull --all --tags

# 4. 退回到想要的版本(軟退回,保留檔案)
git reset --soft HEAD~1
# or
git reset --soft {git commit id}

# 5. 重新 commit code
git add {file name}
git commit

# 6. 強制 push 上去蓋掉 remote 上的 trunk
git push origin {branches name} --force

# ---------------------------
# back to this version and keep change
git reset --soft {git commit id}

# re-commit again
git commit

# overwrite push (force)
git push origin {branches name} --force

Revert

1
2
3
4
5
6
7
8
9
# Revert File
git checkout -- {file}

# 直接 reset 回到這個版本
git reset --hard {git commit id}
--hard to revert files
--soft to keep change
# 回到最新的版本
git pull -f origin {branches name}

參考

Git 教學
Delete Remote Commit