




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
前 致謝 入 工作是 版本控 分布控 一個誤 合并....................................................................................................................................基本技 保存狀 撤 文 快速發(fā) 練 克隆周 封閉源 倉 推還是 項目分 終極備 分支巫 快速修 合 重組雜 管理分 臨時分 關(guān)于歷 我認 重寫歷 制造歷 Git個人經(jīng) 多人 我是誰 Git在SSH,HTTP 遠端分 多遠 我的喜 源碼發(fā) 提交變 揭開面 大象無 智 索 沒那么 附錄A:Git的缺 SHA1的弱 微軟 文件歷 初始克 空 初始提 接口怪 附錄B:本指南的翻 前Git[ ]堪稱版本控制 簡體中文[/~blynn/gi intl/zh_tw/]由+cconv-f -tUTF8-TW+轉(zhuǎn)換。~blynn/gitmagic/intl/deBenjaminBellee和ArminStebichArmin的 Rodrigues[ODT版 /]: 他的[http://純 [
紙質(zhì)書 [ 致謝DustinSallings、AlbertoBertogli、JamesCameron、DouglasLivingstone、MichaelBudde、RichardAlbury、Tarmigan、DerekMahar、FrodeAannevik、KeithRarick、AndySomervilleRalfRecker?yvindAHolmMiklosVajnaSébastienHinderer、ThomasMiedema、JoeMalin、和TylerBreisacher對本文檔正確性和優(yōu)化做出了貢獻。Fran?oisMarierDebian包,該Debian包起初由DanielBaumann創(chuàng)建。 為自由項目提供服務(wù)。第一個GitGit開發(fā)人員創(chuàng)建和維本指南在GNU通用公共協(xié)議版本3[]之下發(fā) $git $gitclone第1我將用類比方式來介紹版本控制的概念。更嚴謹?shù)慕忉寘⒁姲倏瓢姹拘抻喛刂茥l目[http://工作我從小就玩電腦游戲。相反,在長大后才開始使用版本控制系統(tǒng)。我并不特殊,并編寫代碼,或編輯文檔和玩游戲差不多。在你做出了很多進展之后,你最好保存一下。去做這但這將覆蓋老版本。就像那些學(xué)校里玩的老游戲,只有一個存檔:你確實可以保存,但你不能回到更老的狀態(tài)了。這真讓人掃興,因為那個狀態(tài)可能恰好保存了這個游戲特別有意思一關(guān),說不定哪天你想再玩一下呢。或者更糟糕的,你當前的保存是個必敗局,這樣你就不得不從頭版本在編輯的時候,如果想保留舊版本,你可以將文件“另存為”一個不同的文件,或在保存之前將文件拷貝到別處。你可能壓縮這些文件以節(jié)省空間。這是一個初級的靠手工的版本控制方讓我們看看稍稍復(fù)雜的情況。比如你有很多放在一起的文件,比如項目源碼,或文件?,F(xiàn)在如你想保留舊版本,你不得不把整個存檔。手工保存多個版本很不方便,而且很快會耗在一些電腦游戲里,一個存檔真的包含在一個充滿文件的里。這些游戲為玩家了這些細節(jié),并提供一個方便易用的界面來管理該的不同版本。版本控制系統(tǒng)也沒有兩樣。兩者提供友好的界面,來管理里的東西。你可以頻繁保存,也可以之后加載任一保存。不像大多計算機游戲,版本控制系統(tǒng)通常精于節(jié)省空間。一般情況如果兩個版本間數(shù)文件的變更,每個文件的變更也不大,那就只差異的部分,而分布現(xiàn)在設(shè)想一個很難的游戲。太難打了,以至于世界各地很多骨灰級玩家決定組隊,他們游戲存檔以攻克它。Speedrun在過去,每個項目都使用中心式版本控制。某個服務(wù)器上放所有保存的游戲記錄。其他人就不用了。每個玩家在他們機器上最多保留幾個游戲記錄。當一個玩家想更新進度時候,他們需要把進度從主服務(wù)器下來,玩一會兒,保存并上載到主服務(wù)器以供其他人使用。假如一個玩家由于某種原因,想得到一個較舊版本的游戲進度怎么樣?或許當前保存的游戲是一個注定的敗局,因為在第三級忘記撿某個物品;他們希望能找到最近一個可以完成的游戲記錄。或者他們想比較兩個舊版本間的差異,來估算某個特定玩家干了多少活。查看舊版本的理由有很多,但檢查的辦法都是一樣的。他們必須去問中心服務(wù)器要那個舊版本新一代的版本控制系統(tǒng),Git就是其中之一,是分布式的,可以被認作廣義上的中心式系統(tǒng)。從主服務(wù)器時玩家會得到所有保存的記錄,而不僅是版。這看起來他們好像把中心服務(wù)最初的克隆操作可能比較費時,特別當有很長歷史的時,但從長遠看這是值得的。一個顯而易一個一個很常見的錯誤觀念是,分布式系統(tǒng)不適合需要中心倉庫的項目。這與事實并不相符。一般來說,一個中心版本控制系統(tǒng)能做的任何事,一個良好設(shè)計的分布式系統(tǒng)都能做得更好。網(wǎng)絡(luò)資源總要比本地資源耗費更費。不過我們應(yīng)該在稍后分析分布式方案的缺點,這樣人們才一個小項目或許只需要分布式系統(tǒng)提供的一小部分功能,但是,在項目很小的時候,應(yīng)該用規(guī)而且,你的項目的增長可能會超出你最初的預(yù)期。從一開始就使用Git好似帶著一把,盡管你很多時候只是用它來開開瓶蓋。某天你迫切需要一把改錐,你就會慶幸你所有的不單單合并假設(shè)Alice在文檔開頭插入一行,并且Bob在文檔末尾添加一行。他們都上傳了他們的改動。大多數(shù)系統(tǒng)將自動給出一個合理的處理方式:接受且合并他們的改動,這樣Alice和Bob兩人的改現(xiàn)在假設(shè)Alice和Bob對文件的同一行做了不同的改動。如果沒有人工參與的話,這個沖突是無法解決的。第二個人在上載文件時,會收到合并,要么用一個人的改動覆蓋另一個更復(fù)雜的情況也可能出現(xiàn)。版本控制系統(tǒng)自己處理相對簡單的情況,把的情況留給人來處第2本技與其一頭扎進Git保存 $git$gitadd$gitcommit-m"Myfirst$gitcommit-a-m"Another添加、刪除 你第一次運行g(shù)itadd命令時就已經(jīng)存在的文件。如果要添加新文件或子目$gitadd $gitrmkludge.h$gitrm-rgitmvmv$gitmvbug.c進階撤銷/重$gitcommit766f Author:Bob< Date:TueMar1401:59:262000-commit82f5ea346a2e Author:Alice< Date:ThuJan100:00:00Initial$gitreset--hard$gitcheckout 里時光旅行一樣,如果你這時編輯并提交的話,你將身處另一個現(xiàn)實里,因為你的動作與開始時相比是不同的。$gitcheckout --gitcheckout態(tài)。你現(xiàn)在打的所有游戲記錄會在你剛進入的、代表另一個真實的分支里。我們稍后論述。 $gitcheckout82f5some.file,這種形式的checkout會不聲不響地覆蓋文件。為意外發(fā)生,在運行任何checkout命令之前做提交,尤其在初學(xué)Git的時候。通常,任何時候你覺得對運行某個命令不放心,無論Git命令還是不是Git命令,就先運行一下gitcommit-a。$gitcheckout:/"Myfirst$gitcheckout撤$gitcommit-$gitrevert講撤銷給定哈希值的提交。本撤銷被記錄為一個新的提交,你可以通過運行g(shù)itlog來確認這一變更一些項目要求生成變更日志changelog[].生成一$gitlog>文$gitcloneclone到$git快速假設(shè)你寫了一個,想和他人。你可以只們從你的計算機,但如果此時你正在改進你的,試驗性質(zhì)的改動,他們了你的,他們可能由此陷入困境。當然,這就是發(fā)布周期存在的原因。開發(fā)人員可能頻繁進行項目修改,但他們只在他們覺得代碼用Git來完成這項,需要進入你的所在$git$gitadd$gitcommit-m"First$git 。這要假定他們有ssh權(quán)限。如果沒有,需要運行g(shù)itdaemon并告訴你的$git $gitcommit-a-m"Next $git 我們已經(jīng)做$git$gitdiff$gitdiff1b6d$gitwhatchanged--since="2weeks我也經(jīng)常用qgit[ 或者tig[ ],一個文本界面的東西,很慢的網(wǎng)絡(luò)狀況下也工作的很好。也可以安裝web服務(wù)器,運行g(shù)itinstaweb,就可以用任何瀏覽器瀏覽了。練比方A,B,C,D是四個連續(xù)的提交,其中B與A一樣,除了一些文件刪除了。我們想把這些刪$gitdiffBA|git$gitcheckoutAfoo.c$gitrevert第3隆周在較老一代的版本控制系統(tǒng)里,checkout是獲取文件的標準操作。一組特定保存狀態(tài) 件?;蛘哒f,你實際上把整個中心服務(wù)器做了個鏡像。凡是主倉庫上能做的事,你都能做。計算$git $gitcommit-$git 典型$git$gitadd$gitcommit-m"Initial $mkdir$cd$gitinit--$gitdaemondetach?$gitpushcentral.server/path/to/proj.gitHEAD$gitcommit-$git$gitcommit-$git為使用上面pull和push命令,開發(fā)必須有SSH權(quán)限。不過,通過鍵入以下命令,任何人都$gitclone本地git協(xié)議和HTTP類似:并無安全驗證,因此任何人都能拿到項目。因此,默認情況git協(xié)議封閉 可以通過git協(xié)議獲?。恢挥心切┯蠸SH權(quán)限的人才能看到。如果你所有的資源庫都是封閉倉之所以叫倉庫是因為其沒有工作;它只包含正常情況下隱藏在`.git`子下的文件。換句話說,它項目歷史,而且從不保存任何給定版本的快照。倉庫扮演的角色和中心版本控制系統(tǒng)心服務(wù)器的角色類似:你項目的中心。開發(fā)從其中克隆項目,撿入新近改動。典型地倉庫存在一個服務(wù)器上,該服務(wù)器除了分散數(shù)據(jù)外并不做啥。開發(fā)活動發(fā)生在克隆上,因此中心倉庫沒有工作也行。很多Git命令在倉庫上失敗,除非指定倉庫路徑到環(huán)境變量`GIT_DIR`,或者指定`--bare`選推還為什么我們介紹了push命令,而不是依賴熟悉的pull命令?首先,在倉庫上pull會失?。撼悄惚仨殹癴etch”,一個之后我們要討論令。但即使我們在中心服務(wù)器上保持一個正常的倉庫,拽些東西進去仍然很繁瑣。我們不得不登陸服務(wù)器先,給pull地址。會阻礙,并且首先如果我們沒有到服務(wù)器的s怎么辦呢?然而,除了這個案例,我們推進倉庫,因為當目標有工作時,困惑隨之而來。項目$gitclone$git終極會有很多散布在各處,篡改的冗余存檔嗎?如果你的項目有很多開發(fā),那干脆啥也別做了。你的每份代碼克隆是一個有效備份。不僅當前狀態(tài),還包括你項目整個歷史。感謝哈希加密算法,如果任何人的克隆被損壞,只要他們與其他的交互,這個克隆就會被修好。真正的偏執(zhí)狂應(yīng)該總是把HEAD最近20字節(jié)的SHA1不是把它。比如,把它發(fā)布到報紙上就不錯,因為對者而言,更改每份報紙是很難輕快多任$gitclone.Git使用硬和文件共享來盡可能安全地創(chuàng)建克隆,因此它一眨眼就完成了,因此你現(xiàn)在可以并行操作兩個沒有相互依賴的功能。例如,你可以編輯一個克隆,同時編譯另一個。感謝hardlinking[],本地克隆比簡單備份省時省地。現(xiàn)在你可以同時工作在兩個彼此獨立的特性上。比如,你可以在編譯一個克隆的時候編輯另一$gitpull/the/other/clone游擊 $git$gitadd$gitcommit-m"Initial$gitclone. $gitadd$gitcommit-m"Syncwitheveryone $gitcommit-a-m"Descriptionofmy$git 包含你的改動的文件。需倉庫自動化了上面的操作,并且也可以用作導(dǎo)出Git項目到Subversion倉庫[ /2008/05/export-git-project-to--code.html]的替代。Mercurial是一個類似的的版本控制系統(tǒng),幾乎可以和Git`hg-git`插件,一$git $hgclone不好意思,我沒注意GitGit而不是Mercurial使你偏愛Mercurial。使用Mercurial項目,通常一個自愿者一個平行的Git項目以適應(yīng)Git用戶,然而感謝`hg-git`插件,一個Git項目自動地適應(yīng)Mercurial用戶。 $git我們簡略提一下Bazaar,它畢竟是緊跟Git和Mercurial之后最流行的自由分布式版本控制系Bazaar有后來者的優(yōu)勢,它相對年輕些;它的設(shè)計者可以從前人的錯誤中學(xué)習(xí),并且躲過去翻歷史上犯過的錯誤。另外,它的開發(fā)人員對可移植性以及和與其它版本控制系統(tǒng)的互操作性也一個`bzr-git`插件讓Bazaar用戶在一定程度下可以工作在Git倉庫。`tailor`Bazaar倉庫到Git倉庫,并且可以遞增的方式做,要知道`bzr-fast-export`只是在轉(zhuǎn)換性情況下工作我偏愛Git的原我起先選擇Git是因為我聽說它能管理不可想象地不可管理的Linux內(nèi)核源碼。我從來沒覺得有離開的必要。Git已經(jīng)服侍的很好了,并且我也沒有被其瑕疵所困擾。因為我主要使用Linux,還有,我偏愛C程序和bash,以及諸如Python的可執(zhí)行可:較少依賴,并且我也沉迷我考慮過Git才能如何提高,甚至自己寫類似的工具,但只作為研究練練手。即使完成這個項目,自然地,你的需求和期望可能不同,并且你可能使用另一個系統(tǒng)會好些。盡管如此,使用Git你第4支巫問題:外部因素要求必須切換場景。在發(fā)布版本中突然蹦出個嚴重缺陷。某個特性完成的截至日期就要來臨。在項目關(guān)鍵部分可以提供幫助的一個開發(fā)正打算離職。所有情況迫你停下所打斷思維的連續(xù)性會使你的生產(chǎn)力大大降低,并且切換上下文也更麻煩,更大的損失。使用中心版本控制須從中心服務(wù)器一個新的工作拷貝。分布式系統(tǒng)的情況就好多了,因為但是克隆仍然需要拷貝整個工作,還有直到給定點的整個歷史記錄。盡管Git使用文件共享和硬減少了花費,項目文件自身還是必須在新的工作里重建。使用這個魔,里的文件突然從一個版本變到另一個。除了只是在歷史記錄里上跳下竄外,這個轉(zhuǎn)換還可以做。你的文件可以從上一個發(fā)布版變到實驗版本到當前開發(fā)版本到你鍵 鍵”),屏幕立即顯示一個電子表格或別的?那么 $echo"I'msmarterthanmyboss">$git$gitadd$gitcommit-m"Initial$gitcheckoutbboss?$echo"Mybossissmarterthanme">$gitcommit-a-m"Another$gitcheckoutmaster? $gitcheckoutboss?切到適合看的版骯臟的工比如你正在開發(fā)某個特性,并且由于某種原因,你需要回個版本,臨時加進幾行打印語句$gitcommit-$gitcheckout$gitcheckout$gitcheckout-b$gitcheckout我們面章節(jié)討論加載舊狀態(tài)的時候,曾經(jīng)接觸過這個命令。最終我們把故事說全:文件改變成請求的狀態(tài),但須離開主分支。從現(xiàn)在開始的任何提交都會將你的文件提交到另一支可以使用gitcheckout-b來命名和保存??焖倌阏谧瞿臣碌漠旈g,知先停所有的事情,去修理一個新近發(fā)現(xiàn)的臭蟲,這個臭蟲在提交`1b6d…`:$gitcommit-$gitcheckout-bfixes$gitcommit-a-m"Bug$gitcheckout$gitmerge合一些版本控制系統(tǒng),創(chuàng)建分支很容易,但把分支合并回來很難。使用Git,合并簡直是家常便我們很久之前就遇到合并了。pull命令取出提交并合并它們到你的當前分支。如果你沒有本地變更,那這個合并就是一個“快進”,相當于中心式版本控制系統(tǒng)里的一個弱化的獲取版通常,一個提交只有一個“父提交”,也叫前一個提交。合并分支到一起產(chǎn)生一個至少有兩個父的提交。這就引出了問題:HEAD~10真正指哪個提交?一個提交可能有多個父,那我們跟原來這個表示每次選擇第一個父。這是可取的,因為在合并時候當前分支成了第一個父;多數(shù)$gitlog$gitdiff$gitcheckout1b6d^^2~10-b不間經(jīng)常在硬件項目里,計劃的第二步必須等第一步完成才能開始。待修的汽車傻等在車庫里,直軟件項目可能也類似。新功能的第二部分不得不等待,直到第一部分發(fā)布并通過測試。一些項目要求你的代碼需要才能接受,因此你可能需要等待第一部分得到批準,才能開始第二部工作。假設(shè)你已經(jīng)將第一部分提交并發(fā)去,比如說你現(xiàn)在在主分支。那么分岔:$gitcheckout-b$gitcheckoutmaster?$gitcommit ?$gitcheckoutpart2?$gitmerge ?$gitcheckoutmaster?$submit ?$gitmerge ?$gitbranchdpart2? $gitbranchmmasterpart2?重命名“master”分支為“part2”$gitbranchmaster 分支master只有第一部分內(nèi)容,其他內(nèi)容在分支part2。我們現(xiàn)在后一個分支;我們創(chuàng)建了masterpart2$gitcheckoutHEAD~7bmaster?重組$gitbranch ?$gitcheckoutbmedley? $gitcheckout$gitcherry-pick管理$gitmastermasterdm(重命名)githelpbranch分支“master”是一個有用的慣例。其他人可能假定你的倉庫有一個叫這個名字的分支,并且該分支包含你項目的版本。盡管你可以重命名或抹殺“master”分支,你最好還是尊重這臨時很快你會發(fā)現(xiàn)你經(jīng)常會因為一些相似的原因創(chuàng)建短期的分支:每個其它分支只是為了保存當前可以和電視的換臺做類比,臨時切到別的頻道,來看看其它臺那正放什么。但并不是簡單地按$git這個命令保存當前狀態(tài)到一個臨時的地方(一個隱藏的地方)并且恢復(fù)之前狀態(tài)。你的工作目錄看起來和你開始編輯之前一樣,并且你可以修復(fù)臭蟲,引入之前變更等。當你想回到隱藏狀$gitstashapply?你可以有多個隱藏,并用不同的方式來操作他們。參見githelpslash。也許你已經(jīng)猜到,Git按你希望的cd考慮一下瀏覽器。為什么同時支持多和多窗口?因為允許兩者同時接納了多種風(fēng)格的用戶。一些用戶喜歡只保持一個打開的窗口,然后用瀏覽多個網(wǎng)頁。一些可能堅持另一個極分支類似你工作的,克隆類似打開的瀏覽器新窗口。這些是本地操作很快,那為什么第5于歷Git分布式本性使得歷史可以輕易編輯。但你若篡改過去,需要:只重寫你獨自擁有的那部分。正如民族間會無休止的爭論誰犯下了什么一樣,如果在另一個人的克隆里,歷史版本一些開發(fā)人員強烈地感覺歷史應(yīng)該不變,不好的部分也不變所有都不變。另一些覺得代碼樹在向外發(fā)布之前,應(yīng)該整得漂漂亮亮的。Git同時支持兩者的觀點。像克隆,分支和合并一樣,重寫歷史只是Git給你的另一強大功能,至于如何明智地使用它,那是你的事了。我認$gitcommit--來改變上一條信息。你還忘記了加一個文件?運行g(shù)itadd來加,然后運行上面的命令。$gitcommit--amend-更復(fù)雜情$gitrebase-ipick5c6eb73Addedrepo.or.czpicka311a64Reordered ogiesin"WorkHowYouWant"pick100834fAddedpushtargettoMakefilepick$gitcommit--$gitrebase--本地但現(xiàn)在你本地Git克隆摻雜了你的改動和改動。你更期望在變更列表里,你所有的變更能夠重寫偶爾,你需要做一些代碼控制,好比從正式的中去除一些人一樣,需要從歷史記錄里面徹底的抹掉他們。例如,假設(shè)我們要發(fā)布一個項目,但由于一些原因,項目中的某個文件不能公開。或許我把我的號記錄在了一個文本文件里,而我又意外的把它加入到了這個項目中。僅僅刪除這個文件是不夠的,因為從別的提交記錄中還是可以訪問到這個文件。因此我們參見githelpfilter-branch,那里討論了這個例子并給出一個更快的方法。一般地,filter-branch允許你使用一個單一命令來大范圍地更改歷史。 描述操作之前的狀態(tài)。檢查命令filter-branch的確做了你想要 制造想把一個項目遷移到Git嗎?如果這個項目是在用比較有名氣的系統(tǒng),那可以使用一些其他人已commitcommitterAlice< >Thu,01Jan197000:00:00data<<EOTM100644inlineo.cdata<<EOT?includeintmain() return0;committerBob< >Tue,14Mar200001:59:26-0800data<<EOTReplaceprintf()withwrite().M100644inlineo.cdata<<EOT?includeintmain()write(1,"o,world!\n",14);return0;$mkdirproject;cdproject;git$gitfast-import--date-format=rfc2822<$gitcheckoutmaster也以可讀格式傳送倉庫。的確,這些命令可以發(fā)送倉庫文本文件通過只接受文本的。哪兒錯了$gitbisect$gitbisectbad$gitbisectgood$gitbisect如果可以工作了,則把"bad"替換成"good"。Git會再次幫你找到一個以確定的好版本和壞版本之間的狀態(tài),通過這種方式縮小范圍。經(jīng)過一系列的迭代,這種二分搜索會幫你找到導(dǎo)致這個錯誤的那次提交。一旦完成了問題定位的,你可以返回到原始狀態(tài),鍵入:$gitbisect$gitbisectrunGit使用指定命令(通常是一個的)的返回值來決定一次改動是否是正確的:命令退出時的代碼0代表改動是正確的,125代表要跳過對這次改動的檢查,1到127你還能做的事情:幫助文檔解釋了如何展示bisects,檢查或重放bisect的日志,并可以通過排誰讓事情變$gitblame個人 這么做。沒有網(wǎng)絡(luò),克隆,分支和合并都沒法做。像一些基本的操作如瀏覽歷史,或提交變更也是如此。在一些系統(tǒng)里,用戶使用網(wǎng)絡(luò)連接僅僅是為了查看他們自己的變更,或打開文件進行編輯。中心系統(tǒng)排斥離線工作,也需要更昂貴的網(wǎng)絡(luò)設(shè)施,特別是當開發(fā)人員增多的時候。最重要的是,所有操作都一定程度變慢,一般在用戶避免使用那些能不用則不用的高級命令時。在的情況下,即使是最基本令也會變慢。當用戶必須運行緩慢令的時候,由于工作流被我有這些的一手經(jīng)驗。Git是我使用的第一個版本控制系統(tǒng)。我很快學(xué)會適應(yīng)了它,用了它提供的許多功能。我簡單地假設(shè)其他系統(tǒng)也是相似的:選擇一個版本控制系統(tǒng)應(yīng)該和選擇一個編輯在我之后被迫使用中心系統(tǒng)的時候,我被了。我那有些脆弱的網(wǎng)絡(luò)沒給Git帶來煩,但是當它需要像本地硬盤一樣穩(wěn)定的時候,它使開發(fā)重重。另外,我發(fā)現(xiàn)我自己有選擇地避免特定令,以避免踏雷,這極大地影響了我,使我不能按照我喜歡的方式工作。當我不得不運行一個慢令的時候,這種等待極大地破壞了我思緒連續(xù)性。在等待服務(wù)器通訊完成的時候,我選擇做其他的事情以度過這段時光,比如查看郵件或?qū)懫渌奈臋n。當我返回我原先的工作場景的時候,這個命令早已結(jié)束,并且我還需要浪費時間試圖記起我之前正在還有一個有意思的大眾悲劇效應(yīng):預(yù)料到網(wǎng)絡(luò)擁擠,為了減少將來的等待時間,每個人將比以往消費的帶寬在上。共同的努力加劇了擁擠,這等于是鼓勵個人下次消費帶第6章多人只用到了pull和*clone*,用以在不同地方保持同一個項目。 用Git發(fā)布我的代碼,并且包括其他貢獻者的變更。我不得不學(xué)習(xí)如何管理有來自世界我是 和電子信箱,這顯示在gitlog里。默認,Git使用系統(tǒng)設(shè)定來填充$"John$gitconfig--globaluser.Git在SSH,HTTP $GIT_DIR=proj.gitgit$cd$oda+xhooks/post-$gitcloneGit在隨便什么想無需服務(wù)器,甚至無需網(wǎng)絡(luò)連接的時候同步倉庫?需要在緊急時期湊合一下?我們已經(jīng)看過gitftepot和gtftprtgtgitunde。$gitbundlecreatesomefile$gitpull$gitbundlecreatesomefileHEAD如果做的頻繁,人可能容易忘記剛發(fā)了哪個提交。幫助頁面建議使用解決這個問題。即,$gittag-flastbundle$gitbundlecreatenewbundleHEAD補丁:全球補丁是變更的文本形式,易于計算機理解,人也類似。補丁可以通吃。你可以給開發(fā)電郵一個補丁,不用管他們用的什么版本控制系統(tǒng)。只要你的觀眾可以讀電子郵件,他們就能看到你的修改。類似,在你這邊,你只需要一個電子郵件帳號:不必搭建一個的Git倉庫。$gitdiff1b6d>$gitam 對基于mbox對不起,移$gitconfig--remote.origin.urlURL源;“originmaster$gitconfigremote.origin.urlbranch.master.mergegitpullpull也將忠實地跟著原來的$git 遠端當你克隆一個倉庫,你也克隆了它的所有分支。你或許沒有注意到因為Git將它們隱藏起來了:你必須明確地要求。這使得遠端倉的分支不至于干擾你的分支,也使Git對初學(xué)者稍稍容易$gitbranch-這顯示了遠端倉庫的分支和HEAD,可以用在常用的Git命令里。例如,假設(shè)你已經(jīng)做了很多提交,并希望和最后取到的版本比較一下。你可以搜索適當?shù)腟HA1$gitdiff$gitlog多遠$gitremoteadd $gitpullother$gitdifforigin/experimental^但如果為了不影響自己的工作,我們只想比較他們的變更怎么辦呢?換句話說,我們想檢查一 。那不是運行pull命令,而是運行:$git ?Fetchfromorigin,the$gitfetchother?Fetchfromthesecond 維持不變,我們可以參考任何倉庫的任何分支,使用一個Git命回想一下,在幕后,一個pullfetchmergepull我的對我手頭的項目,我喜歡貢獻者去準備倉庫,這樣我可以從其中拉。一些Git在我獲取一個樹之后,我運行Git描述良好。我合并這些變更,也或許做些編輯。直到滿意,我才把變更推入主資源庫。 這篇來自LinusTorvalds的博客[/2009/06/happiness-is-warm-scm.html]呆在Git的世界里比補丁文件稍更方便,因為不用我將補丁轉(zhuǎn)換到Git提交。更進一步,Git處理諸如作者和信箱地址的細節(jié),還有時間和日期,以及要求作者描述他們的提交。7Git大師githelp的確切命令可能是乏味的?;蛟S我可以省你點功夫:以下是我過去曾經(jīng)需要的一些食譜。源碼提交$gitadd$gitadd- 的文件并自己算出具體的情況。除了用第二個add命令,如果你也打算這時提交,可以運行`gitcommit-a`。關(guān)于如何指定應(yīng)被忽略的文件,參見githelpignore。$gitls-files-d-m-o-z|xargs-0gitupdate-index--add--z0被忽略的文件,這時你可能需要加上-x或-X選項。我的提交太$gitadd-為你做的每次修改,Git$git如果你修改了許多地方的許多文件怎么辦?一個一個地查看變更令人沮喪,心態(tài)麻木。這種情況下,使用gitadd-i,它的界面不是很直觀,但更靈活。敲幾個鍵,你可以一次決定階段或gitcommit--interactive,這個命令會在你操作完后自動進行提交。索引:Git的中轉(zhuǎn)區(qū)當目前為止,我們已經(jīng)忽略Git著名的'索引‘概念,但現(xiàn)在須面對它,以解釋上面發(fā)生的。索引是一個臨時中轉(zhuǎn)區(qū)。GitGit先寫例如,commit-a實際上是一個兩步過程。第一步把每個追蹤文件當前狀態(tài)的快照放到索引a索引令才有意義,比如gitadd。通常我們可以忽略索引并假裝從歷史中直接讀并直接寫。在這個情況下,我們希望更好地控制,因此我們操作索引。我們放我們變更的一些的快照到索引中,而不是所有的,然后永久地別丟了你的HEAD好似一個游標,通常指向提交,隨提交向前移動。一些Git命令讓你來移動它。$gitreset將立即向回移動HEAD三個提交。這樣所有Git$gitreset但假設(shè)你從來沒有記下呢?別擔心,像這些命令,Git保存原先的HeadORGI_HEAD的$gitresetHEAD捕或許ORG_HEAD默認,Git保存一個提交至少兩星期,即使你命令Git哈希值。你可以查看在.git/objects里所有的哈希值并嘗試找到你期望的。但有一個更容易的辦 包括所有分支上所有活動的歷Thereflogcommandprovidesafriendlyinterfacetotheselogfiles.$git$gitcheckoutgithelprev-parse`SpecifyingRevisions’'部分。$gitconfiggc.pruneexpire"30你或許還想關(guān)掉gitgc的自動運行:$gitconfiggc.auto基于Git依照真正的UNIX風(fēng)格設(shè)計,Git允許其易于用作其他程序的底層組件,比如圖形界面,Web界面,可選擇令行界面,補丁管理工具,導(dǎo)入和轉(zhuǎn)換工具等等。實際上,一些Git命令它們自己就是站在巨人肩膀上的。通過一點修補,你可以定制Git適應(yīng)你的偏好。$gitconfig--globalalias.coalias.co$gitco $gitsymbolic-ref$gitsymbolic-refHEAD2>/dev/null|cut-b 位于/usr/share/doc/git-core/contrib。一個受歡迎的居民是workdir/git-new-workdir。通過聰明的符號,這個創(chuàng)建一個新 和其中的文件可被視為一個克隆,除了既然歷史是共享的,兩者的樹自動保持同大膽的特這些天,Git使得用戶意外摧毀數(shù)據(jù)變得更。但如若你知道你在做什么,你可以突破為通用$gitcheckout-f$gitreset--hard$gitbranch-Ddead_branch?insteadof-$gitbranchMsourcetarget?不像checkout和重置,這兩個命令延遲數(shù)據(jù)銷毀。這個變更仍然在.git的子里,并且可以通過恢復(fù).git/logs里的相應(yīng)哈希值獲?。▍⒁娚厦嫔厦妗癏EAD獵捕”)。默認情況下,$gitclean-f-壞提追加空格并引起合并:盡管危害少,我希望浙西不要出現(xiàn)在公開記錄里。$cd$ mit?對舊版本Git,先運 od ifgitls-files-o|grep'\.txt$';thenechoFAIL!Untracked.txtfiles.exit1幾個git操作支持鉤子;參見githelphooks。我們早先激活了作為例子的post-updateupdate更新Git在基于Git并不知曉的傳輸協(xié)議,諸如HTTP,通訊時所需的文件。第8開面我們揭開Git神秘面紗,往里瞧瞧它是如何創(chuàng)造的。我會跳過細節(jié)。更深入的描述參見用戶手冊[ 大象Git怎么這么謙遜寡言呢?除了偶爾提交和合并外,你可以如常工作,就像不知道版本控制系統(tǒng)存在一樣。那就是,直到你需要它的時候,而且那是你歡欣的時候,Git一直默默注視著你。其他版本控制系統(tǒng)強迫你與繁文縟節(jié)和主義不斷。文件的權(quán)限可能是只讀的,除非你顯式地告訴中心服務(wù)器哪些文件你打算編輯。即使最基本令,隨著用戶數(shù)目的增多,也會慢的像爬一樣。中心服務(wù)器可能正什么人,什么時候checkout了什么代碼。當網(wǎng)絡(luò)連接斷了的時候,你就遭殃了。開發(fā)人員不斷地與這些版本控制系統(tǒng)的種種限制作。一旦網(wǎng)絡(luò)或與之相反,Git簡單地在你工作下的.git`保存你項目的歷史。這是你自己的歷史拷貝,因此你可以保持離線,直到你想和他人溝通為止。你擁有你的文件命運完全的控制權(quán),因為Git數(shù)據(jù)完整很多人把加密和保持信息關(guān)聯(lián)起來,但一個同等重要的目標是保證。合理使用哈一個SHA1哈希值可被認為是一個唯一的160位ID節(jié)串。實際上不止如此:每個字節(jié)串可供任何人用好多輩子。因為一個SHA1的觀察出奇地有用:查看“哈希鏈”。我們之后會看Git如何利用這一點來高效地保證數(shù)據(jù)完整簡言之,Git數(shù)據(jù)保存在`.git/objects`子,那里看不到正常文件名,相反你只看到ID。通過用ID作為文件名,加上一些文件鎖和時間戳技巧,Git把任意一個原始的文件系統(tǒng)轉(zhuǎn)化為一智Git是如何知道你重命名了一個文件,即使你從來沒有明確提及這個事實?當然,你或許是運行了gitmv,但這個命令和gitadd緊接gitrm是完全一樣的。Git啟發(fā)式地找出相連版本之間的重命名和拷貝。實際上,它能檢測文件之間代碼塊的移動或拷貝!盡管它不能覆蓋所有的情況,但它已經(jīng)做的很好了,并且這個功能也改進中。如果它在你那兒不工作的話,可以嘗試打開開銷更高的拷貝檢測選項,并考慮升級。索為每個加入管理的文件,Git在一個名為“index”的文件里記錄統(tǒng)計信息,諸如大小,創(chuàng)建時間和最后修改時間。為了確定文件是否更改,Git比較其當前統(tǒng)計信息與那些在索引里的統(tǒng)計信因為統(tǒng)計信息的調(diào)用比讀文件內(nèi)容快的很多,如果你僅僅編輯了少數(shù)幾個文件,Git幾乎不需要我們前面講過索引是一個中轉(zhuǎn)區(qū)。為什么一堆文件的統(tǒng)計數(shù)據(jù)是一個中轉(zhuǎn)區(qū)?因為添加命令將文件放到Git的數(shù)據(jù)庫并更新它們的統(tǒng)計信息,而無參數(shù)的提交命令創(chuàng)建一個提交,只基于這些Git的源這個Linux內(nèi)核郵件列表帖子[]描述了導(dǎo)致Git的一系列對象數(shù)據(jù)你數(shù)據(jù)的每個版本都保存在“對象數(shù)據(jù)庫”里,其位于子.git/objects`;其他位于.git/`的較少數(shù)據(jù):索引,分支名,,配置選項,日志,頭提交的當前位置等。對象數(shù)據(jù)庫樸素而`.git/objects`里的每個文件是一個對象。有3中對象跟我們有關(guān):“blob”對象,“tree”對Blob對首先來一個小把戲。去一個文件名,任意文件名。在一個空$echosweet>$git$gitadd$find.git/objects-type.git/objects/aa/823728ea7d592acc69b36875a482cdf3fd5c8d"blob"SP"6"NUL"sweet"LF是aa823728ea7d592acc69b36875a482cdf3fd5c8d,這里SP是一個空格,NUL是一個0字節(jié),LF是一個換行符。你可以驗證這一點,鍵入:$printf"blob6\000sweet\n"|Git基于“內(nèi)容尋址”:文件并不按它們的文件名,而是按它們包含內(nèi)容的哈希值,在一個叫“blob對象”的文件里。我們可以把文件內(nèi)容的哈希值看作一個唯一ID,這樣在某種意義上我們通過他們內(nèi)容放置文件。開始的“blob6”只是一個包含對象類型與其長度的頭;它簡化.git/objects的內(nèi)容保持不變,不管你加了多少。Git只一次數(shù)據(jù)。 過zpipe-d[]管道,或者鍵入:Tree$gitcommit?$find.git/objects-type$find.git/objects-type 里,文件類型是100644,這意味著“rose”是一個一般文件,并且哈希值指blob對象,包含“rose”的內(nèi)容。其他可能文件類型有可執(zhí)行,或者。在最后一個例子里,哈希值$rm-r$gitreflogexpire--expire=now--$git在真實項目里你通常應(yīng)該避免像這樣令,因為你在破換備份。如果你期望一個干凈的倉庫,通常最好做一個新的克隆。還有,直接操作.git時一定要:如果Git命令同時也在運行會怎樣,或者突然停電?一般,應(yīng)由gitupdate-ref-d刪除,盡管通常手工刪除refs/original也是安全的。Commit對我們已經(jīng)解釋了三個對象中的兩個。第三個是“commit$gitcommitamendmShakespeare?$gitfilter-branch--env-filter'exportGIT_AUTHOR_DATE="Fri13Feb200915:31:30-0800" MITTER_DATE="Fri,13Feb200915:31:30-0800" "'?Rigtimestampsand$find.git/objects-type你現(xiàn)在應(yīng)看到是下列內(nèi)容的"commit158""tree05b217bb859794d08bb9e4f7f04cbda4b207fbe9"LF"authorAlice< -0800"LF"committerBob< -0800"LF沒那Git的似乎太簡單??雌饋硭坪跄憧梢哉蠋讉€s ,加幾行C代碼來弄起來,也就幾個小時的事:一個基本文件操作和SHA1哈?;幕祀s,用鎖文件裝飾一下,文件同步保證健壯性。實際上,這準確描述了Git的最早期版本。盡管如此,除了巧妙地打包以節(jié)省空間,巧妙地索引以省時間,我們現(xiàn)在知道Git如何靈巧地改造文件系統(tǒng)成為一個對版本控制完美的數(shù)據(jù)庫。 的任何一個文件由于硬盤錯誤損毀,那么其哈希值將不再匹配,這個性。Commit對象是原子的,也就是說,一個提 不會部分地記
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國傳統(tǒng)文化試題及答案
- 新疆奎屯市農(nóng)七師高級中學(xué)2024-2025學(xué)年高二數(shù)學(xué)第二學(xué)期期末達標檢測試題含解析
- 西藏林芝地區(qū)一中2025屆物理高二下期末預(yù)測試題含解析
- 溫州市重點中學(xué)2024-2025學(xué)年化學(xué)高二第二學(xué)期期末聯(lián)考試題含解析
- 彩鋼房倉儲物流中心建造合同規(guī)范范本
- 旅游預(yù)訂平臺酒店充值卡合作合同
- 茶葉出口認證及檢驗合同樣本
- 餐飲公司廚房承包及品牌形象提升合同
- 餐飲門面租賃合同租金調(diào)整及支付方式解析
- 出租車租賃合同范本(含司機聘用)
- GB/T 42064-2022普通照明用設(shè)備閃爍特性光閃爍計測試法
- 大規(guī)模集成電路
- 剪力墻結(jié)構(gòu)設(shè)計實例講解共74張課件
- 供應(yīng)商工廠考察評估報告綜合表
- 檢驗檢測服務(wù)公司績效與薪酬管理方案
- 2012年《土地開發(fā)整理項目預(yù)算定額標準》
- 精囊疾病超聲診斷
- 造林工程模式典型設(shè)計圖文版
- 國家開放大學(xué)《工程數(shù)學(xué)(本)》形成性考核作業(yè)1-5參考答案
- 胃間質(zhì)瘤的護理查房
- 狀態(tài)——特質(zhì)焦慮問卷STAI
評論
0/150
提交評論