常用Git 備忘指南

優雅使用Git的一些實踐

oh-my-zsh 常用命令

Git常用命令

git克隆遠端分支倉庫:

git clone -b 分支名稱 遠端地址

git克隆遠端倉庫專案時如果不指定分支,只會克隆預設分支的內容。

檢視git使用者名稱和密碼

git config user。name

git config user。email

分支相關

git branch(檢視當前分支)

git branch -a(檢視所有分支)

git checkout 分支名(切換到對應分支)

會自動將程式碼更新為分支程式碼

git branch 分支名

(建立一個分支)

git branch -d 分支名

(刪除一個分支)

git branch -D 分支名

(強制刪除一個未合併的分支)

git checkout -b 分支名 [基於的分支名或commit值]

(切換分支並直接切換過去)

檢視git歷史

history

按照關鍵詞搜尋git歷史

history | grep push

檢視commit歷史

git log

git log ——summary

設定git賬號

git config ——global user。name “Frankkai”

git config ——global user。email “gaokai20100801@gmail。com”

git config user。name “Frankkai”

git config user。email “gaokai20100801@gmail。com”

檢視git賬號

git config ——global ——list

git config ——local ——list

僅僅檢視某一項的配置

git config ——local user。name

回滾本次修改

git reset HEAD static/lib/js/constantsUrl。js

git checkout —— static/lib/js/constantsUrl。js

檢視本次修改的程式碼

git diff

git diff HEAD

git diff ——staged

提交後發現丟了幾個檔案沒有提交

發現丟了修改記錄,重新新增

git add “*。html”

重新提交,最終只有一個提交

git commit ——amend

快取某種字尾的檔案

git add “*。js”

清除快取區中的檔案

git reset octofamily/octodog。txt

徹底刪除某種字尾的檔案

git rm “*。txt”

合併分支到master

git merge 分支名

add 。之前取消提交某些檔案

git checkout ——

藏程式碼到髒目錄(適用於其他成員修改了相同分支程式碼,但又不想提交)

git stash

釋放髒目錄程式碼

git stash pop

釋放指定髒目錄程式碼

git stash pop stash@{0}

刪除遠端分支(此分支必須是非預設分支)

git push origin ——delete branchname

已經commit,強制回退到舊版本

git log

//找到commit hash值

git reset ——hard hash值

檢視stash目錄

git stash list

刪除某一個stash

git stash drop stash@{0}

設定遠端倉庫地址

git remote set-url origin git@foo。bar。com:baz/helloworld。git

本地建立了新分支,但是orgin沒有,push程式碼前

git push ——set-upstream origin preproduction

指定tag到遠端

git push origin

將全部tag打到遠端

git push ——tags

檢視當前tags

git tag ——list

僅僅刪除index不刪除working tree上的。idea檔案

git rm ——cached -r 。idea

// ——cached僅僅刪除index,-r(recursive)遞迴刪除。idea目錄下的所有檔案

git主動track檔案,控制檔案,做好提交準備

git add /。

git unstage檔案,釋放檔案,選擇性控制

git reset HEAD /。

暫存區檔案如何覆蓋工作目錄檔案

git reset HEAD /。 && git checkout —— /。

提交已經被git管理的,modified為紅色的所有檔案

git add -u

重置工作區和暫存區的所有檔案為原始狀態

git reset ——hard

比較當前分支與某次提交的區別

git diff HEAD [commit hash fragment]

刪除一個分支

git branch -D [branch name]

同步到remote後,合併多個commit 為1個

git rebase -i HEAD~2/hashpick && squash:wq!

檢視專案的origin代表的地址

git remote -v

pick中途誤退出

git rebase ——abort

未同步到remote,重新提交

reset soft

gitflow release 釋出新版本

git flow release start v0。5。0npm version minorgit flow release finish -ngit pushgit checkout mastergit push

gitflow hotfix 修復一個master上的bug

git flow hotfix start foonpm version patch // 注意:一定要在修復bug程式碼之前新增版本號git add 。git commit -m “version change message”git flow hotfix finish -ngit pushgit checkout mastergit push

對比2個分支的日誌

git log develop。。master

合併master程式碼到feature

git checkout featuregit merge master

git merge master feature

git rebase衝突時怎麼辦

resolve confictsgit add 。git rebase ——continue

squash多個commits成一個怎麼敲?

假設merge feature到master。

git checkout mastergit merge ——squash featuregit commit -m “這是一次squash commit”git push

檢視當前分支的父分支

git reflog show 32c3956 (HEAD -> currentBranch, origin/fatherBranch, fatherBranch, list) childBranch@{0}: branch: Created from fatherBranch

childBranch 是你新建的分支。fatherBranch 是它的父分支,也就是來源分支。

撤銷遠端分支錯誤提交

。。。resetgit push ——force

其實使用本地分支的提交替代遠端分支。

誤刪除領先遠端的本地分支如何恢復?

git reflog // 找出最新的commit sha1值,HEAD@{1}比HEAD@{2}新git branch branchName

透過git reflog找到一個commit,然後再cherry-pick也可以。

刪除由npm version patch/minor/major誤新增的tag

git tag | grep v1。1。38git tag -d v1。1。38git push origin :refs/tags/v1。1。38

git fetch與git pull的區別

git fetch 更新origin/*下的所有分支,在釋出git flow feature前很有用,用於更新remote分支。git pull 主要用來更新多人合作的當前分支,多用於更新local分支。

https://www。git-tower。com/learn/git/faq/difference-between-git-fetch-git-pull

遠端分支刪除,本地git fetch不能更新到最新分支

git fetch ——prune

——prune Before fetching, remove any remote-tracking references that no longer exist on the remote。

及時檢視本地所有分支的狀態

git remote show origin

假如遠端已不存在這個分支,git fetch ——prune也更新不到狀態,該怎麼辦?

git push origin ——delete feature/fix-chat-unread-msg-async

刪除單個脫離的遠端分支

git remote prune

取消一次合併(merge)

git merge ——abort

回退一次commit

git revert Head/[commit hash]

優雅使用Git的一些實踐

windows下gitbash支援中文輸入:

1)滑鼠左鍵點選左上角git的logo 2)找到options並且切換到text目錄,將Character set設定為UTF-8

生成ssh-key

ssh-keygen -t rsa -C “gaokai20100801@qq。com”

windows檢視ssh-key

/c/Users/frank/。ssh/id_rsa。pub

mac/linux檢視ssh-key

cd ~/。ssh

ls

cat id_rsa。pub

git flow

https://danielkummer。github。io/git-flow-cheatsheet/index。html

誤刪除stash,該怎麼辦?

git fsck ——unreachable |grep commit | cut -d\ -f3 |xargs git log ——merges ——no-walk ——grep=WIP

找到對應的commit hash值

git stash apply 1f55da93d26cd51f15f9e93351dae6b75e25e36f

。idea修改總是會提醒,。gitignore不生效

。idea/

git rm -r ——cached 。idea

Git中的origin是什麼?

origin是一個變數,代表著一個git倉庫地址。可以使用

git remote -v

檢視origin代表的地址。

Git的system,global和local引數分別代表什麼?

——system可以輸出很多git的系統設定,其中最有用的是alias,例如git s代表了git status,系統所有登入使用者有用。——global輸出了git的全域性設定,主要包括全域性的user。name和user。email,優先順序低於單個倉庫中設定的user。name和user。email,當前使用者所有倉庫有用。——local輸出了git的專案設定,主要包括remote。origin。url以及gitflow的很多配置,只對某個倉庫有用。

Git工作區和暫存區的區別?

add commit工作目錄——>暫存區——>版本歷史

暫存區:git已經獲得了對檔案的管理許可權,暫存區檔案有狀態:new file,deleted,modified等等。

版本歷史:git log檢視每一次commit記錄。

意外收穫:若是想非常細粒度的控制commit記錄,可以使用git add 指定檔案,分開多次commit,每一次commit提交一個細粒度功能的變更檔案集合,多次走檔案目錄 暫存區 版本歷史這個流程。

Git如何重新命名檔案?

git mv README。md readme。md

Git的working tree和index是什麼意思?

index指的是git索引,可以理解成git有檔案的一個複製,僅刪除index則僅刪除存在於git中的檔案。working tree則是指作業系統的工作樹,也就是作業系統的磁碟上儲存的檔案。舉兩個常用的例子:

僅刪除git index中的檔案,。idea等IDE隱藏的工作樹檔案是不能刪除的:

--cached

git rm ——cached -r 。idea // **——cached僅僅刪除index**,-r(recursive)遞迴刪除。idea目錄下的所有檔案

刪除index和working tree上的檔案,恩斷義絕

git rm

刪除index上和working tree上的檔案,

僅僅刪除working tree不刪除index的情況,不存在。

nothing to commit 和 working tree clean?

暫存區沒有可以提交到版本歷史的內容。工作區也是乾淨的。

如何一目瞭然地區分出工作區和暫存區?

Your branch is ahead of 'origin/master' by 1 commit

版本歷史

Changes to be committed

暫存區

Untracked files

工作區

// 版本歷史Your branch is ahead of ‘origin/master’ by 1 commit。 (use “git push” to publish your local commits)// 暫存區Changes to be committed: (use “git reset HEAD 。。。” to unstage) renamed: readme。md -> README。md new file: helloman// 工作區Untracked files: (use “git add 。。。” to include in what will be committed) hi

如何更加優雅地檢視日誌?

git log ——oneline

簡潔的commit記錄

git log -n2 ——oneline

最近的2次簡潔的commit記錄

git log ——all

所有分支的歷史版本資訊

git log ——graph

圖形化檢視版本演進歷史

git log ——oneline ——all -n4 ——graph

組合檢視日誌

如何快速定位到git的命令文件?

git help ——web log

瀏覽器檢視

git log

的用法

git自帶的圖形化介面怎麼看?

gitk

無需安裝第三方外掛,在純命令列下,無第三方軟體情況下可用。

git 裡的作者和提交人不一樣嗎?

作者是程式碼的生成者,是為了版權保護。

神秘的。git目錄

HEAD

工作分支refs/heads/foo

config

repo的配置資訊

refs

heads,分支;tags,標籤或者里程碑

refs/heads/master

存放了什麼,最新的一個commit

refs/tags/js01

存放了什麼,最新的一個tag,包含一個object

objects

資料夾,2個字元的和鬆散的pack資料夾,存放的是tree,tree下有blob檔案 可以直接透過vim修改HEAD,config等資訊,和命令的作用是相同的。

如何判斷git檔案的型別?

git cat-file -t/-p [hash fragment]

// -t 型別,-p 內容 只要任何檔案的檔案內容相同,在git眼裡,它就是唯一的一個blob。

commit tree // 位於objects目錄下blob // 位於objects目錄的二級目錄下,具體的檔案

tree, commit, blob的區別?

commit:一個commit肯定會對應一棵樹,包含了根tree,author,committer,parent等等一個commit物件的資訊。

tree:取出一個commit,存放了一個快照,這個快照,對應了當前專案的所有的資料夾及其檔案的快照,是特定時間的整個倉庫的一個狀態;樹裡可以有blob,也可以有樹,因為樹是資料夾;根樹是最大的樹。

blob: 與檔名是否相同無關,只要內容相同,就是唯一的blob。

一個commit包含了哪些?

git cat-file -p [commit hash fragment]

包含tree,parent,author和commiter。

tree f06f7f36af17cb9098031c66d22a7910c0fa1bacparent 92a55c8a5b1d38d224232ad84b9b728ae77189cbparent eda632a1f2a3ea049c5f5268f6b2f064b71898ceauthor FrankKai 1548139120 +0800committer FrankKai 1548139120 +0800Merge branch ‘feature/chatBreakChange’ into prerelease# Conflicts:# src/api/chat。js

一個tree包含了哪些?

git cat-file -p [tree hash fragment]

包含tree,blob。

100644 blob 015aaf344153ed7822069b2a98898b7d7a215b0d 。babelrc100644 blob 9d08a1a828a3bd2d60de3952744df29f9add27fa 。editorconfig100644 blob 080140b833db5b758b1eb869a269f4bbb068a19e 。eslintignore100644 blob 8f777c376c0314e480f9bbba273d4902810bcb11 。eslintrc。js100644 blob 895e844218637929546ed2295ae90f991ceb5d38 。gitignore100644 blob db7b635d23657349dbe4c33cc353ef4efd8ca960 。npmrc100644 blob 797e871f4b8c0a3071e8b6ab2cc40b804cd2971c 。postcssrc。js100644 blob d3983c1d6a5525aae58b823448723434ca83ceed 。prettierrc100644 blob 93cc7473ab066204f3329221111a945e2dc83576 BUS。md100644 blob defc3d9914d1af08e6670b96995261bfe1fb61a6 CHANGELOG。md100644 blob bfd46fd4008cbe7103181fc5cd64392a74426e96 MQTT。md100644 blob abdb55935d833dd4f4b79475aa7d63ffcb0cc9cd README。md040000 tree f1f80f844bb80389826198a15ec0f224a53525f8 build100644 blob 2aefa3130f4ff753b5c3e538db53b9b186f12540 index。html100644 blob 967b8f243420a9a8a07b8f429f0a7ba874a834ad package-lock。json100644 blob 35d9fa46f569395b25a87daef4820de42d071831 package。json040000 tree f6bdc675a8f9af805867b5a19c263e5bbfe4c26c src040000 tree 09e231414b91779326447a0c8d5b3421aa2308c2 static040000 tree ad94369cfdd2038a552e44fc0abbd1738113b5e6 test100644 blob 0b96f21c27a3759cecde02fba1e050d86a8e9a54 yarn。lock

一個blob包含了哪些?

git cat-file -p [tree hash fragment]

就是一個具體的檔案。

detached HEAD是什麼?

分離頭指標。

git checkout [commit hash fragment]

,切換到分離頭指標狀態,不與任何branch或tag關聯,git會認為這是不重要的,當成垃圾清理掉。

缺點:切換分支後,需要用

git branch [branch name] [commit hash fragment]

新建一個分支,否則會丟失原訊息。

優點:可以基於某一次commit切出分支,然後新建一個commit,快速會退到想要的版本。

HEAD可以指向什麼?

它位於。git/HEAD。

可以指向分支或者commit,

但其實分支歸根結底還是指向了commit

git log 檢視HEAD指標指向的分支名:

(HEAD->foo, bar, master)

可以快速diff,

git diff HEAD [commit hash fragment]

父親的父親diff:

git diff HEAD HEAD~2

git diff HEAD HEAD^^

如何修改最新一次commit的message?

git commit ——amend

注意:不能在團隊的整合分支上,做這樣的變更,僅適用於本地。

如何修改老舊commit的message?

git rebase -i [父 commit hash fragment]reward新增修改後的commit message

注意:不能在團隊的整合分支上,做這樣的變更,僅適用於本地。

git stash pop stash@{n}還能做什麼操作?

當前分支的原生代碼未提交的情況下,pull了領先的遠端分支程式碼,此時遠端程式碼會覆蓋原生代碼。

git比較聰明,它不會完全將本地的程式碼扔掉,即使沒有人為的生成一次commit記錄,也會自動為我們在stash下生成一次記錄,以免造成重大的程式碼丟失。

gitflow模式下,如何規範版本釋出?

版本號升級

gitflow對應

bug -> patch

hotfix

feature->minor

release

系統重構->major

release

但是在scrum的情況下,迭代非常快速,若所有feature都升級minor,會導致minor數字很大,該怎麼處理這種情況?

只升級minor時,在commit提交資訊中,新增以下資訊:

型別

提交資訊

bug patch

[bug patch]

feature patch

[feature patch

建立一個新的專案並上傳到git

git initgit acgit remote add origin remote repository URL

git引數——decorate是什麼?

有short,full,auto,no幾種值,——decorate=short

打印出commit的ref name。

short時,ref name 字首refs/head,refs/tags/和refs/remotes不會列印

full時,完整字首會被列印

auto時,如果輸出是一個終端,會按照short的方式列印;非終端會顯示全部

no時,會隱藏HEAD和tag等等refs資訊

預設值是short

cherry pick是什麼?

如何理解git cherry pick?

清空所有本地git 快取

git rm -r ——cache 。

error Command “husky-run” not found

rm -rf 。git/hooks/

一次完整的rebase流程

1。 git checkout feature2。 git rebase master3。 resolve conflicts4。 git add 。5。 git rebase ——continue

git revert和git reset的區別

git revert 生成一個新的commit的方式回滾到上一個或者指定commit版本的程式碼,原理是Head繼續前進。有存在被回滾掉的commit分支程式碼合併過來時,程式碼正常被合併

git reset 刪除某個commit之後的程式碼,原理是Head向後退。有存在被回滾掉的commit分支程式碼合併過來時,被reset掉的程式碼仍然會合並上來

oh-my-zsh 常用命令

縮寫全寫對照表

縮寫

全寫

gst

git status

gaa

git add 。

gcmsg “”

git commit -m “”

gp

git push

glog

git log ——oneline ——decorate ——graph

gl

git pull

gf

git fetch

gfa

git fetch ——all ——prune

使用小技巧

如何修改預設指令的引數,比如,glog的decorate預設是short,我想指定glog的decorate為no,要怎麼做?

glog ——decorate=no