版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Git詳解之Git基礎(chǔ)
在工作目錄中初始化新倉庫
從現(xiàn)有倉庫克隆
檢查當(dāng)前文件狀態(tài)
跟蹤新文件
暫存已修改文件
忽略某些文件
直看已暫存和未暫存的更新
提交更新
跳過使用暫存區(qū)域
移除文件
移動(dòng)文件
限制輸出長(zhǎng)度
使用圖形化工具查閱提交歷史
修改最后一次提交
取消已經(jīng)暫存的文件
取消對(duì)文件的修改
查看當(dāng)前的遠(yuǎn)程庫
添加遠(yuǎn)程倉庫
從遠(yuǎn)程倉庫抓取數(shù)據(jù)
推送數(shù)據(jù)到遠(yuǎn)程倉庫
?查看遠(yuǎn)程倉庫信息
?遠(yuǎn)程倉庫的刪除和重命名
?列顯已有的標(biāo)簽
?新建標(biāo)簽
?含附注的標(biāo)簽
?簽署標(biāo)簽
?輕量級(jí)標(biāo)簽
?驗(yàn)證標(biāo)簽
?后期加注標(biāo)簽
?分享標(biāo)簽
?自動(dòng)完成
?Git命令別名
Git基礎(chǔ)
讀完本章你就能上手使用Git了。本章將介紹幾個(gè)最基本的,也是最常用的Git命令,以
后絕大多數(shù)時(shí)間里用到的也就是這幾個(gè)命令。讀完本章,你就能初始化一個(gè)新的代碼倉庫,
做一些適當(dāng)配置;開始或停止跟蹤某些文件;暫存或提交某些更新。我們還會(huì)展示如何讓
Git忽略某些文件,或是名稱符合特定模式的文件;如何既快且容易地撤消犯下的小錯(cuò)誤;
如何瀏覽項(xiàng)目的更新歷史,查看某兩次更新之間的差異;以及如何從遠(yuǎn)程倉庫拉數(shù)據(jù)下來
或者推數(shù)據(jù)上去。
2.1取得項(xiàng)目的Git倉庫
有兩種取得Git項(xiàng)目倉庫的方法。第一種是在現(xiàn)存的目錄下,通過導(dǎo)入所有文件來創(chuàng)建新
的Git倉庫。第二種是從已有的Git倉庫克隆出一個(gè)新的鏡像倉庫來。
在工作目錄中初始化新倉庫
要對(duì)現(xiàn)有的某個(gè)項(xiàng)目開始用Git管理,只需到此項(xiàng)目所在的目錄,執(zhí)行:
$gitinit
初始化后,在當(dāng)前目錄下會(huì)出現(xiàn)一個(gè)名為.git的目錄,所有Git需要的數(shù)據(jù)和資源都存放
在這個(gè)目錄中。不過目前,僅僅是按照既有的結(jié)構(gòu)框架初始化好了里邊所有的文件和目錄,
但我們還沒有開始跟蹤管理項(xiàng)目中的任何一個(gè)文件。(在第九章我們會(huì)詳細(xì)說明剛才創(chuàng)建
的.git目錄中究竟有哪些文件,以及都起些什么作用。)
如果當(dāng)前目錄下有幾個(gè)文件想要納入版本控制,需要先用gitadd命令告訴Git開始對(duì)這
些文件進(jìn)行跟蹤,然后提交:
$gitadd*.c$gitaddREADME$gitcommit-m*initialprojectversion)
稍后我們?cè)僦鹨唤忉屆織l命令的意思。不過現(xiàn)在,你已經(jīng)得到了一個(gè)實(shí)際維護(hù)著若干文件的
Git倉庫。
從現(xiàn)有倉庫克隆
如果想對(duì)某個(gè)開源項(xiàng)目出一份力,可以先把該項(xiàng)目的Git倉庫復(fù)制一份出來,這就需要用
到gitclone命令。如果你熟悉其他的VCS比如Subversion,你可能已經(jīng)注意到這里使
用的是clone而不是checkout這是個(gè)非常重要的差別,Git收取的是項(xiàng)目歷史的所有
數(shù)據(jù)(每一個(gè)文件的每一個(gè)版本),服務(wù)器上有的數(shù)據(jù)克隆之后本地也都有了。實(shí)際上,即
便服務(wù)器的磁盤發(fā)生故障,用任何一個(gè)克隆出來的客戶端都可以重建服務(wù)器上的倉庫,回
到當(dāng)初克隆時(shí)的狀態(tài)(雖然可能會(huì)丟失某些服務(wù)器端的掛鉤設(shè)置,但所有版本的數(shù)據(jù)仍舊還
在,有關(guān)細(xì)節(jié)請(qǐng)參考第四章)。
克隆倉庫的命令格式為gitclone[url:。比如,要克隆Ruby語言的Git代碼倉庫
Grit,可以用下面的命令:
$gitclonegit://github.com/schacon/grit.git
這會(huì)在當(dāng)前目錄下創(chuàng)建一個(gè)名為"grit”的目錄,其中包含一個(gè).git的目錄,用于保存
下載下來的所有版本記錄,然后從中取出最新版本的文件拷貝。如果進(jìn)入這個(gè)新建的grit
目錄,你會(huì)看到項(xiàng)目中的所有文件已經(jīng)在里邊了,準(zhǔn)備好后續(xù)的開發(fā)和使用。如果希望在克
隆的時(shí)候,自己定義要新建的項(xiàng)目目錄名稱,可以在上面的命令末尾指定新的名字:
$gitclonegit://github.com/schacon/grit.gitmygrit
唯一的差別就是,現(xiàn)在新建的目錄成了mygrit,其他的都和上邊的一樣。
Git支持許多數(shù)據(jù)傳輸協(xié)議。之前的例子使用的是gic//協(xié)議,不過你也可以用
http(s)://或者user@server:/path.git表示的SSH傳輸協(xié)議。我們會(huì)在第四章
詳細(xì)介紹所有這些協(xié)議在報(bào)務(wù)器端該如何配置使用,以及各種方式之間的利弊。
2.2記錄每次更新到倉庫
現(xiàn)在我們手上已經(jīng)有了一個(gè)真實(shí)項(xiàng)目的Git倉庫,并從這個(gè)倉庫中取出了所有文件的工作
拷貝。接下來,對(duì)這些文件作些修改,在完成了一個(gè)階段的目標(biāo)之后,提交本次更新到倉庫。
請(qǐng)記住,工作目錄下面的所有文件都不外乎這兩種狀態(tài):已跟蹤或未跟蹤。已跟蹤的文件是
指本來就被納入版本控制管理的文件,在上次快照中有它們的記錄,工作一段時(shí)間后,它
們的狀態(tài)可能是未更新,已修改或者已放入暫存區(qū)。而所有其他文件都屬于未跟蹤文件。它
們既沒有上次更新時(shí)的快照,也不在當(dāng)前的暫存區(qū)域。初次克隆某個(gè)倉庫時(shí),工作目錄中
的所有文件都屬于已跟蹤文件,且狀態(tài)為未修改。
在編輯過某些文件之后,Git將這些文件標(biāo)為已修改。我們逐步把這些修改過的文件放到暫
存區(qū)域,直到最后一次性提交所有這些暫存起來的文件,如此重復(fù)。所以使用Git時(shí)的文
件狀態(tài)變化周期如圖2-1所示。
FileStatusLifecycle
圖2-1.
文件的狀態(tài)變化周期
檢查當(dāng)前文件狀態(tài)
要確定哪些文件當(dāng)前處于什么狀態(tài),可以用gitstatus命令。如果在克隆倉庫之后立即執(zhí)
行此命令,會(huì)看到類似這樣的輸出:
$gitstatus#Onbranchmasternothingtocommit(workingdirectory
clean)
這說明你現(xiàn)在的工作目錄相當(dāng)干凈。換句話說,當(dāng)前沒有任何跟蹤著的文件,也沒有任何文
件在上次提交后更改過。比外,上面的信息還表明,當(dāng)前目錄下沒有出現(xiàn)任何處于未跟蹤
的新文件,否則Git會(huì)在這里列出來。最后,該命令還顯示了當(dāng)前所在的分支是master,
這是默認(rèn)的分支名稱,實(shí)際是可以修改的,現(xiàn)在先不用考慮。下一章我們就會(huì)詳細(xì)討論分支
和引用。
現(xiàn)在讓我們用vim編輯一個(gè)新文件README,保存退出后運(yùn)行g(shù)itstatus會(huì)看到該
文件出現(xiàn)在未跟蹤文件列表中:
$vimREADME$gitstatus#Onbranchmaster#Untrackedfiles:#(use
“gitadd…〃toincludeinwhatwillbecommitted)##READMEnothing
addedtocommitbutuntrackedfilespresent(use〃gitadd“totrack)
就是在"Untrackedfiles"這行下面。Git不會(huì)自動(dòng)將之納入跟蹤范圍,除非你明明白白地
告訴它"我需要跟蹤該文件",因而不用擔(dān)心把臨時(shí)文件什么的也歸入版本管理。不過現(xiàn)在
的例子中,我們確實(shí)想要跟蹤管理README這個(gè)文件,
跟蹤新文件
使用命令gitadd開始跟蹤一個(gè)新文件。所以,要跟蹤README文件,運(yùn)行:
$gitaddREADME
此時(shí)再運(yùn)行g(shù)itstatus命令,會(huì)看到README文件已被跟蹤,并處于暫存狀態(tài):
$gitstatus#Onbranchmaster#Changestobecommitted:#(use"git
resetHEAD...”tounstage)##newfile:README#
只要在"Changestobecommitted"這行下面的,就說明是已暫存狀態(tài)。如果此時(shí)提
交,那么該文件此時(shí)此刻的版本將被留存在歷史記錄中。你可能會(huì)想起之前我們使用gil
init后就運(yùn)行了gitadd命令,開始跟蹤當(dāng)前目錄下的文件。在gitadd后面可以
指明要跟蹤的文件或目錄路徑。如果是目錄的話,就說明要遞歸跟蹤該目錄下的所有文件。
(譯注:其實(shí)gitadd的潛臺(tái)詞就是把目標(biāo)文件快照放入暫存區(qū)域,也就是addfileinto
stagedarea,同時(shí)未曾跟蹤過的文件標(biāo)記為需要跟蹤。這樣就好理解后續(xù)add操作的實(shí)
際意義了。)
暫存已修改文件
現(xiàn)在我們修改下之前已跟蹤過的文件benchmarks.rb,然后再次運(yùn)行status命令,會(huì)
看到這樣的狀態(tài)報(bào)告:
$gitstatus#Onbranchmaster#Changestobecommitted:#(use"git
resetHEAD...”tunstage)##newfile:README##Chnebunotupdated:
(us〃gitadd...”toupdatewhatwillbecommitted)##modified:
benchmarks.rb#
文件benchmarks.rb出現(xiàn)在"Changedbutnotupdated"這行下面,說明已跟蹤文
件的內(nèi)容發(fā)生了變化,但還沒有放到暫存區(qū)。要暫存這次更新,需要運(yùn)行g(shù)itadd命令(這
是個(gè)多功能命令,根據(jù)目標(biāo)文件的狀態(tài)不同,此命令的效果也不同:可以用它開始跟蹤新文
件或者把已跟蹤的文件放到暫存區(qū)還能用于合并時(shí)把有沖突的文件標(biāo)記為已解決狀態(tài)等I
現(xiàn)在讓我們運(yùn)行g(shù)iladd將benchmarks.rb放到暫存區(qū),然后再看看gitstatus的
輸出:
$gitaddbenchmarks,rb$gitstatus#Onbranchmaster#Changestobe
committed:tt(use〃gitresetHEAD...”tounstage)ttttnewfile:README
#modified:benchmarks,rb#
現(xiàn)在兩個(gè)文件都已暫存,下次提交時(shí)就會(huì)一并記錄到倉庫。假設(shè)此時(shí),你想要在
benchmarks.rb里再加條注釋,重新編輯存盤后,準(zhǔn)備好提交。不過且慢,再運(yùn)行g(shù)it
status看看:
$vimbenchmarks,rb$gitstatus#Onbranchmaster#Changestobe
committed:#(use〃gitresetHEAD...”tounstage)##newfile:README
#modified:benchmarks,rb##Changedbutnotupdated:#(use〃gitadd…”
toupdatewhatwillbecommitted)##modified:benchmarks,rb#
怎么回事?benchmarks.rb文件出現(xiàn)了兩次!一次算未暫存,一次算已暫存,這怎么可能
呢?好吧,實(shí)際上Git只不過暫存了你運(yùn)行g(shù)itadd命令時(shí)的版本,如果現(xiàn)在提交,那么
提交的是添加注釋前的版本,而非當(dāng)前工作目錄中的版本。所以,運(yùn)行了gitadd之后又
作了修訂的文件,需要重新運(yùn)行g(shù)itadd把最新版本重新暫存起來:
$gitaddbenchmarks,rb$gitstatus#Onbranchmaster#Changestobe
committed:#(use〃gitresetHEAD…〃tounstage)##newfile:README
#modified:benchmarks,rb#
忽略某些文件
一般我們總會(huì)有些文件無需納入Git的管理,也不希望它們總出現(xiàn)在未跟蹤文件列表。通
常都是些自動(dòng)生成的文件,比如日志文件,或者編譯過程中創(chuàng)建的臨時(shí)文件等。我們可以創(chuàng)
建一個(gè)名為.gitignore的文件,列出要忽略的文件模式。來看一個(gè)實(shí)際的例子:
$cat.gitignore*.:oa]*~
第一行告訴Git忽略所有以.0或.a結(jié)尾的文件。一般這類對(duì)象文件和存檔文件都是編譯
過程中出現(xiàn)的,我們用不著跟蹤它們的版本。第二行告訴Git忽略所有以波浪符(~)結(jié)
尾的文件,許多文本編輯軟件(比如Emacs)都用這樣的文件名保存副本。此外,你可能
還需要忽略log,tmp或者pid目錄,以及自動(dòng)生成的文檔等等。要養(yǎng)成一開始就設(shè)置
好.gitignore文件的習(xí)慣,以免將來誤提交這類無用的文件。
文件.gitignore的格式規(guī)范如下:
?所有空行或者以注釋符號(hào)#開頭的行都會(huì)被Git忽略。
?可以使用標(biāo)準(zhǔn)的glob模式匹配。*匹配模式最后跟反斜杠(/)說明要忽略的
是目錄。*要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(hào)(?。?/p>
取反。
所謂的glob模式是指shell所使用的簡(jiǎn)化了的正則表達(dá)式。星號(hào)(*)匹配零個(gè)或多個(gè)
任意字符;[abc]匹配任何一個(gè)列在方括號(hào)中的字符(這個(gè)例子要么匹配一個(gè)a,要么匹
配一個(gè)b,要么匹配一個(gè)c);問號(hào)(?)只匹配一個(gè)任意字符;如果在方括號(hào)中使用短劃
線分隔兩個(gè)字符,表示所有在這兩個(gè)字符范圍內(nèi)的都可以匹配(比如[0-9]表示匹配所有
0至IJ9的數(shù)字)。
我們?cè)倏匆粋€(gè).gitignore文件的例子:
#此為注釋-將被Git忽略*.a#忽略所有.a結(jié)尾的文件!lib.a#但
lib.a除外/TODO#僅僅忽略項(xiàng)目根目錄下的TODO文件,不包括
subdir/TODObuild/#忽略build/目錄下的所有文件doc/*,txt#會(huì)忽略
doc/notes.txt但不包括doc/server/arch.txt
查看已暫存和未暫存的更新
實(shí)際上gitstatus的顯示比較簡(jiǎn)單,僅僅是列出了修改過的文件,如果要查看具體修改
了什么地方,可以用gitdiff命令。稍后我們會(huì)詳細(xì)介紹gitdiff,不過現(xiàn)在,它已
經(jīng)能回答我們的兩個(gè)問題了:當(dāng)前做的哪些更新還沒有暫存?有哪些更新已經(jīng)暫存起來準(zhǔn)備
好了下次提交?gitdiff會(huì)使用文件補(bǔ)丁的格式顯示具體添加和刪除的行。
彳融口再次修改README文件后暫存,然后編輯benchmarks.rb文件后先別暫存,運(yùn)行
status命令,會(huì)看到:
$gitstatus#Onbranchmaster#Changestobecommitted:#(use"git
resetHEAD…〃tounstage)##newfile:README##Changedbutnotupdated:
#(use"gitadd…"toupdatewhatwillbecommitted)##modified:
benchmarks,rb#
要查看尚未暫存的文件更新了哪些部分,不加參數(shù)直接輸入gitdiff:
$gitdiffdiff-gita/benchmarks.rbb/benchmarks.rbindex
3cb747f..da6558510C644---a/benchmarks.rb+++b/benchmarks.rb@@-36,6
+36,10@@defmain@commit,parents[0].parents[0].parents[0]end+
runcode(x,,commitsV)do+git.commits,size+end+runcode(x,
'commits2')dolog=git.commits(*master*,15)log.size
此命令比較的是工作目錄中當(dāng)前文件和暫存區(qū)域快照之間的差異,也就是修改之后還沒有暫
存起來的變化內(nèi)容。
若要看已經(jīng)暫存起來的文件和上次提交時(shí)的快照之間的差異,可以用gitdiff-cached
命令。(Git1.6.1及更高版本還允詫使用gitdiff-staged,效果是相同的,但更好
記些。)來看看實(shí)際的效果:
$gitdiff—cacheddiff—gita/READMEb/READMEnewfilemode100644
index0000000..03902al---/dev/null+++b/README2@@-0,0+1,5@@+grit
+byTomPreston-Werner,ChrisWanstrath+
http://github.com/mojombo/grit++GritisaRubylibraryforextracting
informationfromaGitrepository
請(qǐng)注意,單單gitdiff不過是顯示還沒有暫存起來的改動(dòng),而不是這次工作和上次提交
之間的差異。所以有時(shí)候你一下子暫存了所有更新過的文件后,運(yùn)行g(shù)itdiff后卻什么
也沒有,就是這個(gè)原因。
像之前說的,暫存benchmarks.rb后再編輯,運(yùn)行g(shù)itstatus會(huì)看到暫存前后的兩個(gè)
版本:
$gitaddbenchmarks,rb$echo'#testline*?benchmarks,rb$gitstatus
#Onbranchmaster##Changestobecommitted:##modified:benchmarks,rb
##Changedbutnotupdated:##modified:benchmarks,rb#
現(xiàn)在運(yùn)行g(shù)itdiff看暫存前后的變化:
$gitdiffdiff-gita/benchmarks.rbb/benchmarks.rbindex
e445e28..86b2f7c100644---a/benchmarks.rb+++b/benchmarks.rb的
-127,3+127,4@@endmain()##ppGrit::GitRub)\cache_client.stats+#
testline
然后用gitdiff-cached查看已經(jīng)暫存起來的變化:
$gitdiff-cacheddiff-gita/benchmarks.rbb/benchmarks.rbindex
3cb747f..e445e2810C644---a/benchmarks.rb+++b/benchmarks.rb@@-36,6
+36,10@@defmain@commit,parents[0].parents[0].parents[0]end+
run_code(x,?commits1')do+git.commits,size+end+run_code(x,
)commits2')dolog=git.commits(5master,,15)log.size
提交更新
現(xiàn)在的暫存區(qū)域已經(jīng)準(zhǔn)備妥當(dāng)可以提交了。在此之前,請(qǐng)一定要確認(rèn)還有什么修改過的或新
建的文件還沒有g(shù)itadc過,否則提交的時(shí)候不會(huì)記錄這些還沒暫存起來的變化。所以,
每次準(zhǔn)備提交前,先用gitstatus看下,是不是都已暫存起來了,然后再運(yùn)行提交命令
gitcommit:
$gitcommit
這種方式會(huì)啟動(dòng)文本編輯器以便輸入本次提交的說明。(默認(rèn)會(huì)啟用shell的環(huán)境變量
$EDTTOR所指定的軟件,一般都是vim或emacs0當(dāng)然也可以按照第一章介紹的方式,
使用gitconfig—globalcore.editor命令設(shè)定你喜歡的編輯軟件。)
編輯器會(huì)顯示類似下面的文本信息(本例選用Vim的屏顯方式;展示):
#Pleaseenterthecommitmessageforyourchanges.Linesstarting#with
'willbeignored,andanemptymessageabortsthecommit.#Onbranch
master#Changestobecommitted:#(use"gitresetHEAD…"tounstage)
##newfile:README#modified:benchmarks.rb~~~git/COMMITEDITMSG”
10L,283C
可以看到,默認(rèn)的提交消息包含最后一次運(yùn)行g(shù)itstatus的輸出,放在注釋行里,另外
開頭還有一空行,供你輸入提交說明。你完全可以去掉這些注釋行,不過留著也沒關(guān)系,多
少能幫你回想起這次更新的內(nèi)容有哪些。(如果覺得這還不夠,可以用-v選項(xiàng)將修改差異
的每一行都包含到注釋中來。)退出編輯器時(shí),Git會(huì)丟掉注釋行,將說明內(nèi)容和本次更新
提交到倉庫。
另外也可以用-m參數(shù)后跟提交說明的方式,在一行命令中提交更新:
$gitcommit-m"Story182:Fixbenchmarksforspeed”[master]:created
463dc4f:"Fixbenchmarksforspeed"2fileschanged,3insertions(+),
0deletions(-)createmode100644README
好,現(xiàn)在你已經(jīng)創(chuàng)建了第一個(gè)提交!可以看到,提交后它會(huì)告訴你,當(dāng)前是在哪個(gè)分支
(master)提交的,本次提交的完整SHA-1校驗(yàn)和是什么(463dc4f),以及在本次提
交中,有多少文件修訂過,多少行添改和刪改過。
記住,提交時(shí)記錄的是放在暫存區(qū)域的快照,任何還未暫存的仍然保持已修改狀態(tài),可以在
下次提交時(shí)納入版本管理,每一次運(yùn)行提交操作,都是對(duì)你項(xiàng)目作一次快照,以后可以回到
這個(gè)狀態(tài),或者進(jìn)行比較。
跳過使用暫存區(qū)域
盡管使用暫存區(qū)域的方式可以精心準(zhǔn)備要提交的細(xì)節(jié),但有時(shí)候這么做略顯繁瑣。Git提供
了一個(gè)跳過使用暫存區(qū)域的方式,只要在提交的時(shí)候,給gitcommit加上-a選項(xiàng),Git
就會(huì)自動(dòng)把所有已經(jīng)跟蹤過的文件暫存起來一并提交,從而跳過gitadd步驟:
$gitstatus#Onbranchmaster##Changedbutnotupdated:##modified:
benchmarks,rb#$gitcommit-a-m'addednewbenchmarks'[master83e38c7]
addednewbenchmarks1fileschanged,5insertions(+),0deletions(-)
看到了嗎?提交之前不再需要gitadd文件benchmarks.rb了。
移除文件
要從Git中移除某個(gè)文件,就必須要從已跟蹤文件清單中移除(確切地說,是從暫存區(qū)域
移除),然后提交??梢杂胓ilrm命令完成此項(xiàng)工作,并連帶從工作目錄中刪除指定的
文件,這樣以后就不會(huì)出現(xiàn)在未跟蹤文件清單中了。
如果只是簡(jiǎn)單地從工作目錄中手工刪除文件,運(yùn)行g(shù)itstatus時(shí)就會(huì)在"Changedbut
notupdated”部分(也就是_未暫存一清單)看到:
$rmgrit,gemspec$gitstatus#Onbranchmaster##Changedbutnot
updated:#(use〃gitadd/rm...”toupdatewhatwillbecommitted)##
deleted:grit,gemspec#
然后再運(yùn)行g(shù)itrm記錄此次移除文件的操作:
$gitrmgrit,gemspecrm,grit.gemspcc,$gitstatus#Onbranchmaster
##Changestobecommitted:#(use"gitresetHEAD…"tounstage)#
#deleted:grit,gemspec#
最后提交的時(shí)候,該文件就不再納入版本管理了。如果刪除之前修改過并且已經(jīng)放到暫存區(qū)
域的話,則必須要用強(qiáng)制刪除選項(xiàng)-f(譯注:即force的首字母),以防誤刪除文件后
丟用修改的內(nèi)容。
另外一種情況是,我們想把文件從Git倉庫中刪除(亦即從暫存區(qū)域移除),但仍然希望
保留在當(dāng)前工作目錄中。換句話說,僅是從跟蹤清單中刪除。比如一些大型日志文件或者一
堆.a編譯文件,不小心納入倉庫后,要移除跟蹤但不刪除文件,以便稍后在.gitignore
文件中補(bǔ)上,用--cached選項(xiàng)即可:
$gitrm-cachedreadme,txt
后面可以列出文件或者目錄的名字,也可以使用glob模式。比方說:
$gitrmlog/\*.log
注意到星號(hào)*之前的反斜杠\,因?yàn)镚it有它自己的文件模式擴(kuò)展匹配方式,所以我們
不用shell來幫忙展開(譯注:實(shí)際上不加反斜杠也可以運(yùn)行,只不過按照shell擴(kuò)展的
話,僅僅刪除指定目錄下的文件而不會(huì)遞歸匹配。上面的例子本來就指定了目錄,所以效果
等同,但下面的例子就會(huì)用遞歸方式匹配,所以必須加反斜杠。)0此命令刪除所有10g/
目錄下擴(kuò)展名為.log的文件。類似的比如:
$gitrm\*~
會(huì)遞歸刪除當(dāng)前目錄及其子目錄中所有~結(jié)尾的文件。
移動(dòng)文件
不像其他的VCS系統(tǒng),Git并不跟蹤文件移動(dòng)操作。如果在Git中重命名了某個(gè)文件,
倉庫中存儲(chǔ)的元數(shù)據(jù)并不會(huì)體現(xiàn)出這是一次改名操作。不過Git非常聰明,它會(huì)推斷出究
竟發(fā)生了什么,至于具體是如何做到的,我們稍后再談。
既然如此,當(dāng)你看到Git的mv命令時(shí)一定會(huì)困惑不已。要在Git中對(duì)文件改名,可以這
么做:
$gitmvfile_fromfile_to
它會(huì)恰如預(yù)期般正常工作。實(shí)際上,即便此時(shí)查看狀態(tài)信息,也會(huì)明白無誤地看到關(guān)于重命
名操作的說明:
$gitmvREADME,txtREADME$gitstatus#Onbranchmaster#Yourbranch
isaheadof*origin/mastcr,by1commit.##Changestobecommitted:
#(use〃gitresetHEAD...”tounstage)##renamed:README,txt->README
#
其實(shí),運(yùn)行g(shù)itmv就相當(dāng)于運(yùn)行了下面三條命令:
$mvREADME,txtREADME$gitrmREADME.txt$gitaddREADME
如此分開操作,Git也會(huì)意識(shí)到這是一次改名,所以不管何種方式都一樣。當(dāng)然,直接用git
mv輕便得多,不過有時(shí)侯用其他工具批處理改名的話,要記得在提交前刪除老的文件名,
再添加新的文件名。
2.3查看提交歷史
在提交了若干更新之后,又或者克隆了某個(gè)項(xiàng)目,想回顧下提交歷史,可以使用gitlog
命令直看。
接下來的例子會(huì)用我專門用于演示的simplegit項(xiàng)目,運(yùn)行下面的命令獲取該項(xiàng)目源代碼:
gitclonegit://github.com/schacon/simplegit-progit.git
然后在此項(xiàng)目中運(yùn)行g(shù)itlog,應(yīng)該會(huì)看到下面的輸出:
$gitlogcommitca82a6dff817ec66f44342007202690a93763949Author:Scott
ChaconDate:MonMar1721:52:112008-0700changedtheversionnumber
commit085bb3bcb608ele8451d4b2432f8ecbe6306e7e7Author:ScottChacon
Date:SatMar1516:40:332008-0700removedunnecessarytestcodecommit
alIbef06a3f659402fe7563abf99ad00dc2209o6Author:ScottChaconDate:Sat
Mar1510:31:282008-0700firstcommit
默認(rèn)不用任何參數(shù)的話,gitlog會(huì)按提交時(shí)間列出所有的更新,最近的更新排在最上面。
看到了嗎,每次更新都有一個(gè)SHA-1校驗(yàn)和、作者的名字和電子郵件地址、提交時(shí)間,
最后縮進(jìn)一個(gè)段落顯示提交說明。
gitlog有許多選項(xiàng)可以幫助你搜尋感興趣的提交,接下來我們介紹些最常用的。
我們常用-P選項(xiàng)展開顯示每次提交的內(nèi)容差異,用-2則僅顯示最近的兩次更新:
$gitlog-p-2commitca82a6dff817ec66f44342007202690a93763949Author:
ScottChaconDate:MonMar1721:52:112008-0700changedtheversion
numberdiff—gita/Rakefileb/Rakefileindexa874b73..8f94139100644
---a/Rakefile+++b/Rakefile@@-5,7+5,7@@require
*rake/gempackagetask,spec=Gem::Specification.newdo|s-s.version
=〃0.1.0〃+s.version="0.1.1〃s.author="ScottChacon〃commit
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7Author:ScottChaconDate:Sat
Mar1516:40:332008-0700removedunnecessarytestcodediff―git
a/lib/simplegit.rbb/lib/simplegit.rbindexa0a60ae..47c6340100644---
a/lib/simplegit.rb+++b/lib/simplegit.rb@@-18,8+18,3@@class
SimpleGitendend—if$0==_FILE_-git=SimpleGit.new-puts
git.show-end\Nonewlineatendoffile
在做代碼審查,或者要快速瀏覽其他協(xié)作者提交的更新都作了哪些改動(dòng)時(shí),就可以用這個(gè)選
項(xiàng)。此外,還有許多摘要選項(xiàng)可以用,比如"slat,僅顯示簡(jiǎn)要的增改行數(shù)統(tǒng)計(jì):
$gitlog-statcommitca82a6dff817ec66f44342007202690a93763949Author:
ScottChaconDate:MonMar1721:52:112008-0700changedtheversion
numberRakefile|2+-1fileschanged,1insertions(+),1deletions(-)
commit085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7Author:ScottChacon
Date:SatMar1516:40:332008-0700removedunnecessarytestcode
lib/simplegit.rb5-----1fileschanged,0insertions(+),5
deletions(-)commitallbef06a3f659402fe7563abf99ad00de2209e6Author:
ScottChaconDate:SatMar1510:31:282008-0700firstcommitREADME
6++++++RakefileI23+++++++++++++++++++++++lib/simplegit.rb|25
+++++++++++++++++++++++++3fileschanged,54insertions(+),0
deletions(-)
每個(gè)提交都列出了修改過的文件,以及其中添加和移除的行數(shù),并在最后列出所有增減行數(shù)
小計(jì)。還有個(gè)常用的一pretty選項(xiàng),可以指定使用完全不同于默認(rèn)格式的方式展示提交
歷史。比如用。nelin。將每個(gè)提交放在一行顯示,這在提交數(shù)很大時(shí)非常有用。另外還有
short,full和fuller可以用,展示的信息或多或少有些不同,請(qǐng)自己動(dòng)手實(shí)踐一下
看看效果如何。
$gitlog-pretty=onelineca82a6dff817ec66f44342007202690a93763949
changedtheversionnumber085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
removedunnecessarytestcodealIbef06a3f659402fe7563abf99ad00de2209e6
firstcommit
但最有意思的是format,可以定制要顯示的記錄格式,這樣的輸出便于后期編程提取分
析,像這樣:
$gitlog-pretty=format:-%an,%ar:恭s"ca82a6d-ScottChacon,
11monthsago:changedtheversionnumber085bb3b-ScottChacon,11
monthsago:removedunnecessarytestcodeallbefO-ScottChacon,11
monthsago:firstcommit
表2-1列出了常用的格式占位符寫法及其代表的意義。
選項(xiàng)說明%H提交對(duì)象(commit)的完整哈希字串%h提交對(duì)象的簡(jiǎn)短哈希字
串%T樹對(duì)象(tree)的完整哈希字串%t樹對(duì)象的簡(jiǎn)短哈希字串%P父對(duì)象
(parent)的完整哈希字串%p父對(duì)象的簡(jiǎn)短哈希寧串%an作者(author)的
名字%ae作者的電子郵件地址%ad作者修訂日期(可以用-date=選項(xiàng)定制
格式)%ar作者修訂日期,按多久以前的方式顯示%cn提交者(committer)的
名字%ce提交者的電子郵件地址%cd提交日期%cr提交日期,按多久以前的
方式顯示%s提交說明
你一定奇怪.作者(author)_和_提交者(committer).之間究竟有何差別,其實(shí)作者指的
是實(shí)際作出修改的人,提交者指的是最后將此工作成果提交到倉庫的人。所以,當(dāng)你為某
個(gè)項(xiàng)目發(fā)布補(bǔ)丁,然后某個(gè)核心成員將你的補(bǔ)丁并入項(xiàng)目時(shí),你就是作者,而那個(gè)核心成員
就是提交者。我們會(huì)在第五章再詳細(xì)介紹兩者之間的細(xì)微差別。
用oneline或format時(shí)結(jié)合一graph選項(xiàng),可以看到開頭多出一些ASCII字符串表
示的簡(jiǎn)單圖形,形象地展示了每個(gè)提交所在的分支及其分化衍合情況。在我們之前提到的
Grit項(xiàng)目倉庫中可以看到:
$gitlog-pretty=format:"%h%s"-graph*2d3acf9ignoreerrorsfrom
SIGCHLDontrap*5e3eel1Mergebranch,master*of
git://github.com/dustin/grit|\I*420eac9Addedamethodforgetting
thecurrentbranch.*|30e367ctimeoutcodeandtests*,5a09431add
timeoutprotectiontogrit*|ell93f8supportforheadswithslashes
inthem|/*d6016bcrequiretimeforxmlschema*1id191eMergebranch
'defunkt,intolocal
以上只是簡(jiǎn)單介紹了一些gitlog命令支持的選項(xiàng)。表2-2還列出了一些其他常用的選
項(xiàng)及其釋義。
選項(xiàng)說明-P按補(bǔ)丁格式顯示每個(gè)更新之間的差異。一stat顯示每次更新的
文件修改統(tǒng)計(jì)信息?!猻hortstat只顯示一stat中最后的行數(shù)修改添加移除
統(tǒng)計(jì)。-name-only僅在提交信息后顯示已修改的文件清單。一name-status
顯示新增、修改、刪除的文件清單。一abbrcv-commit僅顯示SHA-1的前幾
個(gè)字符,而非所有的40個(gè)字符。"relative-date使用較短的相對(duì)時(shí)間顯示
(比如,"2weeksago")。--graph顯示ASCII圖形表示的分支合并歷史。
—pretty使用其他格式顯示歷史提交信息??捎玫倪x項(xiàng)包括oneline,short,
full,fuller和format(后跟指定格式)。
限制輸出長(zhǎng)度
除了定制輸出格式的選項(xiàng)之外,gitlog還有許多非常實(shí)用的限制輸出長(zhǎng)度的選項(xiàng),也就
是只輸出部分提交信息。之前我們已經(jīng)看到過-2了,它只顯示最近的兩條提交,實(shí)際上,
這是一選項(xiàng)的寫法,其中的n可以是任何自然數(shù),表示僅顯示最近的若干條提交。不過
實(shí)踐中我們是不太用這個(gè)選項(xiàng)的,Git在輸出所有提交時(shí)會(huì)自動(dòng)調(diào)用分頁程序(less),要
看更早的更新只需翻到下頁即可。
另外還有按照時(shí)間作限制的選項(xiàng),比如一since和一until。下面的命令列出所有最近
兩周內(nèi)的提交:
$gitlog-since=2.weeks
你可以給出各種時(shí)間格式,比如說具體的某一天("2008-01-15"),或者是多久以前("2
years1day3minutessgo")。
還可以給出若干搜索條件,列出符合的提交。用一author選項(xiàng)顯示指定作者的提交,用
-grep選項(xiàng)搜索提交說明中的關(guān)鍵字。(請(qǐng)注意,如果要得到同時(shí)滿足這兩個(gè)選項(xiàng)搜索
條件的提交,就必須用一all-match選項(xiàng)。)
如果只關(guān)心某些文件或者目錄的歷史提交,可以在gitlog選項(xiàng)的最后指定它們的路徑。
因?yàn)槭欠旁谧詈笪恢蒙系倪x項(xiàng),所以用兩個(gè)短劃線(--)隔開之前的選項(xiàng)和后面限定的路
徑名。
表2-3還列出了其他常月的類似選項(xiàng)。
選項(xiàng)說明-(n)僅顯示最近的n條提交--since,--after僅顯示指定時(shí)間
之后的提交?!猽ntil,—before僅顯示指定時(shí)間之前的提交。一author僅
顯示指定作者相關(guān)的提交。一committer僅顯示指定提交者相關(guān)的提交。
來看一個(gè)實(shí)際的例子,如果要杳看Git倉庫中,2008年10月期間,Jimi。Hamano提
交的但未合并的測(cè)試腳本(位于項(xiàng)目的V目錄下的文件),可以用下面的直詢命令:
$gitlog-pretty="%h-%s”—author=gitster—since=”2008-10-01"\
-before=”2008--no-merges-t/5610e3b-Fixtestcasefailure
whenextendedattributeacd3b9e-Enhance
hold_lock_file_for_{update,append}()f563754-demonstratebreakageof
detachedcheckoutwidla43f2-reset-hard/read-tree-reset-u:remove
un51a94af-Fix“checkout-track-bnewbrar.ch,/ondctacbOadlle-pull:
allow"gilpullorigin$something:$cur
Git項(xiàng)目有20,000多條提交,但我們給出搜索選項(xiàng)后,僅列出了其中滿足條件的6條。
使用圖形化工具查閱提交歷史
有時(shí)候圖形化工具更容易展示歷史提交的變化,隨Git一同發(fā)布的gitk就是這樣一種工
具。它是用Tcl/Tk寫成的,基本上相當(dāng)于gitlog命令的可視化版本,凡是gitlog可
以用的選項(xiàng)也都能用在gitk上。在項(xiàng)目工作目錄中輸入gitk命令后,就會(huì)啟動(dòng)圖2-2所
示的界面。
圖2-2.gitk的圖形界面
上半個(gè)窗口顯示的是歷次提交的分支祖先圖譜,下半個(gè)窗口顯示當(dāng)前點(diǎn)選的提交對(duì)應(yīng)的具體
差異。
2.4撤消操作
件可時(shí)候,你都有可能需要撤消剛才所做的某些操作。接下來,我們會(huì)介紹一些基本的撤消
操作相關(guān)的命令。請(qǐng)注意,有些操作并不總是可以撤消的,所以請(qǐng)務(wù)必謹(jǐn)慎小心,一旦失誤,
就有可能丟失部分工作成果。
修改最后一次提交
有時(shí)候我們提交完了才發(fā)現(xiàn)漏掉了幾個(gè)文件沒有加,或者提交信息寫錯(cuò)了。想要撤消剛才的
提交操作,可以使用一amend選項(xiàng)重新提交:
$gitcommit-amend
此命令將使用當(dāng)前的暫存區(qū)域快照提交。如果剛才提交完沒有作任何改動(dòng),直接運(yùn)行此命令
的話,相當(dāng)于有機(jī)會(huì)重新編輯提交說明,但將要提交的文件快照和之前的一樣。
啟動(dòng)文本編輯器后,會(huì)看到上次提交時(shí)的說明,編輯它確認(rèn)沒問題后保存退出,就會(huì)使用新
的提交說明覆蓋剛才失誤的提交。
如果剛才提交時(shí)忘了暫存某些修改,可以先補(bǔ)上暫存操作,然后再運(yùn)行一amend提交:
$gitcommit-m'initialcommit1$gitaddforgottenfile$gitcommit
-amend
上面的三條命令最終只是產(chǎn)生一個(gè)提交,第二個(gè)提交命令修正了第一個(gè)的提交內(nèi)容。
取消已經(jīng)暫存的文件
接下來的兩個(gè)小節(jié)將演示如何取消暫存區(qū)域中的文件,以及如何取消工作目錄中已修改的文
件。不用擔(dān)心,杳看文件狀態(tài)的時(shí)候就提示了該如何撤消,所以不需要死記硬背。來看下面
的例子,有兩個(gè)修改過的文件,我們想要分開提交,但不小心用gitadd.全加到了暫存
區(qū)域。該如何撤消暫存其中的一個(gè)文件呢?其實(shí),gitstatus的命令輸出已經(jīng)告訴了我
們?cè)撛趺醋觯?/p>
$gitadd.$gitstatus#Onbranchmaster#Changestobecommitted:
#(use"gitresetHEAD...”tounstage)##modified:README,txt#modified:
benchmarks,rb#
就在"Changestobecommitted,,下面,括號(hào)中有提示,可以使用gitresetHEAD...
的方式取消暫存。好吧,我們來試試取消暫存benchmarks.rb文件:
$gitresetHEADbenchmarks,rbbenchmarks,rb:locallymodified$git
status#Onbranchmaster#Changestobecommitted:#(use〃gitreset
HEAD...”tounstage)##modified:README,txt##Changedbutnotupda:ed:
#(use"gitadd…"toupdatewhatwillbecommitted)#(use"gitcheckout
…"todiscardchangesinworkingdirectory)##modified:
benchmarks,rb#
這條命令看起來有些古怪,先別管,能用就行?,F(xiàn)在benchmarks.rb文件又回到了之前
已修改未暫存的狀態(tài)。
取消對(duì)文件的修改
如果覺得剛才對(duì)benchmarks.rb的修改完全沒有必要,該如何取消修改,回到之前的狀
態(tài)(也就是修改之前的版本)呢?gitstatus同樣提示了具體的撤消方法,接著上面的
例子,現(xiàn)在未暫存區(qū)域看起來像這樣:
itChangedbutnotupdated:力(useadd...”toupdatewhatwillbe
committed)#(use“gitcheckout-…〃todiscardchangesinworking
directory)##modified:benchmarks,rb#
在第二個(gè)括號(hào)中,我們看到了拋棄文件修改的命令(至少在Git1.6.1以及更高版本中會(huì)這
樣提示,如果你還在用老版本,我們強(qiáng)烈建議你升級(jí),以獲取最佳的用戶體驗(yàn)),讓我們?cè)?/p>
試看:
$gitcheckout-benchmarks,rb$gitstatus#Onbranchmaster#Changes
tobecommitted:#(use"gitresetHEAD...”tounstage)##modified:
README,txt#
可以看到,該文件已經(jīng)恢復(fù)到修改前的版本。你可能已經(jīng)意識(shí)到了,這條命令有些危險(xiǎn),所
有對(duì)文件的修改都沒有了,因?yàn)槲覀儎倓偘阎鞍姹镜奈募?fù)制過來重寫了此文件。所以
在用這條命令前,請(qǐng)務(wù)必璐定真的不再需要保留剛才的修改。如果只是想回退版本,同時(shí)保
留剛才的修改以便將來繼續(xù)工作,可以用下章介紹的stashing和分支來處理,應(yīng)該會(huì)更
好些。
記住,任何已經(jīng)提交到Git的都可以被恢復(fù)。即便在已經(jīng)刪除的分支中的提交,或者用
-amend重新改寫的提交,都可以被恢復(fù)(關(guān)于數(shù)據(jù)恢復(fù)的內(nèi)容見第九章)。所以,你可
能失去的數(shù)據(jù),僅限于沒有提交過的,對(duì)Git來說它們就像從未存在過一樣。
2.5遠(yuǎn)程倉庫的使用
要參與任何一個(gè)Git項(xiàng)目的協(xié)作,必須要了解該如何管理遠(yuǎn)程倉庫。遠(yuǎn)程倉庫是指托管在
網(wǎng)絡(luò)上的項(xiàng)目倉庫,可能會(huì)有好多個(gè),其中有些你只能讀,另外有些可以寫。同他人協(xié)作開
發(fā)某個(gè)項(xiàng)目時(shí),需要管理這些遠(yuǎn)程倉庫,以便推送或拉取數(shù)據(jù),分享各自的工作進(jìn)展。管
理遠(yuǎn)程倉庫的工作,包括添加遠(yuǎn)程庫,移除廢棄的遠(yuǎn)程麻,管理各式遠(yuǎn)程庫分支,定義是
否跟蹤這些分支,等等。本節(jié)我們將詳細(xì)討論遠(yuǎn)程庫的管理和使用。
查看當(dāng)前的遠(yuǎn)程庫
要查看當(dāng)前配置有哪些遠(yuǎn)程倉庫,可以用gitremote命令,它會(huì)列出每個(gè)遠(yuǎn)程庫的簡(jiǎn)短
名字。在克隆完某個(gè)項(xiàng)目后,至少可以看到一個(gè)名為origin的遠(yuǎn)程庫,Git默認(rèn)使用這個(gè)
名字來標(biāo)識(shí)你所克隆的原始倉庫:
$gitclonegit://github.com/schacon/ticgi:.gitInitializedemptyGit
repositoryin/privcte/tnip/ticgit/.git/remote:Countingobjects:595,
done,remote:Compressingobjects:100%(269/269),done,remote:Total
595(delta255),reused589(delta253)Receivingobjects:100%(595/595),
73.31KiB1KiB/s,done.Resolvingdeltas:100%(255/255),done.$cd
ticgit$gitremoteorigin
也可以加上-v選項(xiàng)(譯注:此為一verbose的簡(jiǎn)寫,取首字母),顯示對(duì)應(yīng)的克隆地
址:
$gitremote-vorigingit://github.com/schacon/ticgit.git
如果有多個(gè)遠(yuǎn)程倉庫,此命令將全部列出。比如在我的Grit項(xiàng)目中,可以看到:
$cdgrit$gitremote-vbakkdoorgit://github.com/bakkdoor/grit.git
clio45giI://gilliub.com/uho45/griI.giIdefuukl
git://github.com/defunkt/grit.gitkokcgit://github.com/koke/grit.git
origingit@github.com:mojombo/grit,git
這樣一來,我就可以非常經(jīng)松地從這些用戶的倉庫中,拉取他們的提交到本地。請(qǐng)注意,上
面列出的地址只有origin用的是SSHURL鏈接,所以也只有這個(gè)倉庫我能推送數(shù)據(jù)上去
(我們會(huì)在第四章解釋原因)。
添加遠(yuǎn)程倉庫
要添加一個(gè)新的遠(yuǎn)程倉庫,可以指定一個(gè)簡(jiǎn)單的名字,以便將來引用,運(yùn)行g(shù)itremote
add[shortname][url]:
$gitremoteorigin$gitremoteaddpb
git://github.com/paulboone/ticgit.git$gitremote
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026 年中職經(jīng)濟(jì)與管理基礎(chǔ)(經(jīng)濟(jì)基礎(chǔ))試題及答案
- 高考總復(fù)習(xí)優(yōu)化設(shè)計(jì)二輪用書英語A 考點(diǎn)分類練7 詞句猜測(cè)題
- 辦公樓轉(zhuǎn)讓合同協(xié)議2025年
- 辦公隔斷安裝合同協(xié)議2025年
- 基于機(jī)器學(xué)習(xí)的軟件故障預(yù)測(cè)方法
- 多模態(tài)數(shù)據(jù)融合感知系統(tǒng)
- 2025年河北省公需課學(xué)習(xí)-《中華人民共和國著作權(quán)法修訂》解讀
- 2025年幼教考編填空題200道
- 國標(biāo)汽車構(gòu)造試題及答案
- 第六單元 微專題 圓中最值問題
- 醫(yī)院舊樓電氣系統(tǒng)安全升級(jí)改造方案
- 青海某公司二期15萬噸電解鋁工程施工組織設(shè)計(jì)
- 良好心態(tài)的培養(yǎng)課件
- 2025年6月重慶普通高中學(xué)業(yè)水平選擇性考試英語試題(原卷)含答案
- 2025-2026學(xué)年湘魯版(2024)小學(xué)英語四年級(jí)上冊(cè)(全冊(cè))教學(xué)設(shè)計(jì)(附目錄)
- (正式版)DB35∕T 1393-2025 《縣級(jí)以下自然災(zāi)害應(yīng)急避難場(chǎng)所分級(jí)建設(shè)與管理規(guī)范》
- 煙草零售戶法律培訓(xùn)
- 《老年人能力評(píng)估師》三級(jí)練習(xí)題庫及參考答案
- 鍋爐的定期排污(定排)和連續(xù)排污(連排)區(qū)別
- DZ/T 0227-2010地質(zhì)巖心鉆探規(guī)程
- T/CTWPDA 08-2019木材與木制品供應(yīng)商管理規(guī)范
評(píng)論
0/150
提交評(píng)論