Git 的奇技淫巧

2021-02-14 技術最TOP
Git 是一個 「分布式版本管理工具」,簡單的理解版本管理工具:大家在寫東西的時候都用過 「回撤」 這個功能,但是回撤只能回撤幾步,假如想要找回我三天之前的修改,光用 「回撤」 是找不回來的。而 「版本管理工具」 能記錄每次的修改,只要提交到版本倉庫,你就可以找到之前任何時刻的狀態(文本狀態)。下面的內容就是列舉了常用的 Git 命令和一些小技巧,可以通過 "頁面內查找" 的方式進行快速查詢:Ctrl/Command+f。如果之前未使用過 Git,可以學習 Git 小白教程[2]入門。

一定要先測試命令的效果後,再用於工作環境中,以防造成不能彌補的後果!到時候別拿著砍刀來找我

所有的命令都在git version 2.7.4(Apple Git-66)下測試通過

統一概念:

工作區:改動(增刪文件和內容)

暫存區:輸入命令:git add 改動的文件名,此次改動就放到了 『暫存區』

本地倉庫(簡稱:本地):輸入命令:git commit 此次修改的描述,此次改動就放到了 』本地倉庫』,每個 commit,我叫它為一個 『版本』。

遠程倉庫(簡稱:遠程):輸入命令:git push 遠程倉庫,此次改動就放到了 『遠程倉庫』(GitHub 等)

commit-id:輸出命令:git log,最上面那行 commit xxxxxx,後面的字符串就是 commit-id

如果喜歡這個項目,歡迎 Star、提交 Pr、反饋問題[3]

git help -g

The command output as below:

The common Git guides are:

attributes Defining attributes per path

cli Git command-line interface and conventions

core-tutorial A Git core tutorial for developers

cvs-migration Git for CVS users

diffcore Tweaking diff output

everyday A useful minimum set of commands for Everyday Git

glossary A Git Glossary

hooks Hooks used by Git

ignore Specifies intentionally untracked files to ignore

modules Defining submodule properties

namespaces Git namespaces

repository-layout Git Repository Layout

revisions Specifying revisions and ranges for Git

tutorial A tutorial introduction to Git

tutorial-2 A tutorial introduction to Git: part two

workflows An overview of recommended workflows with Git

'git help -a' and 'git help -g' list available subcommands and some concept guides. See 'git help <command>' or 'git help <concept>' to read about a specific subcommand or concept.

git fetch --all && git reset --hard origin/master

也就是把所有的改動都重新放回工作區,並清空所有的 commit,這樣就可以重新提交第一個 commit 了。

git update-ref -d HEAD

輸出工作區和暫存區的 different(不同)。

git diff

還可以展示本地倉庫中任意兩個 commit 之間的文件變動:

git diff <commit-id> <commit-id>

輸出暫存區和本地最近的版本(commit)的 different(不同)。

git diff --cached

輸出工作區、暫存區 和本地最近的版本(commit)的 different(不同)。

git diff HEAD

git checkout -

git branch --merged master | grep -v '^\*\| master' | xargs -n 1 git branch -d

git branch -vv

關聯之後,git branch -vv 就可以展示關聯的遠程分支名了,同時推送到遠程倉庫直接:git push,不需要指定遠程倉庫了。

git branch -u origin/mybranch

git push origin/mybranch -u

git branch -r

git branch -a

git checkout -b <branch-name>

git checkout -b <branch-name> origin/<branch-name>

git branch -d <local-branchname>

git push origin --delete <remote-branchname>

git push origin :<remote-branchname>

git branch -m <new-branch-name>

git tag

git describe --tags --abbrev=0

git tag -ln

git tag <version-number>

默認 tag 是打在最近的一次 commit 上,如果需要指定 commit 打 tag:

$ git tag -a <version-number> -m "v1.0 發布(描述)" <commit-id>

首先要保證本地創建好了標籤才可以推送標籤到遠程倉庫:

git push origin <local-version-number>

git push origin --tags

git tag -d <tag-name>

刪除遠程標籤需要先刪除本地標籤,再執行下面的命令:

git push origin :refs/tags/<tag-name>

一般上線之前都會打 tag,就是為了防止上線後出現問題,方便快速回退到上一版本。下面的命令是回到某一標籤下的狀態:

git checkout -b branch_name tag_name

git checkout <file-name>

git checkout .

git rev-list -n 1 HEAD -- <file_path> #得到 deleting_commit

git checkout <deleting_commit>^ -- <file_path> #回到刪除文件 deleting_commit 之前的狀態

以新增一個 commit 的方式還原某一個 commit 的修改

git revert <commit-id>

回到某個 commit 的狀態,並刪除後面的 commit和 revert 的區別:reset 命令會抹去某個 commit id 之後的所有 commit

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

git reset –mixed HEAD^ #回退至上個版本,它將重置HEAD到另外一個commit,並且重置暫存區以便和HEAD相匹配,但是也到此為止。工作區不會被更改。

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

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

如果暫存區有改動,同時也會將暫存區的改動提交到上一個 commit

git commit --amend

git log

git blame <file-name>

每次更新了 HEAD 的 Git 命令比如 commint、amend、cherry-pick、reset、revert 等都會被記錄下來(不限分支),就像 shell 的 history 一樣。這樣你可以 reset 到任何一次更新了 HEAD 的操作之後,而不僅僅是回到當前分支下的某個 commit 之後的狀態。

git reflog

git commit --amend --author='Author Name <email@address.com>'

git remote set-url origin <URL>

git remote add origin <remote-url>

git remote

git whatchanged --since='2 weeks ago'

把 A 分支的某一個 commit,放到 B 分支上這個過程需要 cherry-pick 命令,參考[4]。

git checkout <branch-name> && git cherry-pick <commit-id>

git config --global alias.<handle> <command>

比如:git status 改成 git st,這樣可以簡化命令

git config --global alias.st status

git stash

git stash -u

git stash list

git stash apply <stash@{n}>

回到最後一個 stash 的狀態,並刪除這個 stash

git stash pop

git stash clear

git checkout <stash@{n}> -- <file-path>

git ls-files -t

git ls-files --others

git ls-files --others -i --exclude-standard

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

clean 後,刪除的文件無法找回

不會影響 tracked 的文件的改動,只會刪除 untracked 的文件

git clean <file-name> -f

可以用來刪除新建的目錄,注意:這個命令也可以用來刪除 untracked 的文件。詳情見上一條。

git clean <directory-name> -df

git log --pretty=oneline --graph --decorate --all

git bundle create <file> <branch-name>

新建一個分支,分支內容就是上面 git bundle create 命令導出的內容

git clone repo.bundle <repo-dir> -b <branch-name>

git rebase --autostash

git fetch origin pull/<id>/head:<branch-name>

git diff --word-diff

git clean -X -f

注意:config 分為:當前目錄(local)和全局(golbal)的 config,默認為當前目錄的 config

git config --local --list(當前目錄)

git config --global --list(全局)

git status --ignored

commit 歷史中顯示 Branch1 有的,但是 Branch2 沒有 commit

git log Branch1 ^Branch2

git log --show-signature

git config --global --unset <entry-name>

新建並切換到新分支上,同時這個分支沒有任何 commit

git checkout --orphan <branch-name>

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

git clone -b <branch-name> --single-branch https://github.com/user/repo.git

關閉 track 指定文件的改動,也就是 Git 將不會在記錄這個文件的改動

git update-index --assume-unchanged path/to/file

git update-index --no-assume-unchanged path/to/file

git config core.fileMode false

git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/

通過 grep 查找,given-text:所需要查找的欄位

git log --all --grep='<given-text>'

git reset <file-name>

git push -f <remote-name> <branch-name>

type:commit 的類型

feat:新特性

fix:修改問題

refactor:代碼重構

docs:文檔修改

style:代碼格式修改,注意不是 css 修改

test:測試用例修改

chore:其他修改,比如構建流程,依賴管理

scope:commit 影響的範圍,比如:route,component,utils,build……

subject:commit 的概述

body:commit 具體修改內容,可以分為多行

footer:一些備註,通常是 BREAKING CHANGE 或修復的 bug 的連結

使用Commitizen代替 git commit可以使用 cz-cli[7] 工具代替 git commit。

npm install -g commitizen cz-conventional-changelog

echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc

相關焦點

  • GRE考試有什麼奇技淫巧?
    免責聲明:以下內容都不是嚴肅的學術內容,真的也就是一些所謂的奇技淫巧。不代表考試的時候用了就一定會對,巍哥無法保證百分之百的正確率,只能大概主觀說一下靠譜程度,因為的確這些東西沒有經過嚴格統計過!接下來,就是見證奇蹟的時刻:
  • git操作之二:git restore
    該命令有git restore <file>和git restore --staged <file>兩種常用的用法。二、詳述在git中有工作區、暫存區、倉庫區(本地代碼區)三部分,要注意git restore命令在工作區是不會其作用的,也就是一個文件在工作區,使用git restore是不起作用的。
  • 【譯文】Git merge 和 Git rebase比較
    在這篇文章中,我們會比較git rebase和類似的git merge命令,找到Git工作流中rebase的所有用法。概述   你要知道的第一件事是,git rebase 和git merge 做的事其實是一樣的。它們都被設計來將一個分支的更改併入另一個分支,只不過他們實現方式有些不同。
  • 前端面試題:git reset、git revert 和 git checkout 有什麼區別
    三個區的轉換關係以及轉換所使的命令如下圖git reset、git revert 和 git checkout的共同點:來撤銷代碼倉庫中的某些更改。然後是不同點: 先,從 commit 層來說: git reset 可以將個分的末端指向之前的個 commit。然後再下次 git 執垃圾回收的時候,會把這個 commit之後的 commit 都扔掉。
  • 面試題:闡述一下GitFlow(git工作流)
    因此,當需要保留詳細的合併信息的時候建議使⽤git merge,特別是需要將分⽀合併進⼊master分⽀時;當發現⾃⼰修改某個功能時,頻繁進⾏了git commit提交時,發現其實過多的提交信息沒有必要時,可以嘗試git rebase。
  • Git入門到高級系列2-git高級操作
    創建分支創建分支:git branch 分支名字命令,切換分支的命令使用 git checkout 分支名字$ git branch dev$ git checkout dev# -b創建分支,checkout是切換分支$ git checkout -b dev
  • Git 2.29 讓 Git 成功「牽手」Gerrit
    本地倉庫內開發,創建提交。工作區中執行 git pr命令,推送本地提交到伺服器。伺服器自動創建新的代碼評審(例如:pull request #123)。開發者根據評審意見,在本地工作區繼續開發,新增或修改提交。工作區中再次執行 git pr命令,推送本地提交到伺服器。
  • git環境配置和.gitconfig配置文件詳解
    git commit提交歷史時候,提示你需要配置global參數,設置你的郵箱地址和名稱(注意這個和你git伺服器的帳號可以不同哦,僅僅用於在git歷史中顯示):git config --global user.email"you@example.com"git config --global user.name"你的名字"運行這兩個命令後
  • 神奇的git stash
    我們在使用git的時候也會遇到這樣的情況。當在需要緊急處理一個bug時,工作區內容又沒有完成,不適合提交,想暫存起來。方案實施git提供了git stash命令來解決這樣的需求。&& git commit -m "init"// 修改工作區和暫存區# echo 'need to be stashed' >> readme# git add readme// 查看此時工作區和版本庫區別# git diff HEADdiff --git a/readme b/readmeindex ce01362..55d6c28 100644--- a/readme
  • Git-操作文件
    git add添加文件到暫存區git add -i通過此命令將打開交互式子命令系統,你將看到如下子命令
  • Oh Shit, Git!?!
    git reflog# 你將看到你在 git 上提交的所有改動記錄被列# 了出來,而且囊括了所有的分支,和已被刪除的# commit 哦!# 撤回這次提交,但保留改動的內容git reset HEAD~ --softgit stash# 現在切到正確的那個分支去git checkout name-of-the-correct-branchgit stash popgit add . # 或者你可以添加指定的文件git commit -m "your message here
  • 【Git】616- git命令的進階和複習(帶動圖效果)
    小姐姐用動畫圖解Git個人比較推薦第二個Git學習網站猴子都能懂的git,圖文結合,簡單明了,本文將介紹一些常用 Git 指令,作為一個學習總結git rebasegit mergegit resetgit revertgit cherry-pickgit fetchgit
  • Askgit:利用熟悉的SQL語句挖掘git倉庫的信息
    本文蟲蟲就給大家介紹一個開源工具Askgit,用來在git存儲庫執行SQL查詢的命令行工具。在通過公共接口(SQL)臨時查詢磁碟上的git存儲庫,來代替各種繁瑣git命令行。另外我們可以通過指定$GOPATH方式將其安裝到特定的目錄(比如當前目錄):GOBIN=$(pwd) go get -v -tags=sqlite_vtable github.com/augmentable-dev/askgitAskgit也支持通過docker方式安裝:docker pull augmentable/askgit:latest
  • Git: 如何優雅的執行「git pull」操作
  • Git命令的動畫展示,讓我們學習Git事半功倍
    變基我們只是看到了如何通過執行可以將更改從一個分支應用於另一個分支git merge。將更改從一個分支添加到另一個分支的另一種方法是執行git rebase。一個git rebase 副本從當前分支的提交,並提出這些複製提交指定的分支上。太好了,我們現在可以在master分支上進行所有在分支上所做的更改dev!
  • 有意思的 git-log
    今天要說的便是常用的 git log 命令。先看幾個慄子以 React-Native 代碼為例,演示幾個有意思的 git-log 命令。README    - Correct URL of git repo.
  • 這才是真正的Git——Git實用技巧
    另外如果要合併的是最近的幾個commit,我們還可以用git reset --soft HEAD~3 && git commit -m 'xxx'來實現。對這個有問題的同學可以參照Git內部原理強調的可視化方法思考一下。
  • Git教程(一)
    首先你可以在命令行輸入git,看看系統有沒有安裝Git:$ gitThe program 'git' is currently not installed.這次我們在Project/目錄下新建一個倉庫:$ git initInitialized empty Git repository in C:/Users/zwbao/Desktop/Project/.git/git init命令使當前目錄下多了一個.git隱藏目錄(你可以用ls -a來查看它),這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裡面的文件
  • Git版本管理完全指南—學好Git一文足矣
    10. git branch -d 分支名 刪除本地分支11. git branch -D 分支名 強行刪除分支12. git branch origin :分支名 刪除遠處倉庫分支13. git merge 分支名  合併分支到當前分支上2、暫存操作1. git stash 暫存當前修改2. git stash apply 恢復最近的一次暫存
  • 常用Git 命令清單
    clone [url]# 添加$ git add ./# 提交$ git commit -m 「提交」# 上傳$ git push# 下拉更新$ git pull02配置和查看信息# 顯示當前的Git配置$ git config --list# 編輯Git配置文件