Git学习笔记简易版.docx
- 文档编号:6132441
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:67
- 大小:496.63KB
Git学习笔记简易版.docx
《Git学习笔记简易版.docx》由会员分享,可在线阅读,更多相关《Git学习笔记简易版.docx(67页珍藏版)》请在冰豆网上搜索。
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
README
nothingaddedtocommitbutuntrackedfilespresent(use"gitadd"totrack)
在状态报告中可以看到新建的README文件出现在“Untrackedfiles”下面。
未跟踪的文件意味着Git在之前的快照(提交)中没有这些文件;Git不会自动将之纳入跟踪范围,除非你明明白白地告诉它“我需要跟踪该文件”,因而不用担心把临时文件什么的也归入版本管理。
不过现在的例子中,我们确实想要跟踪管理README这个文件。
跟踪新文件
使用命令gitadd开始跟踪一个新文件。
所以,要跟踪README文件,运行:
$gitaddREADME
此时再运行gitstatus命令,会看到README文件已被跟踪,并处于暂存状态:
$gitstatus
Onbranchmaster
Changestobecommitted:
(use"gitresetHEAD
newfile:
README
只要在“Changestobecommitted”这行下面的,就说明是已暂存状态。
如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中。
你可能会想起之前我们使用gitinit后就运行了gitadd命令,开始跟踪当前目录下的文件。
在gitadd后面可以指明要跟踪的文件或目录路径。
如果是目录的话,就说明要递归跟踪该目录下的所有文件。
(译注:
其实gitadd的潜台词就是把目标文件快照放入暂存区域,也就是addfileintostagedarea,同时未曾跟踪过的文件标记为需要跟踪。
这样就好理解后续add操作的实际意义了。
)
暂存已修改文件
现在我们修改下之前已跟踪过的文件benchmarks.rb,然后再次运行status命令,会看到这样的状态报告:
$gitstatus
Onbranchmaster
Changestobecommitted:
(use"gitresetHEAD
newfile:
README
Changesnotstagedforcommit:
(use"gitadd
(use"gitcheckout--
modified:
benchmarks.rb
文件benchmarks.rb出现在“Changesnotstagedforcommit”这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。
要暂存这次更新,需要运行gitadd命令(这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:
可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等)。
现在让我们运行gitadd将benchmarks.rb放到暂存区,然后再看看gitstatus的输出:
$gitaddbenchmarks.rb
$gitstatus
Onbranchmaster
Changestobecommitted:
(use"gitresetHEAD
newfile:
README
modified:
benchmarks.rb
现在两个文件都已暂存,下次提交时就会一并记录到仓库。
假设此时,你想要在benchmarks.rb里再加条注释,重新编辑存盘后,准备好提交。
不过且慢,再运行gitstatus看看:
$vimbenchmarks.rb
$gitstatus
Onbranchmaster
Changestobecommitted:
(use"gitresetHEAD
newfile:
README
modified:
benchmarks.rb
Changesnotstagedforcommit:
(use"gitadd
(use"gitcheckout--
modified:
benchmarks.rb
怎么回事?
benchmarks.rb文件出现了两次!
一次算未暂存,一次算已暂存,这怎么可能呢?
好吧,实际上Git只不过暂存了你运行gitadd命令时的版本,如果现在提交,那么提交的是添加注释前的版本,而非当前工作目录中的版本。
所以,运行了gitadd之后又作了修订的文件,需要重新运行gitadd把最新版本重新暂存起来:
$gitaddbenchmarks.rb
$gitstatus
Onbranchmaster
Changestobecommitted:
(use"gitresetHEAD
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
newfile:
README
Changesnotstagedforcommit:
(use"gitadd
(use"gitcheckout--
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
modified:
benchmarks.rb
Changesnotstagedforcommit:
(use"gitadd
(use"gitcheckout--
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
(use"gitcheckout--
modified:
benchmarks.rb
nochangesaddedtocommit(use"gitadd"and/or"gitcommit-a")
$gitcommit-a-m'addednewb
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Git 学习 笔记 简易