Git学习笔记简易版.docx

上传人:b****5 文档编号:6132441 上传时间:2023-01-04 格式:DOCX 页数:67 大小:496.63KB
下载 相关 举报
Git学习笔记简易版.docx_第1页
第1页 / 共67页
Git学习笔记简易版.docx_第2页
第2页 / 共67页
Git学习笔记简易版.docx_第3页
第3页 / 共67页
Git学习笔记简易版.docx_第4页
第4页 / 共67页
Git学习笔记简易版.docx_第5页
第5页 / 共67页
点击查看更多>>
下载资源
资源描述

Git学习笔记简易版.docx

《Git学习笔记简易版.docx》由会员分享,可在线阅读,更多相关《Git学习笔记简易版.docx(67页珍藏版)》请在冰豆网上搜索。

Git学习笔记简易版.docx

Git学习笔记简易版

2.1Git基础-取得项目的Git仓库

取得项目的Git仓库

有两种取得Git项目仓库的方法。

第一种是在现存的目录下,通过导入所有文件来创建新的Git仓库。

第二种是从已有的Git仓库克隆出一个新的镜像仓库来。

在工作目录中初始化新仓库

要对现有的某个项目开始用Git管理,只需到此项目所在的目录,执行:

$gitinit

初始化后,在当前目录下会出现一个名为.git的目录,所有Git需要的数据和资源都存放在这个目录中。

不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件。

(在第九章我们会详细说明刚才创建的.git目录中究竟有哪些文件,以及都起些什么作用。

如果当前目录下有几个文件想要纳入版本控制,需要先用gitadd命令告诉Git开始对这些文件进行跟踪,然后提交:

$gitadd*.c

$gitaddREADME

$gitcommit-m'initialprojectversion'

稍后我们再逐一解释每条命令的意思。

不过现在,你已经得到了一个实际维护着若干文件的Git仓库。

从现有仓库克隆

如果想对某个开源项目出一份力,可以先把该项目的Git仓库复制一份出来,这就需要用到gitclone命令。

如果你熟悉其他的VCS比如Subversion,你可能已经注意到这里使用的是clone而不是checkout。

这是个非常重要的差别,Git收取的是项目历史的所有数据(每一个文件的每一个版本),服务器上有的数据克隆之后本地也都有了。

实际上,即便服务器的磁盘发生故障,用任何一个克隆出来的客户端都可以重建服务器上的仓库,回到当初克隆时的状态(虽然可能会丢失某些服务器端的挂钩设置,但所有版本的数据仍旧还在,有关细节请参考第四章)。

克隆仓库的命令格式为gitclone[url]。

比如,要克隆Ruby语言的Git代码仓库Grit,可以用下面的命令:

$gitclonegit:

//

这会在当前目录下创建一个名为grit的目录,其中包含一个.git的目录,用于保存下载下来的所有版本记录,然后从中取出最新版本的文件拷贝。

如果进入这个新建的grit目录,你会看到项目中的所有文件已经在里边了,准备好后续的开发和使用。

如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:

$gitclonegit:

//mygrit

唯一的差别就是,现在新建的目录成了mygrit,其他的都和上边的一样。

Git支持许多数据传输协议。

之前的例子使用的是git:

//协议,不过你也可以用http(s):

//或者user@server:

/path.git表示的SSH传输协议。

我们会在第四章详细介绍所有这些协议在服务器端该如何配置使用,以及各种方式之间的利弊。

2.2Git基础-记录每次更新到仓库

记录每次更新到仓库

现在我们手上已经有了一个真实项目的Git仓库,并从这个仓库中取出了所有文件的工作拷贝。

接下来,对这些文件作些修改,在完成了一个阶段的目标之后,提交本次更新到仓库。

请记住,工作目录下面的所有文件都不外乎这两种状态:

已跟踪或未跟踪。

已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区。

而所有其他文件都属于未跟踪文件。

它们既没有上次更新时的快照,也不在当前的暂存区域。

初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。

在编辑过某些文件之后,Git将这些文件标为已修改。

我们逐步把这些修改过的文件放到暂存区域,直到最后一次性提交所有这些暂存起来的文件,如此重复。

所以使用Git时的文件状态变化周期如图2-1所示。

图2-1.文件的状态变化周期

检查当前文件状态

要确定哪些文件当前处于什么状态,可以用gitstatus命令。

如果在克隆仓库之后立即执行此命令,会看到类似这样的输出:

$gitstatus

Onbranchmaster

nothingtocommit,workingdirectoryclean

这说明你现在的工作目录相当干净。

换句话说,所有已跟踪文件在上次提交后都未被更改过。

此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪的新文件,否则Git会在这里列出来。

最后,该命令还显示了当前所在的分支是master,这是默认的分支名称,实际是可以修改的,现在先不用考虑。

下一章我们就会详细讨论分支和引用。

现在让我们用vim创建一个新文件README,保存退出后运行gitstatus会看到该文件出现在未跟踪文件列表中:

$vimREADME

$gitstatus

Onbranchmaster

Untrackedfiles:

(use"gitadd..."toincludeinwhatwillbecommitted)

README

nothingaddedtocommitbutuntrackedfilespresent(use"gitadd"totrack)

在状态报告中可以看到新建的README文件出现在“Untrackedfiles”下面。

未跟踪的文件意味着Git在之前的快照(提交)中没有这些文件;Git不会自动将之纳入跟踪范围,除非你明明白白地告诉它“我需要跟踪该文件”,因而不用担心把临时文件什么的也归入版本管理。

不过现在的例子中,我们确实想要跟踪管理README这个文件。

跟踪新文件

使用命令gitadd开始跟踪一个新文件。

所以,要跟踪README文件,运行:

$gitaddREADME

此时再运行gitstatus命令,会看到README文件已被跟踪,并处于暂存状态:

$gitstatus

Onbranchmaster

Changestobecommitted:

(use"gitresetHEAD..."tounstage)

newfile:

README

只要在“Changestobecommitted”这行下面的,就说明是已暂存状态。

如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中。

你可能会想起之前我们使用gitinit后就运行了gitadd命令,开始跟踪当前目录下的文件。

在gitadd后面可以指明要跟踪的文件或目录路径。

如果是目录的话,就说明要递归跟踪该目录下的所有文件。

(译注:

其实gitadd的潜台词就是把目标文件快照放入暂存区域,也就是addfileintostagedarea,同时未曾跟踪过的文件标记为需要跟踪。

这样就好理解后续add操作的实际意义了。

暂存已修改文件

现在我们修改下之前已跟踪过的文件benchmarks.rb,然后再次运行status命令,会看到这样的状态报告:

$gitstatus

Onbranchmaster

Changestobecommitted:

(use"gitresetHEAD..."tounstage)

newfile:

README

Changesnotstagedforcommit:

(use"gitadd..."toupdatewhatwillbecommitted)

(use"gitcheckout--..."todiscardchangesinworkingdirectory)

modified:

benchmarks.rb

文件benchmarks.rb出现在“Changesnotstagedforcommit”这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。

要暂存这次更新,需要运行gitadd命令(这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:

可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等)。

现在让我们运行gitadd将benchmarks.rb放到暂存区,然后再看看gitstatus的输出:

$gitaddbenchmarks.rb

$gitstatus

Onbranchmaster

Changestobecommitted:

(use"gitresetHEAD..."tounstage)

newfile:

README

modified:

benchmarks.rb

现在两个文件都已暂存,下次提交时就会一并记录到仓库。

假设此时,你想要在benchmarks.rb里再加条注释,重新编辑存盘后,准备好提交。

不过且慢,再运行gitstatus看看:

$vimbenchmarks.rb

$gitstatus

Onbranchmaster

Changestobecommitted:

(use"gitresetHEAD..."tounstage)

newfile:

README

modified:

benchmarks.rb

Changesnotstagedforcommit:

(use"gitadd..."toupdatewhatwillbecommitted)

(use"gitcheckout--..."todiscardchangesinworkingdirectory)

modified:

benchmarks.rb

怎么回事?

benchmarks.rb文件出现了两次!

一次算未暂存,一次算已暂存,这怎么可能呢?

好吧,实际上Git只不过暂存了你运行gitadd命令时的版本,如果现在提交,那么提交的是添加注释前的版本,而非当前工作目录中的版本。

所以,运行了gitadd之后又作了修订的文件,需要重新运行gitadd把最新版本重新暂存起来:

$gitaddbenchmarks.rb

$gitstatus

Onbranchmaster

Changestobecommitted:

(use"gitresetHEAD..."tounstage)

newfile:

README

modified:

benchmarks.rb

忽略某些文件

一般我们总会有些文件无需纳入Git的管理,也不希望它们总出现在未跟踪文件列表。

通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。

我们可以创建一个名为.gitignore的文件,列出要忽略的文件模式。

来看一个实际的例子:

$cat.gitignore

*.[oa]

*~

第一行告诉Git忽略所有以.o或.a结尾的文件。

一般这类对象文件和存档文件都是编译过程中出现的,我们用不着跟踪它们的版本。

第二行告诉Git忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如Emacs)都用这样的文件名保存副本。

此外,你可能还需要忽略log,tmp或者pid目录,以及自动生成的文档等等。

要养成一开始就设置好.gitignore文件的习惯,以免将来误提交这类无用的文件。

文件.gitignore的格式规范如下:

∙所有空行或者以注释符号#开头的行都会被Git忽略。

∙可以使用标准的glob模式匹配。

∙匹配模式最后跟反斜杠(/)说明要忽略的是目录。

∙要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!

)取反。

所谓的glob模式是指shell所使用的简化了的正则表达式。

星号(*)匹配零个或多个任意字符;[abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个a,要么匹配一个b,要么匹配一个c);问号(?

)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如[0-9]表示匹配所有0到9的数字)。

我们再看一个.gitignore文件的例子:

#此为注释–将被Git忽略

#忽略所有.a结尾的文件

*.a

#但lib.a除外

!

lib.a

#仅仅忽略项目根目录下的TODO文件,不包括subdir/TODO

/TODO

#忽略build/目录下的所有文件

build/

#会忽略doc/notes.txt但不包括doc/server/arch.txt

doc/*.txt

#ignoreall.txtfilesinthedoc/directory

doc/**/*.txt

A**/patternisavailableinGitsinceversion1.8.2.

查看已暂存和未暂存的更新

实际上gitstatus的显示比较简单,仅仅是列出了修改过的文件,如果要查看具体修改了什么地方,可以用gitdiff命令。

稍后我们会详细介绍gitdiff,不过现在,它已经能回答我们的两个问题了:

当前做的哪些更新还没有暂存?

有哪些更新已经暂存起来准备好了下次提交?

gitdiff会使用文件补丁的格式显示具体添加和删除的行。

假如再次修改README文件后暂存,然后编辑benchmarks.rb文件后先别暂存,运行status命令将会看到:

$gitstatus

Onbranchmaster

Changestobecommitted:

(use"gitresetHEAD..."tounstage)

newfile:

README

Changesnotstagedforcommit:

(use"gitadd..."toupdatewhatwillbecommitted)

(use"gitcheckout--..."todiscardchangesinworkingdirectory)

modified:

benchmarks.rb

要查看尚未暂存的文件更新了哪些部分,不加参数直接输入gitdiff:

$gitdiff

diff--gita/benchmarks.rbb/benchmarks.rb

index3cb747f..da65585100644

---a/benchmarks.rb

+++b/benchmarks.rb

@@-36,6+36,10@@defmain

@commit.parents[0].parents[0].parents[0]

end

+run_code(x,'commits1')do

+mits.size

+end

+

run_code(x,'commits2')do

log=mits('master',15)

log.size

此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。

若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用gitdiff--cached命令。

(Git1.6.1及更高版本还允许使用gitdiff--staged,效果是相同的,但更好记些。

)来看看实际的效果:

$gitdiff--cached

diff--gita/READMEb/README

newfilemode100644

index0000000..03902a1

---/dev/null

+++b/README2

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

+grit

+byTomPreston-Werner,ChrisWanstrath

+

+

+GritisaRubylibraryforextractinginformationfromaGitrepository

请注意,单单gitdiff不过是显示还没有暂存起来的改动,而不是这次工作和上次提交之间的差异。

所以有时候你一下子暂存了所有更新过的文件后,运行gitdiff后却什么也没有,就是这个原因。

像之前说的,暂存benchmarks.rb后再编辑,运行gitstatus会看到暂存前后的两个版本:

$gitaddbenchmarks.rb

$echo'#testline'>>benchmarks.rb

$gitstatus

Onbranchmaster

Changestobecommitted:

(use"gitresetHEAD..."tounstage)

modified:

benchmarks.rb

Changesnotstagedforcommit:

(use"gitadd..."toupdatewhatwillbecommitted)

(use"gitcheckout--..."todiscardchangesinworkingdirectory)

modified:

benchmarks.rb

现在运行gitdiff看暂存前后的变化:

$gitdiff

diff--gita/benchmarks.rbb/benchmarks.rb

indexe445e28..86b2f7c100644

---a/benchmarks.rb

+++b/benchmarks.rb

@@-127,3+127,4@@end

main()

##ppGrit:

:

GitRuby.cache_client.stats

+#testline

然后用gitdiff--cached查看已经暂存起来的变化:

$gitdiff--cached

diff--gita/benchmarks.rbb/benchmarks.rb

index3cb747f..e445e28100644

---a/benchmarks.rb

+++b/benchmarks.rb

@@-36,6+36,10@@defmain

@commit.parents[0].parents[0].parents[0]

end

+run_code(x,'commits1')do

+mits.size

+end

+

run_code(x,'commits2')do

log=mits('master',15)

log.size

提交更新

现在的暂存区域已经准备妥当可以提交了。

在此之前,请一定要确认还有什么修改过的或新建的文件还没有gitadd过,否则提交的时候不会记录这些还没暂存起来的变化。

所以,每次准备提交前,先用gitstatus看下,是不是都已暂存起来了,然后再运行提交命令gitcommit:

$gitcommit

这种方式会启动文本编辑器以便输入本次提交的说明。

(默认会启用shell的环境变量$EDITOR所指定的软件,一般都是vim或emacs。

当然也可以按照第一章介绍的方式,使用gitconfig--globalcore.editor命令设定你喜欢的编辑软件。

编辑器会显示类似下面的文本信息(本例选用Vim的屏显方式展示):

#Pleaseenterthecommitmessageforyourchanges.Linesstarting

#with'#'willbeignored,andanemptymessageabortsthecommit.

#Onbranchmaster

#Changestobecommitted:

#newfile:

README

#modified:

benchmarks.rb

#

~

~

~

".git/COMMIT_EDITMSG"10L,283C

可以看到,默认的提交消息包含最后一次运行gitstatus的输出,放在注释行里,另外开头还有一空行,供你输入提交说明。

你完全可以去掉这些注释行,不过留着也没关系,多少能帮你回想起这次更新的内容有哪些。

(如果觉得这还不够,可以用-v选项将修改差异的每一行都包含到注释中来。

)退出编辑器时,Git会丢掉注释行,将说明内容和本次更新提交到仓库。

另外也可以用-m参数后跟提交说明的方式,在一行命令中提交更新:

$gitcommit-m"Story182:

Fixbenchmarksforspeed"

[master463dc4f]Story182:

Fixbenchmarksforspeed

2fileschanged,3insertions(+)

createmode100644README

好,现在你已经创建了第一个提交!

可以看到,提交后它会告诉你,当前是在哪个分支(master)提交的,本次提交的完整SHA-1校验和是什么(463dc4f),以及在本次提交中,有多少文件修订过,多少行添改和删改过。

记住,提交时记录的是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理。

每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。

跳过使用暂存区域

尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。

Git提供了一个跳过使用暂存区域的方式,只要在提交的时候,给gitcommit加上-a选项,Git就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过gitadd步骤:

$gitstatus

Onbranchmaster

Changesnotstagedforcommit:

(use"gitadd..."toupdatewhatwillbecommitted)

(use"gitcheckout--..."todiscardchangesinworkingdirectory)

modified:

benchmarks.rb

nochangesaddedtocommit(use"gitadd"and/or"gitcommit-a")

$gitcommit-a-m'addednewb

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1