献给初学者的10个Git技巧

时间:2021-05-01 04:41:06

新兴技术是一个将开发模式和习惯做法带入主流的催化剂。有人称这是一种"真爱无价"现 象,这是一部80年代的电影名字,讲述一个书呆子想成为时尚人的故事,“租借”他高中暗恋的对象做其女朋友。最近的一个例子似乎就是Git的兴起。Git是一个开源的版本控制系统, 大幅度改善了正规化源代码管理的情况。我曾经用过其他的方式,比如CVS和Subversion就用了很多年,但Git让源代码管理成为了我工作流程中更 加自然而然的一部分——甚至非常有趣。


但跟许多其他的技术一样,Git较浅的学习曲线促进了它的广泛应用,而同时它也提供了许多的功能和选项,很容易让初学者不知所措。现在我也算比较 熟悉这个系统了,因此我维护了一个相关经验技巧的列表,可以很有效地帮助我管理我的Git项目。现在我将重点讲述我认为对新手最有用的那些。


1. 在提交的同时添加文件

Git要求你在提交最近一个变更集之前显式地将新跟踪的文件添加到仓库。 因此提交变更集的典型命令序列通常是这个样子:

%>git add . 
%>git commit -m "Latest commit message"

为了节省预备步骤并将添加与提交文件的操作放到一起,可以使用-a标志:

%>git commit -a -m "Latest commit message" 

然而,在许多情况下你不应该使用这种快捷方式。稍后在本文中我将演示至少一个例子来说明为什么。


2. 用Git别名来节省击键次数

跟许多流行的命令行工具一样,Git允许你将自己的用户设置保存到一个叫.gitconfig的配置文件。在这个文件中,典型的用法是定义你自己的名 字和e-mail地址,因为它们是你跟仓库交互有关的。但你也可以在这里定义别名以节省时间。比如, 我的.gitconfig文件就包含了这样一些常用命令的别名:

[alias] 
st = status
co = checkout
cm = commit
pom = push origin master

如果你碰巧忘记了自己定义的别名,可以通过下面这个命令来快速查阅你的配置文件:

%>git config -l 


3. 选择性暂存文件

有时候你可能同时在多个文件说做了改动,但只想在即将进行的一次提交中选择性地添加一部分。为了达到这个目的你可以使用交互式添加功能。比如,假设我创建了两个新文件:ShopController.phpForumController.php,但我只想添加前面那个。这时候我可以通过给git add传递-i选项来启动交互式添加器:

%>git add -i 


这里你将会碰到询问菜单,其中提供了几种选择:

*** Commands *** 
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp

通过选择 4,你可以交互式地选择你想要添加的文件: 

What now> 4 
1: application/controllers/ForumController.php
2: application/controllers/ShopController.php
Add untracked>>

4. 用.gitignore忽略文件和目录

初始化一个新的Git仓库以后,最先要做的就是创建一个.gitignore文件。该文件的作用是过滤那些你Git仓库中不想被跟踪的文件和目录。 比如,当我在一个新的Zend框架项目上工作的时候,典型的做法是丢弃那些项目文档,网站图片,和来自仓库的notes.txt文件,也就意味着我 的.gitignore文件看起来是这么一副模样:


docs 
public/images
notes.txt


5. 在提交列表中删除新添加的文件

在开发最热火朝天的时候,你可能忘记将一个新创建而不想包含到仓库的文件添加到.gitignore文件。你可以用rm命令从即将提交的变更列表 中删除这些文件(被称为未暂存文件):

%>git rm --cached schema-notes.txt


成为未暂存状态的时候,你就可以将该文件添加到.gitignore了,然后再重新做一次提交。 


6. 查阅一个已提交文件的提交前内容

在当前版本中对一个文件作过修改以后,我常常需要检查一个文件早期版本的内容,但又不想真正恢复这个文件。你可以用show命令带上一个指向该文件 的参数来轻松完成这个事情:

%>git show HEAD^:application/controllers/AboutController.php 


插入符号(^)代表查看时需要回退的修订版的数目。因此上面这个例子会显示AboutController.php的上 一个修订版。如果你要查看3次修订之前的版本,就要使用3个插入符号,像这样:

%>git show HEAD^^^:application/controllers/AboutController.php 


另外,你也可以使用提交的哈希值来引用文件。比如,如果你想查看5个修订版之前的AboutController.php文件的内容,你必须先执行 git log来查看提交的哈希值,然后使用哈希值的前5个字符来获取文件内容:


%>git show 23aa985:application/controllers/AboutController.php 


7. 编辑最近一次提交的日志消息

我是一个对拼写一丝不苟的人,但是在比较匆忙地提交最新变更集的时候消息中偶尔会多出一两个不想要的字母。你可以很容易地用amend命令编辑最近 一次提交的消息:

%>git commit --amend 

执行这个命令会讲最近的提交消息加载到编辑器中,你可以编辑并保存这些消息。


8. 存储未提交的变更

编程工作的偶然中断是不可避免的,这常常会导致你处于这么样一个位置:尚不到可以提交变更的状态,而又必须立即修复并提交一个跟当前工作无关的问题。你可以用stash命令一股脑地保存下当前的所有变更,同时将你的基础逆转到之前的那个提交点,这时候你就可以修改并进行新的提交。一旦完成,你可以回到你存储的状态。比如,假设我正在一个项目的README文件的一个新区段上工作,突然发现了一个很严重的拼写错误。我可以这样来存储我的当前变更:

%>git stash save


重新打开README,我将会发现那个新的区段消失了,因为我已经回到了上一个提交点。这时候我可以修复那个拼写错误并 提交变更。然后再执行下面这个命令回到我的原始状态:

%>git stash pop


9. 浏览你的仓库

有很少的几种基于Web的界面可以用来浏览Git仓库,但是你知不知道一个叫instaweb的东东已经集成到了本地发布里面?要在浏览器里面阅读你的代码仓库,执行下面这个命令即可:

%>git instaweb --httpd apache2 


apache2传递给--httpd开关会告诉Git使用运行在本机的Apache作为Web服务器。虽然也支持几种其他的服务器,但默认使用的是lighthttpd

 

10. 责备其他人

偶尔可能发生一个团队成员(当然不是你自己)引入一些未经测试的代码到仓库里而破坏构建的事情。自然,你想要将该问题归咎到某个人。但是谁引入了这个错误呢?可以用blame命令来查找:

%>git blame application/controllers/AboutController.php 

23aa9852 (Jason Gilmore 2010-06-03 12:34:04 -0400 11) public function indexAction() 
23aa9852 (Jason Gilmore 2010-06-03 12:34:04 -0400 12) { 0e9e9f49 (Jason Gilmore 2010-06-03 13:32:47 -0400 13)
echo "Missing semicolon" 23aa9852 (Jason Gilmore 2010-06-03 12:34:04 -0400 14) }

哇靠,好强大!


结论

Git的确是一个有着丰富功能的珍贵宝物,它让源代码管理变成了一件轻而易举的事。你有没有发现什么Git的有用功能、技巧和窍门?请在评论中告诉我们!