Git高級(jí)命令

命令 1:查看歷史記錄 git log

可以查看所有提交記錄


如果想看更加詳細(xì)的信息可以用 git log -p 可以看到所有細(xì)節(jié)
如果只想看下大致修改內(nèi)容可以用git log --stat
如果想看某個(gè)提交的詳細(xì)信息可以用git show + id
如果想以標(biāo)準(zhǔn)格式輸出日志git log -g
git log -g標(biāo)準(zhǔn)格式輸出日志

命令 2:git commit --amend

適用場景: 提交后發(fā)現(xiàn)有錯(cuò)誤,修正
釋義: "amend" 是「修正」的意思,git commit 加上 -- amend參數(shù)的時(shí)候并不是在
當(dāng)前commit上增加一個(gè)commit,而是會(huì)把當(dāng)前commit的內(nèi)容和暫存區(qū)里的內(nèi)容合并起來
創(chuàng)建一個(gè)新的commit,并用這個(gè)新的commit替換掉當(dāng)前commit
git log將不會(huì)看到上次的commit id了,因?yàn)橐呀?jīng)把它修改,相當(dāng)于擦除

命令3 : git reset --hard HEAD^

適用場景:提交后修正都不想,寫的太爛了,直接丟棄
就可以使用 git reset --hard HEAD^ reset 有重置的意思,
相當(dāng)于重置工作目錄到最新提交的上一次
HEAD就是當(dāng)前commit的引用,HEAD^表示的HEAD的父commit

reset 不止可以用來丟棄最新的提交,了解它的本質(zhì)就知道它其他的用途

reset 的本質(zhì):移動(dòng) HEAD 以及它所指向的 branch

  • reset --hard:重置工作目錄,工作目錄里的內(nèi)容會(huì)被完全重置為和 HEAD 的新位置相同的內(nèi)容,未提交的內(nèi)容會(huì)被全部擦除掉(謹(jǐn)慎使用,除非確保工作目錄里面的內(nèi)容都不要了)

  • reset --soft:保留工作目錄,會(huì)在重置 HEAD 和 branch 時(shí),保留工作目錄和暫存區(qū)中的內(nèi)容,并把重置 HEAD 所帶來的新的差異放進(jìn)暫存區(qū)

  • --mixed(默認(rèn)):重置位置的同時(shí),保留工作目錄的內(nèi)容,并清空暫存區(qū)。

  • reset 不加參數(shù):默認(rèn)使用 --mixed 參數(shù) 保留工作目錄,并清空暫存區(qū)

命令4 : git reabse

merge 之后,commit 歷史就會(huì)出現(xiàn)分叉,這種分叉再匯合的結(jié)構(gòu)會(huì)讓有些人覺得混亂
可以用 rebase 來代替 merge,就不會(huì)出現(xiàn)分叉

感覺文字描述已經(jīng)不能比動(dòng)態(tài)圖更好,直接用圖解

git merge branch1 //合并分支,是站在master上合并branch1
git merge branch1的圖解--來自扔物線

如果把 merge 換成 rebase,可以這樣操作:

git checkout branch1//簽出分支branch1 HEAD 指向了 branch1
git rebase master //站在branch 1上 rebase操作
git rebase master的圖解--來自扔物線
可以看出,通過 rebase,5 和 6 兩條 commits 把基礎(chǔ)點(diǎn)從 2 換成了 4 。
通過這樣的方式,就讓本來分叉了的提交歷史重新回到了一條線。
這種「重新設(shè)置基礎(chǔ)點(diǎn)」的操作,就是 rebase 的含義。

另外,在 rebase 之后,記得切回 master 再 merge 一下,把 master 移到最新的 commit

git checkout master //簽出到master分支
git merge branch1
merge
上面的動(dòng)態(tài)圖清晰的描述了git checkout branch名 的本質(zhì),其實(shí)是把 HEAD 指向指定的 branch,
然后簽出這個(gè) branch 所對應(yīng)的 commit 的工作目錄

同樣的,checkout 的目標(biāo)也可以不是 branch,而直接指定某個(gè) commit:...
可以直接指定 commit 作為參數(shù),來把 HEAD 移動(dòng)到指定的 commit

綜上:checkout 的本質(zhì)是簽出指定的 commit

checkout和reset的區(qū)別

checkout 和 reset 都可以切換 HEAD 的位置,它們除了有許多細(xì)節(jié)的差異外,最大的區(qū)別在于:
reset 在移動(dòng) HEAD 時(shí)會(huì)帶著它所指向的 branch 一起移動(dòng),而 checkout 不會(huì)。
當(dāng)你用 checkout 指向其他地方的時(shí)候,HEAD 和 它所指向的 branch 就自動(dòng)脫離了...

和 merge 是不同的,rebase 是站在需要被 rebase 的 commit 上進(jìn)行操作
所以前面需要先切到分支再rebase

命令5 : git pull --reabse

那就先看看git pull,我們都知道是同步代碼,拉取遠(yuǎn)程最新的代碼
git pull命令其本質(zhì)是:把遠(yuǎn)程倉庫使用git fetch 取下來以后再進(jìn)行 git merge操作的

如果本地什么都沒有修改 git pull 其實(shí)是和git fetch一樣的

如果本地有修改,就會(huì)做merge 操作,用命令操作的話可能就會(huì)彈出編輯框,有一條默認(rèn)的merge信息,相當(dāng)于產(chǎn)生了一個(gè)新的commit,可以使用自動(dòng)的merge信息,也修改merge信息

所以如果合并算法能解決的 產(chǎn)生沖突的話,需要先解決沖突

git pull rebase
如果在本地什么都沒有修改的情況下git pull rebasegit pullgit fetch都是一樣的
有修改的情況下git pull rebase 相比會(huì)改變父commit

--rebase 可以讓提交記錄看起來很連續(xù)和優(yōu)美,而不是多出很多無用的merge commit

命令6 : git reflog

騷操作 ,它能把所有的操作命令展示出來
圖片來的更加直觀,比如你用了git commit --amend 想要回到上次commit 咋整?
用這個(gè)命令,還能找到上次的commit id 再 reset 回去

git reflog

reflog 是 "reference log" 的縮寫,查看的其實(shí)是引用的記錄
默認(rèn)不寫查看的是HEAD的移動(dòng)記錄,也可以指定branch,如:master
可見查找出來的log是類似棧的結(jié)構(gòu)


git reflog master

命令7:git stash 存儲(chǔ)

在代碼寫了一部分后,而這時(shí)想要切換到另一個(gè)分支做其他事情
又不想因?yàn)檫^會(huì)兒回到這一點(diǎn)而做了一半的工作創(chuàng)建一次提交
這種場景下就可以使用git stash 命令

git stash的意思是暫存,可以把我們工作目錄所有的未提交的修改都保存起來
在.git\logs\refs目錄下有個(gè)stash文件,可以看到
如果我們多次暫存,可以用命令查看記錄
git stash save "message" 可以帶上message
git stash apply 可以應(yīng)用最新的stash
git stash apply stash@{2}來應(yīng)用指定的stash
git stash drop移除指定的stash
git stash pop應(yīng)用后再刪除
git stash list查看stash list

git stash list

命令8: git fsck --full

顯示出所有沒有被其他對象指向的對象,數(shù)據(jù)恢復(fù)的時(shí)候可能用到

Git HEAD ,master, branch解釋

push的本質(zhì)

merge的本質(zhì)


Git常用命令
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容