与其一头扎进Git命令的海洋中,不如来点基本的例子试试手。它们简单而且实用。实际 上,在开始使用Git的头几个月,我所用的从来没超出本章介绍的内容。
要不来点猛的?在做之前,先为当前目录所有文件做个快照,使用:
$ git init $ git add . $ git commit -m "My first backup"
现在如果你的编辑乱了套,恢复之前的版本可以使用:
$ git reset --hard
再次保存状态:
$ git commit -a -m "Another backup"
以上命令将只跟踪你第一次运行 git add 命令时就已经存在的文件。如果要添加新文 件或子目录,你需要告诉Git:
$ git add readme.txt Documentation
类似,如果你想让Git忘记某些文件:
$ git rm kludge.h obsolete.c $ git rm -r incriminating/evidence/
这些文件如果还没被从系统中删除,Git将会删除它们。
重命名文件同删除旧文件,并同时添加新文件一样。也有一个快捷方式 git mv ,和 mv 命令的用法一样。例如:
$ git mv bug.c feature.c
有时候你只想把某个时间点之后的所有改动都回滚掉,因为这些的改动是不正确的。那 么使用这个命令:
$ git log
来显示最近提交列表,以及查看他们的SHA1哈希值:
commit 766f9881690d240ba334153047649b8b8f11c664 Author: Bob <bob@example.com> Date: Tue Mar 14 01:59:26 2000 -0800 Replace printf() with write(). commit 82f5ea346a2e651544956a8653c0f58dc151275c Author: Alice <alice@example.com> Date: Thu Jan 1 00:00:00 1970 +0000 Initial commit.
哈希值的前几个字符足够确定一个提交;也可以拷贝粘贴完整的哈希值,输入:
$ git reset --hard 766f
来恢复到一个指定的提交状态,并从记录里永久抹掉所有比该记录新一些的提交。
另一些时候你想简单地回朔到某一个旧状态。这种情况,键入:
$ git checkout 82f5
这个操作将把你带回过去,同时也保留较新提交。然而,像科幻电影里时光旅行一样, 如果你这时编辑并提交的话,你将身处另一个现实里,因为你的动作与开始时相比是不 同的。
这另一个现实叫作“分支”(branch),之后 我们会对这点多讨论一些。 至于现在,只要记住:
$ git checkout master
会把你带到当下来就可以了。另外,为避免Git的抱怨,应该在每次运行checkout之前提 交(commit)或重置(reset)你的改动。
还以电脑游戏作为类比:
-
git reset --hard
: 加载一个旧记录并删除所有比之新的记录。 -
git checkout
: 加载一个旧记录,但如果你在这个记录上玩,游戏状态将偏离第 一轮的较新状态。你现在打的所有游戏记录会在你刚进入的、代表另一个真实的分支 里。我们稍后论述。
你可以选择只恢复特定文件和目录,这将通过将其加在命令之后来实现:
$ git checkout 82f5 some.file another.file
小心,这种形式的 checkout 会不声不响地覆盖当前文件。为防止意外发生,在运行任何 checkout命令之前做提交,尤其在初学Git的时候。通常,任何时候你觉得对运行某个命 令不放心,无论Git命令还是不是Git命令,就先运行一下 git commit -a 。
不喜欢拷贝旧提交的哈希值?那就用:
$ git checkout :/"My first b"
来跳到以特定字符串开头的提交。你也可以回到倒数第五个保存状态:
$ git checkout master~5
在法庭上,事件可以从法庭记录里敲出来。同样,你可以检出特定提交以撤销。
$ git commit -a $ git revert 1b6d
将撤销给定哈希值的提交。本撤销被记录为一个新的提交,你可以通过运行 git log 来确认这一点。
一些项目要求生成变更日志http://en.wikipedia.org/wiki/Changelog[changelog]. 若 要生成一个变更日志,可以键入:
$ git log > ChangeLog
来实现。
得到一个由Git管理的项目的拷贝,则键入:
$ git clone git://server/path/to/files
例如,得到我用来创建该站的所有文件:
$ git clone git://git.or.cz/gitmagic.git
我们很快会对 clone 命令谈的很多。
假设你写了一个脚本,想和他人分享。你可以只告诉他们从你的计算机下载,但如果此 时你正在改进你的脚本,或加入了试验性质的改动,他们下载了你的脚本,他们可能因 此陷入困境。当然,这就是发布周期存在的原因。开发人员可能频繁进行项目修改,但 他们只在他们觉得代码可以见人的时候才择时发布。
用Git来完成这项,需要进入你的脚本所在目录:
$ git init $ git add . $ git commit -m "First release"
然后告诉你的用户去运行:
$ git clone your.computer:/path/to/script
来下载你的脚本。这要假定他们有ssh访问权限。如果没有,需要运行 git daemon 并 告诉你的用户去运行:
$ git clone git://your.computer/path/to/script
从现在开始,每次你的脚本准备好发布时,就运行:
$ git commit -a -m "Next release"
而你的用户则可以进入包含你脚本的目录,并键入下列命令,来更新他们的版本:
$ git pull
你的用户永远也不会取到你不想让他们看到的脚本版本。显然这个技巧对所有代码库都 适用,而不仅仅局限于脚本。
找出自从上次提交之后你已经做了什么改变:
$ git diff
或者自昨天的改变:
$ git diff "@{yesterday}"
或者一个特定版本与倒数第二个变更之间:
$ git diff 1b6d "master~2"
输出结果都是补丁格式,可以用 git apply 来把补丁打上。也可以试一下:
$ git whatchanged --since="2 weeks ago"
我也经常用http://sourceforge.net/projects/qgit[qgit] 浏览历史, 因为他的图形界 面很养眼,或者 tig ,一个文本界面的东西,很慢的网 络状况下也可以工作的很好。也可以安装web 服务器,运行 git instaweb ,就可以用 任意浏览器浏览了。