修改提交說明
- git commit --amend
修改最新提交的提交說明 - git rebase -i <commit-id>
修改某個(gè)歷史提交的提交說明
后悔
如果提交了不應(yīng)該提交的文件秉颗,想要在服務(wù)器中將文件刪除
git rm --cached <file>
git commit --amend
如果是歷史版本搔弄,那么就把第二條更改為 git rebase -i <commit-id>在git add 之后抄肖,還沒有進(jìn)行g(shù)it commit 规丽,希望取消這一次git add,使用git reset HEAD <file>
關(guān)于git add操作
- git add -u將所有修改過的文件加入暫存區(qū)
- git add -A 將本地刪除文件和新增文件都登記到提交暫存區(qū)
- 一個(gè)修改后的文件被登記到提交暫存區(qū)后挺狰,可以繼續(xù)修改,繼續(xù)修改的內(nèi)容不會(huì)被提交蝴光,除非對(duì)此文件再執(zhí)行一次git add命令。
關(guān)于git checkout操作
用法一:git checkout [-q] [<commit>] [--] <paths> ...
用法二:git checkout [<branch>]
用法三:git checkout [-m] [[-b] --orphan <new_branch>] [<start_point>]
第一種用法的<commit>是可選項(xiàng)雾家,如果省略則相當(dāng)于從暫存區(qū)(index)進(jìn)行檢出。所以盏檐,檢出命令主要是覆蓋工作區(qū)(如果<commit>不省略歇式,也會(huì)替換暫存區(qū)中相應(yīng)的文件)
第一種用法不會(huì)改變HEAD頭指針,主要是用于制定版本的文件覆蓋工作區(qū)中對(duì)應(yīng)的文件胡野,如果省略<commit>,則會(huì)用暫存區(qū)的文件覆蓋工作區(qū)的文件材失,否則用指定提交中的文件覆蓋暫存區(qū)和工作區(qū)中對(duì)應(yīng)的文件。
第二種用法則會(huì)改變HEAD頭指針硫豆。之所以后面的參數(shù)寫作<branch>龙巨,是因?yàn)橹挥蠬EAD切換到一個(gè)分支才可以對(duì)提交進(jìn)行跟蹤,否則仍然會(huì)進(jìn)入“分離頭指針”的狀態(tài)熊响。在“分離頭指針”狀態(tài)下的提交不能被引用關(guān)聯(lián)到旨别,從而可能丟失。所以用法二最主要的作用就是切換到分支汗茄。如果省略<branch>則相當(dāng)于對(duì)工作區(qū)進(jìn)行狀態(tài)檢查秸弛。
第三種用法主要是創(chuàng)建和切換到新的分支(<new_branch>),新的分支從<start_point>指的提交開始創(chuàng)建洪碳。新分支和我們熟悉的master分支沒有什么實(shí)質(zhì)的不同递览,都是在refs/heads命名空間下的引用。
刪除文件
- rm <文件名> 在本地刪除一個(gè)文件,然后使用 git ls-files 可以查看到在暫存區(qū)(版本庫)中的文件仍然存在瞳腌,并沒有刪除绞铃。此時(shí)使用git checkout -- <file>可以讓文件在工作區(qū)重現(xiàn)。
- 在rm <文件名>之后嫂侍,使用git rm <文件名> 刪除就被加入到了暫存區(qū)儿捧。這時(shí)候執(zhí)行提交操作,就從真正意義上執(zhí)行了文件刪除挑宠。不過不要擔(dān)心纯命,文件只是在版本庫的最新提交中被刪除了,在歷史提交中依然存在痹栖,通過git ls-files --with-tree=HEAD^可以發(fā)現(xiàn)該文件,使用git cat-file -p HEAD^:<file>可以查看在歷史版本中尚在的刪除文件的內(nèi)容瞭空。 比如刪除了a.txt文件揪阿,那么調(diào)用 git cat-file -p HEAD~1:a.txt > a.txt 或者git show HEAD~1:a.txt > a.txt 或者 git checkout HEAD~1 -- a.txt都可以把文件從版本庫恢復(fù)到工作區(qū),緩沖區(qū)中并沒有恢復(fù)該文件咆畏。
關(guān)于git reset命令
- git reset [-q] [<commit>] [--] <paths> 不會(huì)重置引用南捂,不會(huì)改變工作區(qū),而是用指定提交狀態(tài)<commit>下的文件<paths>替換掉暫存區(qū)中的文件旧找。例如命令git reset HEAD <paths>相當(dāng)于取消之前執(zhí)行的git add <paths>命令時(shí)改變的暫存區(qū)
- git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>] 不使用<paths>的用法則會(huì)重置引用溺健。根據(jù)不同的選項(xiàng),可以對(duì)暫存區(qū)或者工作區(qū)進(jìn)行重置
雜七雜八的命令
git stash 保存工作進(jìn)度
然后git checkout <new_branch>就可以切換到新的分支中了
當(dāng)新的工作分支修改完畢之后钮蛛,再切換回當(dāng)前分支 git checkout <original_branch>
再調(diào)用git stash pop恢復(fù)之前保存的工作進(jìn)度git log --stat查看每次提交的文件變更統(tǒng)計(jì)
git diff查看兩個(gè)文件的差異
git reset HEAD 鞭缭,暫存區(qū)的目錄樹會(huì)被版本庫master分支所指向的目錄樹替換剖膳,但是工作區(qū)的代碼沒有改變
git rm --cached <file> ,直接從暫存區(qū)刪除文件岭辣,工作區(qū)不改變
git ls-tree -l HEAD 查看版本庫中的目錄樹
git ls-filles -s 顯式暫存區(qū)的目錄樹
git clean -fd 清除當(dāng)前工作區(qū)中沒有加入版本庫的文件和目錄
幫助理解的圖文
- git reset HEAD ,暫存區(qū)的目錄樹會(huì)被版本庫master分支所指向的目錄樹替換沦童,但是工作區(qū)的代碼沒有改變
- git rm --cached <file> 仑濒,直接從暫存區(qū)刪除文件,工作區(qū)不改變
- git checkout . 或者git checkout -- <file> 偷遗,用暫存區(qū)全部的文件或者制定的文件替換工作區(qū)的文件墩瞳,也就是說,工作區(qū)中還沒有被添加到暫存區(qū)的改動(dòng)都會(huì)被清除
- git checkout HEAD . 或者git check out HEAD <file> 命令氏豌,會(huì)用HEAD 指向的master分支中的全部或者部分文件替換暫存區(qū)和工作區(qū)的文件喉酌,也就是說,工作區(qū)和暫存區(qū)中所有未提交的改動(dòng)都會(huì)被清除