【Git】第三章 起步

第3章 起步

Git负责管理变化。鉴于这一意图,Git与其他版本控制系统有许多共同点:许多原则一提交的概念、变更日志、版本库——是一样的,工作流在概念上也是相似的。不过, Git还提供了许多新奇事物。其他版本控制系统的观念和做法可能在Git上有所不同,甚至可能根本不能用。但无论你经验多少,本书会介绍Git是怎样工作的并使你精通此道。
让我们开始吧。

总结在前

.在UNIX中是当前目录的简写
ctrl+d强制退出命令行。
无论是git add还是git rm还是git mv。修改后都需要commit这个暂存的修改。commit 可以-m追加日志信息,也可以不-m,通过设定的EDITOR交互式编辑日志。

3.1 Git命令行

Git简单易用。只要输入git. Git就会不带任何参数地列出它的选项和最常用的子命令:
在这里插入图片描述
要得到一个完整(有点让人生畏)的git子命令列表,可以输入git help -all
为方便起见,每个git子命令的文档都可以通过使用git help subcommandgit --help subcommand 或者 git subcommand --help 来查看。

从历史上来看,Git是作为一套简单的、独特的、独立的命令提供的,并按照“UNIX 工具包”的哲学来开发的:打造小的、可互操作的工具。每条命令都留有一个带连字符的名字,如git-commitgit-log。而现在开发人员之间的趋势是使用一条简单的可执行的git命令并附加上子命令。但话虽如此,git commitgit-commit形式上是相同的。

可以访问 http://www.kernel.org/pub/software/scm/git/docs/来在线阅读完整的Git文档。
Git的命令能够理解“短”和“长”的选项。例如,git commit命令将下面两条命令视为等价的。

$ git commit -m "Fixed a typo."
$ git commit --message="Fixed a typo."

缩写形式-m使用了一个连字符,而长形式–message使用了两个连字符(这符合GNU 的长选项扩展),有些选项只存在一种形式。
可以通过“裸双破折号”的约定来分离一系列参数。例如,使用双破折号来分离命令行的控制部分与操作数部分,如文件名。

$ git diff -w master origin -- tools/Makefile

使用双破折号分离并显式标识文件名,否则可能会误认为它们是命令的另一部分。
例如,如果你碰巧有一个文件和一个标签都叫main.c。

#Checkout the tag named "main.c”
$ git checkout main.c
#Checkout the file named "main.c”
$ git checkout -- main.c

3.2 Git使用快速入门

为了实际见识Git的操作,让我们新建一个版本库,添加一些内容,然后管理一些修 订版本。
有两种建立Git版本库的基础技术。可以从头开始创建,用现有的内容填充它或者可以复制(或叫克隆)一个已有的版本库。从一个空的版本库开始比较简单,所以由此开始吧。

3.2.1创建初始版本库

〜/public_html目录创建你的个人网站,并把它放到Git版本库里,模拟一种典型情况。
如果你在〜/public_html的个人网站还没有任何内容,那就新建一个目录,并将一些简单的内容放到index.html里。
我们先打开Git Bash
切换一个盘

cd d://

在这里插入图片描述

$ mkdir ./public_html
$ cd ./public_html
$ echo 'My website is alive!' > index.html

在这里插入图片描述
执行git init,~/public_html或者任何目录转化为Git版本库
在这里插入图片描述Git不关心你是从一个完全空白的目录还是由一个装满文件的目录开始的 在这两种情 况下,将目录转换到Git版本库的过程是一样的、 为了显示目录是一个Git版本库,git init命令创建了一个隐藏目录,在项目的顶层目录, 名为.git
而CVS和SVN则将修订版本信息放在项目的每一个目录下的CVS.svn子 目录里。
~/public_html目录下的一切都保持不变。Git将这个目录当做项目的工作目录,或者修改文件的目录。相反,隐藏在.git内的版本库由Git维护。

3.2.2 将文件添加到版本库中

git init命令创建一个新的Git版本库。最初,每个Git版本库都是空的。为了管理内容,你必须明确地把它放入版本库中。这种有意识的步骤将重要文件与临时文件分离开来。
使用git add任将file添加到版本库中。

$git add index.html

如果目录中已经有了很多文件,使用git add .命令让Git把当前目录及子目录中的文件都添加到版本库里(参数“.”,点或者UNIX说法中的“dot”, 是当前目录的简写)。
在add之后,Git知道index.html这个文件是要留在版本库里的。然而,到目前为止, Git还只是暂存**(staged )** 了这个文件,这是提交之前的中间步骤。Git将add和commit 这两步分开,以避免频繁变化。
运行git status命令,显示中间状态的index.html
还未添加文件到库中
add了一个文件到版本库中
这个命令显示新文件index.html将在下一次提交的时候添加到版本库里
除了目录和文件内容的实际变化,Git还会在每次提交的时候记录其他一些元数据包
括日志消息和做出本次变更的作者。一条完全限定的git commit命令必须提供日志消息和作者

$ git commit -m "Initial contents of public_html" \
--author="Jon Loeliger <jdl@example.com>"

在这里插入图片描述
可以在命令行中提供一条日志消息,但是更典型的做法是在交互式编辑器会话期间创建消息。这样,你将能够在你最喜欢的编辑器里编写一条完整而且详细的日志消息。为了在git commit期间让Git打开你最爱的编辑器,要设置你的GIT EDITOR环境变量。

#在tcsh中
$ setenv GIT_EDITOR emacs
#在bash中
$ export GIT_EDITOR=vim

在这里插入图片描述
这下git status就没有了突出的,暂存的变更需要提交。
在这里插入图片描述

3.2.3 配置提交作者

在对版本库做多次提交之前,你应该建立一些基本环境和配置选项。最为基本的是, Git必须知道你的名字和email地址。如之前展示的,你可以在每次提交的命令行中指定你的身份,但这是非常困难的方式,而且很快会让人厌烦。
相反,可以用git config命令在配置文件里保存你的身份。

$ git config user.name "Jon Loeliger"
$ git config user.email "jdl@example.com"

也可以使用GIT AUTHOR NAMEGIT_AUTHOR_EMAIL环境变量来告诉Git你的姓名和email地址。这些变量一旦设置就会覆盖所有的配置设置。

3.2.4 再次提交

在这个版本库里创建一个复杂的变更历史。
来提交一次对index.html文件的修改。打开这个文件,转换成HTML并保存。

$ cd ./public__html
#编辑index.html文件
$ cat index.html
<html>
<body>
My web site is alive!
</body>
</html>
$ git commit index.html

如果你已经对Git有些熟悉了,你可能会想“啊哈!在能commit这个文件之前,你需要执行git add index.html。但这样做是不对的。因为这个文件已添加到版本库里了,没有必要再把这个文件告诉给索引,它已经知道了。此外,当在命令行里直接提交一个命名的文件时,文件的变更会自动捕捉!而使用没有命名文件的一般git commit就不会在这种情况下起作用。

3.2.5查看提交

一旦在版本库里有了提交,就可以通过多种方式查看它们。有些Git命令显示出单独提交的序列有的显示出一次提交的摘要,还有的则会显示出版本库里每次提交的所有细节
git log命令会产生版本库里一系列单独提交的历史。
在这里插入图片描述

条目按照从最新的到最老的顺序罗列出来’;每个条目显示了提交作者的名字和email 地址,提交日期变更的日志信息和提交的内部识别码
为了查看特定提交的更加详细的信息,可以使用git show命令带一个提交码:

$ git show 9da581d910c9c4ac93557ca4859e767f5caf5169

如果在执行git show命令的时候没有显式指定提交码,它将只显示最近一次提交的详细信息。另一种查看方式是使用show-branch ,提供当前开发分支简洁的单行摘要。$ git show-branch --more=10
参数more=lO,'表示额外10个版本,但是因为只有两个版本’所以显示了两种(这种情况下,默认只列出最新的提交)。master这个名字是默认的分支名。

在这里插入图片描述

3.2.6查看提交差异

为了查看index.html两个版本之间的差异,使用两个提交的全ID名并且运行git diff

$ git diff 9da581d910c9c4ac93557ca4859e767f5caf5169 \ 		ec232cddfb94p0dfd5b5955af8ded7f5eb5c90d6

这个输出看起来应该非常熟悉:这跟diff程序的输出非常相似。按照惯例,名为 9da581 d910c9c4ac93557ca4859e767f5caf5169的第一次修订版本是早期版本,名为 ec232cddfb94e0dfd5b5855af8ded7f5eb5c90d6的第二次修订版本是较新的版本。因此, 每行新内容前面都有一个加号(+ )

3.2.7版本库内文件的删除和重命名

从版本库里删除一个文件与添加一个文件是类似的,除了使用的命令是git rm。假设在 你的网站里有一个不再需要的文件:poem.html ,你可以这样做。
在这里插入图片描述

$ cd -*/public__html
$ Is
index.html poem.html
$ git rm poem.html
rm 'poem.html'
$ git commit -m "Remove a poem"
Created commit 364a708: Remove a poem
0 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 poem.html

和添加操作一样,删除操作也需要两步:

  • git rm表示你想要删除这个文件的意图并暂存这个变更。
  • 接着git commit在版本库里实现这个变更。同样,可以省略-m选项,然后在 你最喜欢的文本编辑器中以交互方式输入日志消息(如"Remove a poem")。
    可以通过git rm和git add组合命令来间接为一个文件重命名,也可以更快而直接地通 过gitmv命令来做到。这里是前者的一个例子。
$ mv foo.html bar,html
$ git rm foo.html
rm 'foo.html1
$ git add bar.html

在这个序列里,必须先执行mv foo.html bar.html,以防git rm命令会把foo.html从文件系统中永久删除。
这是使用git mv的相同操作:

$ git mv foo.html bar.html

在任一情况下,暂存的变更必须随后进行提交。

3.2.8 创建版本库副本

如果按照上述步骤操作,并且在〜/public_html目录中已经建立了一个初始版本库,就可以通过git clone命令创建一个完整的副本,或叫克隆。这就是世界各地的人们如何通 过Git在相同的文件上从事他们喜欢的项目,并保持与其他版本库同步。
为了达到本教程的目的,在主目录里建立一个副本,并命名为my website
在这里插入图片描述

$ cd ~
$ git clone public_html my_website

虽然这两个Git版本库现在包含相同的对象、文件和目录,但是还有一些细微的差别, 如果你想要探索其中的不同之处,可以使用以下这些命令。
在这里插入图片描述

$ ls -lsa public_html my_website
$ diff -r public_html my_website

在这里插入图片描述

在这样的一个本地文件系统中,使用git clone命令来创建一个版本库副本和使用cp -arsync非常相似。但是,Git支持一组丰富的版本库源,包括网络名(为了命名将要复制的版本库)。
一旦复制了一个版本库,就可以修改这个复制版本、做出新的提交、查看它的日志和历史等。这是一个有着完整历史的版本库

3.3 配置文件

因为配置文件只是简单的文本文件,所以可以通过cat命令来查看其内容,也可以通过你最喜欢的文本编辑器来编辑它。
可以使用-unset选项来移除设置。

$ git config --unset --global user.email

多个配置选项和环境变量常常是为了同一个目的出现的。例如,在编写提交日志消息的时候,编辑器的选择按照以下步骤的顺序确定
•GIT_EDITOR环境变量;
•core.editor 配置选项;
•VISUAL环境变量;
•EDITOR环境变量;
•vi命令;

配置别名
对初学者来说,这有一个设置命令別名的提示。如果你经常输入一条常用而复杂的Git 命令,可以考虑为它设置一个简单的Git别名。

$ git config --global alias.show-graph \
'log --graph --abbrev-commit --pretty=oneline'

在这个例子中,我创建了 show-graph別名,并能够被我创建的任意版本库所使用。现 在,当我使用git show-graph命令时,就如同我已经输入了带所有选项的长长的git log 命令一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值