Git中級用戶的25個(gè)提示

本文轉(zhuǎn)載自圖靈社區(qū)用戶青年的翻譯文章喳整。

我使用 Git 大約已經(jīng)有18個(gè)月時(shí)間育叁,自認(rèn)為能很好地駕馭它了天通。但是當(dāng)我們請到 GitHub 的 Scott Chacon 來到 LVS 公司(一個(gè)博彩/游戲軟件供應(yīng)商/開發(fā)商)做專場培訓(xùn)時(shí)莫瞬,我在第一天就學(xué)到了大量的東西雄卷。

由于有些人總是對使用 Git 自我感覺良好搓蚪,因此,我想分享一些我從社區(qū)獲取到的 Git 精品丁鹉,這樣就可能會(huì)幫助那些人無需浪費(fèi)大量研究時(shí)間而直接找到答案妒潭。

基本提示


1. 安裝之后第一步

安裝 Git 之后,你要做的第一件事情就是去配置你的名字和郵箱揣钦,因?yàn)槊恳淮翁峤欢夹枰@些信息:

$ git config --global user.name "Some One"

$ git config --global user.email "someone@gmail.com"

2. Git 是以指針為基礎(chǔ)

存儲(chǔ)在 git 中的所有東西都包含在一個(gè)文件中雳灾。當(dāng)你提交的時(shí)候,git 會(huì)創(chuàng)建一個(gè)包含提交消息和相關(guān)數(shù)據(jù)的文件(名稱冯凹、郵件谎亩、日期/時(shí)間、上一次提交等等)宇姚,并將其鏈接到一個(gè)樹形文件匈庭。樹形文件包含一個(gè)對象列表或者其它樹。對象或二進(jìn)制大數(shù)據(jù)對象(BLOB)是提交的真正內(nèi)容(一個(gè)文件浑劳,如果你愿意阱持,雖然文件名沒有存儲(chǔ)在對象中,但會(huì)存儲(chǔ)在樹中)魔熏。所有這些文件都以對象的 SHA-1 哈希為文件名進(jìn)行存儲(chǔ)衷咽。

分支和標(biāo)簽只是一些文件,這些文件包含(基本上)一個(gè)指向提交的 SHA-1 哈希值蒜绽。使用這些引用在靈活性和速度上均有大幅提升镶骗,創(chuàng)建一個(gè)新的分支就和創(chuàng)建一個(gè)文件一樣簡單,只是這個(gè)文件帶有分支名稱和一個(gè)包含指向提交(你從這個(gè)提交建立分支)的SHA-1哈希值躲雅。當(dāng)然鼎姊,當(dāng)你使用 Git 命令行工具(或一個(gè)圖形用戶界面)時(shí),你永遠(yuǎn)也不會(huì)這么做吏夯,但它就是這么簡單。

你可能已經(jīng)聽說過對 HEAD 的引用即横。它只是一個(gè)包含 SHA-1 引用的文件噪生,這個(gè)引用指向你當(dāng)前的提交。如果你正在解決一個(gè)合并沖突問題东囚,查看一下 HEAD跺嗽,你會(huì)發(fā)現(xiàn),它與一個(gè)特定的分支或分支上的特定點(diǎn)無關(guān),只和你現(xiàn)在的位置有關(guān)桨嫁。

所有的分支指針保存在 .git/refs/heads 目錄下植兰,HEAD 在 .git/HEAD 目錄下,標(biāo)簽在 .git/refs/tags 目錄下 - 你可以隨意看看璃吧。

3. 兩個(gè) Parents - 當(dāng)然楣导!

當(dāng)在日志文件中查看一個(gè)合并提交的消息時(shí),你會(huì)看到兩個(gè) parents(與正常提交相比)畜挨。第一個(gè)parent 是你所在的分支筒繁,第二個(gè) parents 是你并入的分支。

4. 合并沖突

到目前為止巴元,我確信你一定有一個(gè)合并沖突需要解決毡咏。通常情況下,通過編輯該文件逮刨,刪除文件中的<<<<, ====, >>>>標(biāo)記呕缭,然后保存你需要保留的代碼就可以了。有時(shí)候修己,在任何變更之前查看代碼都是一個(gè)值得推薦的做法恢总,比如,在你對兩個(gè)有沖突的分支采取行動(dòng)之前箩退。這是又一個(gè)命令:

$ git diff --merge

diff --cc dummy.rb

index 5175dde,0c65895..4a00477

--- a/dummy.rb

+++ b/dummy.rb

@@@ -1,5 -1,5 +1,5 @@@

class MyFoo

def say

-? ? puts "Bonjour"

-? ? puts "Hello world"

++? ? puts "Annyong Haseyo"

end

end

如果文件是二進(jìn)制的离熏,文件比較就不是那么容易了...你通常要做的是嘗試每個(gè)版本的二進(jìn)制文件,并決定使用哪一個(gè)(或者在二進(jìn)制文件編輯器手動(dòng)復(fù)制部分內(nèi)容)戴涝。從一個(gè)特定分支下 pull 一個(gè)文件副本(如果你要合并主分支和分支132的話):

$ git checkout master flash/foo.fla # or...

$ git checkout feature132 flash/foo.fla

$ # Then...

$ git add flash/foo.fla

另一種方法是從 git 中查看這個(gè)文件 - 你能夠以其他文件名的方式進(jìn)行查看滋戳,然后將正確的文件(當(dāng)你確定它是哪一個(gè)時(shí))復(fù)制到正常的文件名中:

$ git show master:flash/foo.fla > master-foo.fla

$ git show feature132:flash/foo.fla > feature132-foo.fla

$ # Check out master-foo.fla and feature132-foo.fla

$ # Let's say we decide that feature132's is correct

$ rm flash/foo.fla

$ mv feature132-foo.fla flash/foo.fla

$ rm master-foo.fla

$ git add flash/foo.fla

更新:感謝 Carl 在早先的的博客評論中給與的提醒,你實(shí)際上能使用 “git checkout —ours flash/foo.fla” 和 “git checkout —theirs flash/foo.fla” 檢出一個(gè)特定的版本而不需要記住你要合并到哪一個(gè)分支啥刻。我個(gè)人更喜歡更明確些奸鸯,但是你可以隨便選擇...

在解決了合并沖突問題之后(就像我上面所做的那樣),請記得將這個(gè)文件添加給索引可帽。

服務(wù)器娄涩、分支和標(biāo)簽


5. 遠(yuǎn)程服務(wù)器

Git 最強(qiáng)大的功能之一是可以有一個(gè)以上的遠(yuǎn)程服務(wù)器(另一個(gè)事實(shí),你總是可以運(yùn)行一個(gè)本地倉庫)映跟。你不一定總是需要寫訪問權(quán)限蓄拣,你可以從多個(gè)服務(wù)器中讀取(用于合并)努隙,然后寫到另一個(gè)服務(wù)器中球恤。添加一個(gè)遠(yuǎn)程服務(wù)器很簡單:

$ git remote add john git@github.com:johnsomeone/someproject.git

如果你想查看遠(yuǎn)程服務(wù)器的相關(guān)信息,你可以這樣做:

# shows URLs of each remote server

$ git remote -v

# gives more details about each

$ git remote show name

你可以查看本地分支和遠(yuǎn)程分支之間的差別:

$ git diff master..john/master

你也能查看不在遠(yuǎn)程分支上的 HEAD 的變化:

$ git log remote/branch..

# Note: no final refspec after ..

6. 標(biāo)簽

在 Git 中存在兩種類型的標(biāo)簽 - 一個(gè)輕量級標(biāo)簽和一個(gè)注解標(biāo)簽荸镊。記著第二個(gè)提示中說過 Git 是基于指針的咽斧,二者的區(qū)別很簡單堪置。一個(gè)輕量級標(biāo)簽無非是一個(gè)指向提交的具名指針。你可以改變它并指向另一個(gè)提交张惹。一個(gè)注解標(biāo)簽是一個(gè)指向標(biāo)簽對象的具名指針舀锨,這個(gè)標(biāo)簽對象擁有自己的消息和歷史。如果有需要宛逗,標(biāo)簽對象的消息可以采用 GPG 加密簽名坎匿。

創(chuàng)建兩種類型的標(biāo)簽其實(shí)很容易(只是一個(gè)命令行選項(xiàng)的差異)

$ git tag to-be-tested

$ git tag -a v1.1.0 # Prompts for a tag message

7. 創(chuàng)建分支

在 Git 中創(chuàng)建分支非常容易(閃電般的速度,因?yàn)樗鼉H僅需要?jiǎng)?chuàng)建一個(gè)不到100字節(jié)的文件)拧额。創(chuàng)建一個(gè)新分支并切換過去的通用寫法是:

$ git branch feature132

$ git checkout feature132

當(dāng)然碑诉,如果你知道你要馬上切換過去,你可以使用一條命令就能做到:

$ git checkout -b feature132

如果你要重命名一個(gè)本地分支侥锦,同樣是件容易的事(長命令方式用來顯示具體執(zhí)行過程):

$ git checkout -b twitter-experiment feature132

$ git branch -d feature132

更新:或者你(就像 Brian Palmer 在博客文章評論中指出的那樣)只使用 “git branch” 和 -m 選項(xiàng)就可以一步到位:

$ git branch -m twitter-experiment

$ git branch -m feature132 twitter-experiment

8. 合并分支

在將來某個(gè)時(shí)候进栽,你想要合并你的變更。有兩種方式可以實(shí)現(xiàn):

$ git checkout master

$ git merge feature83 # Or...

$ git rebase feature83

merge 和 rebase 的區(qū)別在于恭垦,merge 試圖解決變更而且創(chuàng)建一個(gè)融合后的新提交快毛,而 rebase 則試圖把自你上次在其他分支上的變化,在另一個(gè)分支的 HAED 上重現(xiàn)番挺。但是唠帝,在你向遠(yuǎn)程服務(wù)器推送一個(gè)分支之后,不要進(jìn)行 rebase 操作 - 這會(huì)引發(fā)混淆/問題玄柏。

如果你不能確定哪些分支仍然有獨(dú)立的工作在進(jìn)行 - 以便你能知道你需要合并哪一個(gè)分支以及刪除哪些分支襟衰,git branch 命令有兩個(gè)選項(xiàng)可以幫助實(shí)現(xiàn)這一點(diǎn):

# Shows branches that are all merged in to your current branch

$ git branch --merged

# Shows branches that are not merged in to your current branch

$ git branch --no-merged

9. 遠(yuǎn)程分支

如果你有一個(gè)本地分支,你想讓它出現(xiàn)在遠(yuǎn)程服務(wù)器上粪摘,你可以使用一個(gè)推送命令:

$ git push origin twitter-experiment:refs/heads/twitter-experiment

# Where origin is our server name and twitter-experiment is the branch

更新:感謝 Erlend 在博客文章評論中提到的 - 這實(shí)際上和 git push origin twitter-experiment 達(dá)到的效果的一樣瀑晒,但是通過使用全部語法,你能看到你實(shí)際上在兩端使用了不同的名字(你的本地名字可能是 add-ssl-support徘意,而遠(yuǎn)程名字可能是 issue-1723)苔悦。

如果你想刪除一個(gè)遠(yuǎn)程服務(wù)器上的分支(請注意分支名稱之前的冒號):

$ git push origin :twitter-experiment

如果你想顯示所有遠(yuǎn)程分支的狀態(tài),你能像這樣查看它們:

$ git remote show origin

這可能會(huì)列出一些服務(wù)器上曾經(jīng)有過但現(xiàn)在已不存在的分支椎咧。如果碰到這種情況玖详,你可以很輕松地使用如下命令從本地檢出并將其刪除:

$ git remote prune

最后,如果你有一個(gè)遠(yuǎn)程分支勤讽,你想在本地進(jìn)行跟蹤它蟋座,通常的做法是:

$ git branch --track myfeature origin/myfeature

$ git checkout myfeature

然而,如果你使用 -b 標(biāo)識(shí)符去檢出的話脚牍,新版的 Git 會(huì)自動(dòng)建立跟蹤:

$ git checkout -b myfeature origin/myfeature

在臨時(shí)存放區(qū)向臀、索引和文件系統(tǒng)中保存內(nèi)容


10. 臨時(shí)存放(Stashing)

在Git中,你可以把當(dāng)前的工作狀態(tài)儲(chǔ)存在一個(gè)臨時(shí)的存儲(chǔ)區(qū)域堆棧莫矗,然后重新加以利用飒硅。簡單的案例如下:

$ git stash # Do something...

$ git stash pop

很多人推薦使用 git stash apply 來代替 “pop”,然而如果你真這么做的話作谚,你最終得到一個(gè)長長的毫無用處的儲(chǔ)藏清單三娩。如果對它進(jìn)行清理,“pop” 只會(huì)把它從堆棧中刪除妹懒。如果你已經(jīng)使用了 git stash apply 雀监,你可以使用如下命令從堆棧中刪除最后一項(xiàng):

$ git stash drop

Git 會(huì)基于當(dāng)前的提交消息自動(dòng)創(chuàng)建一個(gè)注釋信息。如果你更喜歡使用一個(gè)自定義的消息(因?yàn)樗赡芎椭暗奶峤粺o關(guān)):

$ git stash save "My stash message"

如果你想從你的列表中(不必是最后一個(gè))對一個(gè)特定的 stash 加以利用眨唬,你可以列出它們并像這樣來使用它:

$ git stash list

stash@{0}: On master: Changed to German

stash@{1}: On master: Language is now Italian

$ git stash apply stash@{1}

11. 交互式添加

在 Subversion 的世界里会前,你修改文件然后只是提交有變化的文件。而在 Git 的世界里匾竿,你在提交某些文件甚至某些補(bǔ)丁上有更多的控制權(quán)瓦宜。為了提交某些文件或者文件的某些部分,你必須進(jìn)入交互模式岭妖。

$ git add -i

staged? ? unstaged path

*** Commands ***

1: status? ? ? 2: update? 3: revert? 4: add untracked

5: patch? ? ? 6: diff? ? 7: quit? ? 8: help

What now>

這會(huì)讓你進(jìn)入一個(gè)基于交互式命令的菜單模式临庇。你可以使用命令的數(shù)字符號或者加亮字符(如果你開啟顏色高亮顯示功能的話)進(jìn)入對應(yīng)模式,然后就是正常輸入文件數(shù)的問題了(你可以使用像1或1-4或2,4,7這樣的格式)昵慌。

如果你想進(jìn)入修補(bǔ)模式(交互模式下輸入‘p’或‘5’ )假夺,你也可以直接進(jìn)入那個(gè)模式:

$ git add -p

diff --git a/dummy.rb b/dummy.rb

index 4a00477..f856fb0 100644

--- a/dummy.rb

+++ b/dummy.rb

@@ -1,5 +1,5 @@

class MyFoo

def say

-? ? puts "Annyong Haseyo"

+? ? puts "Guten Tag"

end

end

Stage this hunk [y,n,q,a,d,/,e,?]?

如你所見,在底部你得到一系列選項(xiàng)為選擇去添加文件改變的部分斋攀,這個(gè)文件的所有變化等等已卷。使用‘?’ 命令可以了解選不同選項(xiàng)的解釋。

12. 存儲(chǔ)/從文件系統(tǒng)檢索

一些項(xiàng)目(例如 Git 項(xiàng)目自身)直接在 Git 文件系統(tǒng)中存儲(chǔ)額外的文件而不必是檢入文件淳蔼。

讓我們開始在 Git 中存儲(chǔ)一個(gè)任意文件:

$ echo "Foo" | git hash-object -w --stdin

51fc03a9bb365fae74fd2bf66517b30bf48020cb

此時(shí)侧蘸,該文件對象已在數(shù)據(jù)庫中,但是如果你不設(shè)置(一些東西)指向那個(gè)文件對象肖方,它將被作為垃圾而回收闺魏。最簡單的方法是標(biāo)記它:

$ git tag myfile 51fc03a9bb365fae74fd2bf66517b30bf48020cb

既然在這里我們已經(jīng)標(biāo)記了 myfile。當(dāng)我們需要獲取該文件時(shí)俯画,我們可以這樣做:

$ git cat-file blob myfile

程序員可能經(jīng)常用到的工具文件(密碼析桥、GPG 密鑰、等等)艰垂,不需要每次都檢出到磁盤上(特別是在生產(chǎn)環(huán)境下)泡仗,這種方法非常有效。

日志記錄


13. 查看日志

如果你不使用‘git log’查看最近提交歷史的話猜憎,你就不能長時(shí)間順利地使用 Git娩怎。但是,也存在一些如何更好使用它的建議胰柑。例如截亦,你可以查看每次提交中改變的一個(gè)補(bǔ)杜滥唷:

$ git log -p

或者你可以只是查看一個(gè)哪些文件有所更改的概述:

$ git log --stat

你可以在一行中設(shè)置一個(gè)不錯(cuò)的別名,用于顯示簡短的提交和漂亮的帶有消息的分支圖(像 gitk崩瓤,但在命令行上):

$ git config --global alias.lol "log --pretty=oneline --abbrev-commit --graph --decorate"

$ git lol

* 4d2409a (master) Oops, meant that to be in Korean

* 169b845 Hello world

14. 檢索日志

如果你想在日志中查詢一個(gè)特定作者袍啡,你可以這樣指定:

$ git log --author=Andy

更新:感謝 Johannes 的評論,我終于化解了一部分困惑却桶。

或者如果你有一個(gè)搜索詞出現(xiàn)在提交消息中:

$ git log --grep="Something in the message"

還有一個(gè)功能更強(qiáng)大的叫 pickaxe 的命令境输,它可以查找條目用來添加或刪除一個(gè)特定的內(nèi)容(也就是,當(dāng)它第一次出現(xiàn)或被刪除的時(shí)候)颖系。這樣你就可以知道何時(shí)增加了一行(但是如果那一行中的字符隨后被改變嗅剖,你將無從得知):

$ git log -S "TODO: Check for admin status"

如果你改變一個(gè)特定的文件會(huì)怎么樣呢,例如 lib/foo.rb

$ git log lib/foo.rb

比如說你有一個(gè) feature/132 分支和一個(gè) feature/145 分支嘁扼,你想查看在這些分支但卻不在主分支上的提交(備注:^ 代表非):

$ git log feature/132 feature/145 ^master

你也可以使用 ActiveSupport 風(fēng)格的日期縮小日期范圍:

$ git log --since=2.months.ago --until=1.day.ago

它默認(rèn)使用 OR 模式來組合查詢信粮,但是你也可以很輕松地改為 AND 模式(如果你的查詢項(xiàng)不止一個(gè)的話)

$ git log --since=2.months.ago --until=1.day.ago --author=andy -S "something" --all-match

15. 選擇查看/修改的版本

當(dāng)引用一個(gè)修訂版本時(shí),你有許多選項(xiàng)可以選擇趁啸,當(dāng)然蒋院,這取決于你對此功能的了解程度:

$ git show 12a86bc38 # By revision

$ git show v1.0.1 # By tag

$ git show feature132 # By branch name

$ git show 12a86bc38^ # Parent of a commit

$ git show 12a86bc38~2 # Grandparent of a commit

$ git show feature132@{yesterday} # Time relative

$ git show feature132@{2.hours.ago} # Time relative

請注意,和上一節(jié)有所不同莲绰,在行尾的脫字符表示提交的 parent - 行首的脫字符則表示不在這個(gè)分支上欺旧。

16. 選擇一個(gè)范圍

最簡單的方法是這樣來用:

$ git log origin/master..new

# [old]..[new] - everything you haven't pushed yet

你也可以刪除 [new],這將使用當(dāng)前的 HEAD蛤签。

時(shí)間回退和錯(cuò)誤修復(fù)


17. 重置更改

如果你還沒有提交一個(gè)更改辞友,你可以很容易地重置它:

$ git reset HEAD lib/foo.rb

通常使用‘unstage’作為別名比較好,因?yàn)樗皇悄敲达@而易見震肮。

$ git config --global alias.unstage "reset HEAD"

$ git unstage lib/foo.rb

如果你已經(jīng)提交了文件称龙,你可以做兩件事情 - 如果是最后一次提交,你可以這樣來修改:

$ git commit --amend

這將回滾到最后一次提交戳晌,讓你的工作副本回到變化存儲(chǔ)在暫存區(qū)的狀態(tài)鲫尊,你可以編輯提交消息準(zhǔn)備下一次提交。

如果你的提交不止一次沦偎,并且只想完全回滾它們疫向,你可以重置分支回到之前的時(shí)間點(diǎn)。

$ git checkout feature132

$ git reset --hard HEAD~2

如果你真的想把分支指向一個(gè)完全不同的 SHA-1(也許你把一個(gè)分支的 HEAD 指向另一個(gè)分支豪嚎,或者進(jìn)一步提交)搔驼,你可以按照以下方式去做:

$ git checkout FOO

$ git reset --hard SHA

實(shí)際上還有一種更便捷的方式(因?yàn)樗粫?huì)先將你的工作副本變回最初 FOO 狀態(tài),然后再指向 SHA):

$ git update-ref refs/heads/FOO SHA

18. 提交到錯(cuò)誤的分支

好吧侈询,讓我們假設(shè)你提交到主分支舌涨,但應(yīng)該已經(jīng)創(chuàng)建了一個(gè)叫做 experimental 的主題分支。為了移除這些變化扔字,你可以在當(dāng)前點(diǎn)創(chuàng)建一個(gè)分支囊嘉,回退 HEAD温技,然后檢出新的分支:

$ git branch experimental? # Creates a pointer to the current master state

$ git reset --hard master~3 # Moves the master branch pointer back to 3 revisions ago

$ git checkout experimental

如果你已經(jīng)在一個(gè)分支的一個(gè)分支的一個(gè)分支等上面做了些變更,這將會(huì)更復(fù)雜扭粱。然后你需要做的就是在這個(gè)分支上將其變更 rebase 到另一個(gè)的地方:

$ git branch newtopic STARTPOINT

$ git rebase oldtopic --onto newtopic

19. 交互式 rebasing

這是一個(gè)很酷的特性荒揣,我之前已看過演示,但當(dāng)時(shí)沒有真正搞明白焊刹,現(xiàn)在來看其實(shí)很簡單。比方說恳蹲,你已做了3次提交虐块,但是你想對它們進(jìn)行重新排序或者編輯(或者合并它們):

$ git rebase -i master~3

然后你將編輯器打開。你所要做的就是修改 “pick/squash/edit 的指令來進(jìn)行如何提交嘉蕾,然后保存/退出贺奠。在編輯之后,你可以使用 git rebase —continue 讓你的每一個(gè)指令一個(gè)一個(gè)進(jìn)行错忱。

如果你選擇編輯一個(gè)文件儡率,這會(huì)讓你停留在你提交時(shí)的狀態(tài),因此你需要使用 git commit —amend 對它進(jìn)行編輯以清。

備注:在 REBASE 過程中不要進(jìn)行提交工作 - 只能添加然后使用 —continue, —skip or —abort 選項(xiàng)河绽。

20. 清理

如果你已經(jīng)提交了一些內(nèi)容到你的分支中(也許你是從SVN中的舊代碼庫導(dǎo)入的)钓简,你想從歷史中刪除掉所有的已提交內(nèi)容:

$ git filter-branch --tree-filter 'rm -f *.class' HEAD

如果你已經(jīng)向遠(yuǎn)程服務(wù)器推送過代碼,但自那之后提交的都是一些垃圾,在推送之前你可以在本地系統(tǒng)上執(zhí)行這樣的操作:

$ git filter-branch --tree-filter 'rm -f *.class' origin/master..HEAD

各種各樣的提示


21. 之前你看過的引用

如果你知道你之前已經(jīng)查看過一個(gè) SHA-1笋额,但是你已經(jīng)做了一些重置/回退工作,你可以使用 reflog 命令去查看你最近看過的 SHA-1:

$ git reflog

$ git log -g # Same as above, but shows in 'log' format

22. 分支命名

一個(gè)可愛的小提示 - 請記住菇夸,分支的名字并不局限于 a-z 和 0-9 這些字符惰拱。名字中可以使用 / 和 . 來偽裝命名空間或者版本號,例如:

$ # Generate a changelog of Release 132

$ git shortlog release/132 ^release/131

$ # Tag this as v1.0.1

$ git tag v1.0.1 release/132

23. 尋找誰是始作俑者

尋找誰更改了一個(gè)文件中的一行代碼經(jīng)常會(huì)用到凛虽。簡單命令如下:

$ git blame FILE

有時(shí)更改來自于前一個(gè)文件(如果你已經(jīng)合并了兩個(gè)文件死遭,或者你已經(jīng)移動(dòng)了一個(gè)函數(shù)),因此你可以這樣用:

$ # shows which file names the content came from

$ git blame -C FILE

有時(shí)通過向前或向后點(diǎn)擊來進(jìn)行變化跟蹤凯旋,這是很好的方法呀潭。有一個(gè)內(nèi)置的 GUI 程序?qū)iT為此設(shè)計(jì):

$ git gui blame FILE

24. 數(shù)據(jù)庫維護(hù)

Git 通常不需要大量維護(hù),它基本上可以自我維護(hù)至非。然而蜗侈,你可以使用如下命令查看數(shù)據(jù)庫統(tǒng)計(jì)信息:

$ git count-objects -v

如果數(shù)值很高,你可以選擇使用垃圾回收你的重復(fù)內(nèi)容睡蟋。這不會(huì)影響推送或者其它用戶踏幻,但卻可以讓你的命令運(yùn)行更快且占用更少空間:

$ git gc

經(jīng)常運(yùn)行一致性檢查也是值得推薦的做法:

$ git fsck --full

你也可以在行尾添加一個(gè) —auto 參數(shù)(如果你頻繁運(yùn)行它,或者在你的服務(wù)器上每日從 crontab 中運(yùn)行它)戳杀,如果統(tǒng)計(jì)數(shù)據(jù)表明必須進(jìn)行要進(jìn)行一致性檢查该面,只要 fsck 命令就行夭苗。

如果檢查 “dangling” 或 “unreachable” 的結(jié)果一切正常,這經(jīng)常是由于回退 HEAD 或 rebasing的結(jié)果隔缀。如果檢查“missing” 或 “sha1 mismatch” 出了問題...尋求專業(yè)幫助吧题造!

25. 恢復(fù)一個(gè)丟失的分支

如果你使用 -D 選項(xiàng)刪除了一個(gè)分支 experimental,你可以重新創(chuàng)建它:

$ git branch experimental SHA1_OF_HASH

你可以使用 git reflog 來發(fā)現(xiàn)一個(gè) SHA-1 哈希值猾瘸,如果你近期訪問過它的話界赔。

另一種方法是使用 git fsck —lost-found。一個(gè)懸空的提交就是一個(gè) lost HEAD(它只會(huì)是一個(gè)已刪除分支的 HEAD牵触,因?yàn)楫?dāng)一個(gè) HEAD^ 被 HEAD 引用時(shí)淮悼,它就沒有懸空)

作者: Andy Jeffries?,Ruby on Rails 開發(fā)者 & 跆拳道教練揽思,生活在英國倫敦袜腥。

原文: 25 Tips for Intermediate Git Users?(2009)

感謝: Jodoo? 幫助審閱并完成校對。

P.S. 如果您喜歡這篇文章并且希望學(xué)習(xí)編程技術(shù)的話钉汗,請關(guān)注一下 復(fù)唧唧?羹令。

閱讀原文?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市损痰,隨后出現(xiàn)的幾起案子福侈,更是在濱河造成了極大的恐慌,老刑警劉巖卢未,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癌刽,死亡現(xiàn)場離奇詭異,居然都是意外死亡尝丐,警方通過查閱死者的電腦和手機(jī)显拜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爹袁,“玉大人远荠,你說我怎么就攤上這事∈ⅲ” “怎么了譬淳?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盹兢。 經(jīng)常有香客問我邻梆,道長,這世上最難降的妖魔是什么绎秒? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任浦妄,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剂娄。我一直安慰自己蠢涝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布阅懦。 她就那樣靜靜地躺著和二,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耳胎。 梳的紋絲不亂的頭發(fā)上惯吕,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機(jī)與錄音怕午,去河邊找鬼废登。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诗轻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揭北,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼扳炬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搔体?” 一聲冷哼從身側(cè)響起恨樟,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疚俱,沒想到半個(gè)月后劝术,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呆奕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年养晋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梁钾。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绳泉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姆泻,到底是詐尸還是另有隱情零酪,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布拇勃,位于F島的核電站四苇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏方咆。R本人自食惡果不足惜月腋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罗售,春花似錦辜窑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至职恳,卻和暖如春所禀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背放钦。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工色徘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人操禀。 一個(gè)月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓褂策,卻偏偏與公主長得像,于是被迫代替她去往敵國和親颓屑。 傳聞我的和親對象是個(gè)殘疾皇子斤寂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 摘要:前面三篇博客側(cè)重介紹字符、編碼問題揪惦,通過這三篇博客各位博友對各種字符編碼有了一個(gè)初步的了解遍搞,要了解java的...
    亂蓬頭199302閱讀 567評論 0 0
  • 今天跟好友聊起來學(xué)日語,突然記起小時(shí)候一段經(jīng)歷器腋,覺得有點(diǎn)小溫馨溪猿。 九十年代初,印象里面太原還是個(gè)有點(diǎn)封閉但是風(fēng)氣頗...
    dolphin123閱讀 727評論 1 5
  • 許多小孩都很喜歡小動(dòng)物纫塌,我也不例外诊县。我小時(shí)候特喜歡小鳥,確切的說我現(xiàn)在也一樣喜歡措左,只是現(xiàn)在喜歡的方式與兒時(shí)的那不一...
    致遠(yuǎn)投資黃紹國閱讀 181評論 0 0
  • 今天是周六翎冲,我和黎叔一起床就出去放風(fēng)了,去哪里媳荒,崇明島抗悍。早就聽說過這個(gè)地方,崇明島地處長江口钳枕,是中國第三大...
    東風(fēng)壹號閱讀 655評論 0 0