常用的Git筆記

Note of Commonly Used Git

Posted by imprld01 on Saturday, July 23, 2022

目錄


初始設定

  1. 使用者設定

    git config --global user.name "username"
    git config --global user.email "username@imprld01.com"
    
    #linux/macos
    git config --global core.autocrlf input
    
    #windows
    git config --global core.autocrlf true
    git config --global core.filemode false
    
    #optimal
    git config --global --add core.compression -1
    
    git config --global color.ui true
    git config --global core.editor vim
    git config --global ssh.variant ssh
    git config --global log.decorate short
    git config --global alias.last 'log -1 HEAD'
    git config --global alias.visual '!gitk --all'
    git config --global alias.unstage 'reset HEAD --'
    git config --global commit.template ~/git-template
    
  2. Git設定檔位置

    • 在使用者的家目錄下能找到.gitconfig,裡面記錄剛剛的使用者設定跟其他偏好設定
    • 在Git專案下可以找到.git,裡面有一個檔案config,裡面記錄著遠端儲存庫、分支等訊息
  3. 符號含意

    HEAD       # current position
    HEAD^^     # previous and previous
    HEAD~2     # previous and previous 
    HEAD@{2}   # previous and previous
    ORIG_HEAD  # previous HEAD before reset
    FETCH_HEAD # position fetched from remote
    

常用指令

  1. 使用下面指令開始新的Git專案、新增修改、提交版本:

    git init
    git add .
    git commit
    
  2. 可以使用下面指令取代git commit,直接附上簡短的commit message:

    git commit -m "one line message here"
    
  3. 可以使用下面指令結合git add .git commit

    git commit -a
    
  4. 新增變更後,或者想更新commit message,可以使用其中一條指令更新最近一次的commit:

    git commit --amend
    
  5. 可以使用其中一條指令顯示之前的commit message:

    git show
    git show a1b2c3
    git show a1b2c3:path/file.py
    
  6. 可以使用其中一條指令顯示commit的歷史:

    git log
    git log -g
    git log --all
    git log --graph
    git log --oneline
    git log --decorate # show tag
    
    git reflog
    
    # install gitk for ui interface
    gitk -a
    gitk --all
    
  7. 可以使用以下指令取消版本控制:

    git rm --cached file2.py
    
  8. 清除沒有進行版本控制的檔案:

    # exclude ignored files
    git clean -fd
    git clean -nd # dry run
    
    # include ignored files
    git clean -fdx
    git clean -ndx # dry run
    
  9. 把之前的commit拉到目前版本上作為新commit:

    git revert c1b2a3
    
  10. 重設置特定commit版本,重設前可以先用git reflog確認版本跟commit ID

    git reset # reset to HEAD
    git reset --hard # reset to HEAD
    
    git reset c3b2a1
    git reset --hard c3b2a1 # move to c3b2a1, and original changes 
    git reset --soft c3b2a1 # move to c3b2a1, and original changes to be commited
    
  11. 放棄已經git add的修改:

    git checkout .
    git checkout -- .
    git checkout -- file3.py
    
  12. 取得現有的遠端儲存庫Git專案:

    git clone https://github.com/projectNe10/Ne10
    
  13. 使用下面指令對branch基礎操作:

    git branch my_new_branch a3b2c1
    
    git branch -d that_branch
    git branch -m old_branch_name new_branch_name
    
    git checkout -b a_new_branch
    git checkout -b a_new_branch c5b6a7
    
    git checkout a5b6c7 -- file5.py
    git checkout old_branch file6.py
    
    git blame -- file7.py # show that who changes file7.py line by line
    
  14. 創建新的commit來合併其他branch或舊commit:

    git merge a8b9c0
    git merge other_branch
    
    git merge --ff other_branch    # fast-forward (linear-tree effect)
    git merge --no-ff other_branch # no fast-forward
    
    git cherry-pick c8b9a0 --no-commit
    
  15. 操作遠端儲存庫:

    git remote remove origin
    git remote add origin URL
    git remote rename origin origin2
    
    git push origin test:master
    git push origin test:refs/heads/master
    git push origin test:refs/for/master
    git push origin test:refs/for/refs/heads/master
    
    git pull
    git fetch -p origin # -p to remove unavailabe remote branch
    
  16. 透過下面指令一次操作多個commit:

    git review
    git rebase origin/master
    
    git rebase -i HEAD~4 #可用來將多個commit重新整理過,一般會在push上Gerrit前進行
    git rebase -i HEAD~3 master --onto dev_branch #可用來將多個commit移至新的branch上
    
  17. 使用下面指令來靜態標記commit:

    #Tag: read-only commit pointer
    
    git tag
    git tag -n
    git tag -d tag_v0
    
    git tag tag_v0
    git tag -f tag_v0
    git tag tag_v0 d1e2f3    # just light-weight
    
    git tag -a tag_v1 d3e2f1 # annotated many information
    git tag -am "message for this tag" tag_v1 d3e2f1
    
    git show tag_v0
    
    git fetch --tags
    
    git push --tags
    git push -f --tags
    git push origin tag_v2
    git push -f origin tag_v2
    
    git push origin :refs/tags/tag_v2 # delete remote tag
    
    git checkout -b new_branch_v2 tag_v2
    
  18. 使用下面指令補充commit message而不直接修改commit message:

    git notes add f1e2d3
    git notes add -m "messages in this note" f1e2d3
    git notes remove f1e2d3
    
    git notes show f1e2d3
    
    git push origin "refs/notes/*"
    git push origin refs/notes/commits
    
    git fetch origin "refs/notes/*:refs/notes/*"
    git fetch origin refs/notes/commits:refs/notes/commits
    

Reference

  1. Git对库文件权限的管理与filemode配置详解_易生一世的博客-CSDN博客
  2. GIT常见问题记录_hjwzyy的博客-CSDN博客
  3. Git - Git Aliases
  4. Git: 讓你的代碼回到過去,git reset 與 git revert 的用處
  5. 3. Reset【教學3 改寫提交】 | 連猴子都能懂的Git入門指南 | 貝格樂(Backlog)
  6. 【狀況題】不小心使用 hard 模式 Reset 了某個 Commit,救得回來嗎? - 為你自己學 Git | 高見龍
  7. git clean 的用法详解_一定要学_一定要慎用_不头秃的码农的博客-CSDN博客_gitclean
  8. Git: Cherry-pick - 選擇某個分支的某些提交記錄 | Summer。桑莫。夏天
  9. 4. Cherry-pick【教學3 改寫提交】 | 連猴子都能懂的Git入門指南 | 貝格樂(Backlog)
  10. 【狀況題】如果你只想要某個分支的某幾個 Commit? - 為你自己學 Git | 高見龍
  11. Git 上標籤(Tagging) - Practical guide for git users 0.1 文档
  12. Git - git-notes Documentation
  13. [Git] tag 操作

comments powered by Disqus