banner
Koresamuel

Koresamuel

Sometimes ever, sometimes never.
github
twitter
email

git的常用操作和場景

這裡只記錄一些常用的操作或者工作中遇到一些場景。

應當統一幾個概念

  • workspace(工作區):即你本地環境
  • staging area(暫存區 / 緩存區):輸入命令 git add 文件路徑,該文件的改動就放到了這個暫存區
  • local repository(版本庫或本地倉庫):輸入命令 git commit -m "此次修改的描述",改動就被放到了本地倉庫
  • remote repository(遠程倉庫):輸入命令git push,改動就被放到遠程倉庫,如 github, gitlab 等

他們之間的聯繫如下圖所示

Mermaid Loading...

下面是可以配置的常用的 alias(別名)

alias.amd=commit --amend --no-edit
alias.am=commit --amend
alias.br=branch --sort=-committerdate
alias.ci=commit
alias.co=checkout
alias.cp=cherry-pick
alias.df=diff
alias.drop=stash drop
alias.pci=!git fetch origin master && git rebase origin/master && git push
alias.la=log --oneline --decorate --graph --all
alias.last=log -1 HEAD --stat
alias.ls=log --graph --pretty=format:'%Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset %C(yellow)%D%Creset' --abbrev-commit
alias.lg=log --stat
alias.pl=pull --rebase origin master
alias.pop=stash pop
alias.pr=pull --rebase --recurse-submodules
alias.rc=rebase --continue
alias.ri=rebase -i HEAD~10
alias.root=rev-parse --show-toplevel
alias.save=stash save
alias.sl=stash list
alias.st=status
alias.sup=submodule update --init --recursive
alias.unstage=reset HEAD --

另外,文章裡提及的命令雖然已經過測試,但一定請先試了效果後再實際應用到工作生產環境中,以防造成無法彌補的後果。
所有帶有<>的說明它是一個變量,是根據需要替換的,替換的時候命令中不用包含這個符號。

快速切換到上一個分支#

git co -

刪除本地分支#

git branch -d <branch-name>

刪除遠程分支#

git push origin --delete <branch-name>

刪除遠程已刪除本地還存在的分支#

git remote prune origin

重命名本地分支#

git branch -m <new-branch-name>

還原 commit (以新增 commit 的形式)#

git revert <commit-id>

回到某個 commit,並刪除之後的 commit#

和 revert 的區別是,reset 或抹去 commit-id 後的所有 commit

git reset <commit-id> # 默認--mixed參數

# --mixed: 不刪除工作空間改動代碼,撤銷commit,並且撤銷git add .
# --soft: 不刪除工作空間改動代碼,撤銷commit,不撤銷git add .
# --hard: 刪除工作空間改動代碼,撤銷commit,撤銷git add .
git reset --mixed HEAD^ # 回退至上個版本,它將重置HEAD到當前的前一個commit,並且重置暫存區以便和HEAD相匹配,但是也到此為止。工作區不會被更改

git reset --soft HEAD~3 # 回退至三個版本之前,只回退了commit的信息,暫存區和工作區與回退之前保持一致。如果還要提交,直接commit即可

git reset --hard <commit-id> # 彻底回退到指定commit-id的狀態,暫存區和工作區也會變為指定commit-id版本的內容

保存當前修改但是不提交#

git stash

保存當前修改,包括 untrack(新增的)文件#

git stash -u

列出所有 stash#

git stash list

回到某個 stash 狀態#

git stash apply <stash@{n}> # 修改這個n

回到最近一個狀態,並從 stash 列表刪除它#

git stash pop

刪除所有 stash#

git stash clear

應用某個 stash 裡的某個文件修改#

git diff <stash@{n}> -- <file-path> # 應用前可以先看下diff
git co <stash@{n}> -- <file-path>

列出所有 track 文件#

git ls-files -t

列出所有 untrack 文件#

git ls-files --others

刪除 untrack 文件#

clean 命令可以用來刪除新建的文件。如果不指定文件文件名,則清空所有工作的 untracked 文件。注意兩點:

  1. clean 後,刪除的文件無法找回
  2. 不會影響 tracked 的文件的改動,只會刪除 untracked 的文件
git clean <file-path> -f # 其實還不如手動刪除

強制刪除 untrack 目錄#

git clean <directory-name> -df # 其實就是把新建的目錄及文件刪除了,只不過找不回

清除 gitignore 中記錄的文件#

 git clean -X -f

顯示 A 分支有而 B 分支沒有的 commit#

git log A ^B

展示任意分支某一文件內容#

 git show <branch-name>:<file-name>

根據 commit message 內容關鍵詞查找 commit#

git log --all --grep='<finding-message>'
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。