这里只记录一些常用的操作或者工作中遇到一些場景。
應當統一幾個概念
- 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 文件。注意兩點:
- clean 後,刪除的文件無法找回
- 不會影響 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>'