??xml version="1.0" encoding="utf-8" standalone="yes"?> Git梛_ 我们可以利用Git的config命o或者直接编辑~/.gitconfig文gQ如果没有的话创建它Q来己打造独一无二的Git。我直接~辑用户目录下得.gitconfig文gQ拿我本地的文gZQ一一为大家解_完整的文件内容如下: [user] name = Phoenix email = phoenixtoday@gmail.com [alias] co = checkout ci = commit -a st = status br = branch oneline = log --pretty=oneline --since='2 days ago' onelog = log -p -1 [color] status = auto branch = auto ui = auto 该文件主要包含三个部分的内容Q?/p> 用户基本信息Q可以设|你的名字和emailQ这样在你提交代码的时候就会显C出你的名字 命o别名Q这?gitconfig文g中,我最喜欢的部分,它可以大大减你敲击键盘的次敎ͼ俗话说优U的程序员都很懒么Q。在该文件中Q我co讄为checkout的别名,那么下次我只要用'git co new_branch'可以切换到new_branch分支下了Q简z而优雅;ci讄为commit -a的别名,-a选项表示我不需要将修改和删除的文g通过'git add'命o来加入烦引,q样讄在?git ci -m"message"'q样的命令时Q相当于q箋执行?git add 被修改和删除的文??git commit -m"message"'两条命oQ再一ơ节省了我们宝贵的时_最L是最后两行,后面的章节会一一介绍。Git提供许多优雅、h性化的选项Q我们如果再l合别名的设|,可以发挥你最大的惌力,真的让你自己的Gitzv?/p> 颜色Q每ơ看diff时是不是挺痛苦的Q那么ؓ什么不l我们的Git加上颜色呢?只需要加上那三行Q就可以让红色和l色的提C出现在你的控制C Git灵动 现在来讲?git log'Q?git stash'Q?git formate-patch'三个命o的用法和技巧: git logQ不同于SVNQGit代码的历史记录全部在本地克隆了一份,所以这׃?git log'q样的命令用v来非常的q速,也是我最怋用的Git命o之一。在使用'git log'的时候,你可以加入很多的后缀?-p'表示查看修改的具体内容,例如'git log -p'它不但会打印出提交的旉、版本号、h员等Q还会将具体的代码修攚w分打印出来;'-n'其中n表示一个数字,q表C打印出具体的几个日志,例如 'git -p -1'正如我的Git配置文g中设|的onelog别名的内容一PpC打印出当前最新的一ơ日志记录及具体修改内容Q?--since="旉/日期"'Q?--until="旉/日期"'表示你希望查找某个日期段的日志记录,例如'git log --since="2 days ago" --until="1 hour ago"'pCZ希望查找两天前到一时前的日志记录QGit是够聪明的Q它可以类g'2 days ago'?1 hour ago'q种表示旉的英语{化ؓ具体的时间数字;有的时候,你不希望d多页才可以看到所有的日志Q你只希望看到简短的说明Q那么GitZ提供打印格式的定?git --pretty=格式U类'Q其中格式种cLfull、short、oneline{,例如'git log pretty=oneline'׃每条代码历史记录放在一行里Q看h单明?/p> git stashQ在W一中Q我举了一个用branch解决紧急Q务切换的问题Q其实stash命o也可以很好的解决q样的问题。当你不x交当前完成了一半的代码Q但是却不得不修改一个紧急BugQ那么?git stash'可以将你当前未提交到本圎ͼ和服务器Q的代码推入到Git的栈中,q时候你的工作区间和上一ơ提交的内容是完全一LQ所以你可以攑ֿ的修 BugQ等C完BugQ提交到服务器上后,再?git stash apply'以前一半的工作应用回来。也许有的h会说Q那我可不可以多ơ将未提交的代码压入到栈中?{案是可以的。当你多ơ?git stash'命o后,你的栈里充满了未提交的代码Q这时候你会对哪个版本应用回来有些困惑,'git stash list'命o可以当前的Git栈信息打印出来,你只需要将扑ֈ对应的版本号Q例如?git stash apply stash@{1}'可以将你指定版本号为stash@{1}的工作取出来Q当你将所有的栈都应用回来的时候,可以使用'git stash clear'来将栈清I?/p> git format-patchQ当你想l一个开源项目(例如RailsQ提交一D代码的时候,或者你想给组成员展示一D你q不x交的代码Q那么你q是需?patch的,Git?format-patch'命o良好的支持了q个功能。我来基本描qC下用这个命令的步骤和方法:W一Q利用branch命o创徏一个分支;W二Q修改你的代码;W三Q在该分支上提交你的修改Q第四,使用'git format-patch'命o来生成一个patch文gQ例如:'git format-patch master --stdout > ~/Desktop/tmp.patch'是工作分支与masterd的不同,存放?~/Desktop'文g夹下Q生成一个叫?tmp.patch的文Ӟ另一U简单的版本是利用diff命oQ例?git diff ..master > ~/Desktop/tmp.patch'Q,q样q成了patch文g。那么别人就可以使用'git apply'命o来应用patchQ例?git ap
应用提交旉要忽略的文gQ可以在应用?span style="font-size: 14px;"> 增加.gitignore 文gQ里面配|的是git提交时忽略的文gQ目前配|的.gradle .settings , bin/ , build/ Q提交git后生效?br />
]]>
Git亲友?/p>
Git的用技巧还包括利用Git包含的和附加的一些强大工Pq些工具主要包括git svn、git citool、gitk和Git的自动提C本:
git svnQGit和SVN可以很方便的集成在一Pq就大大减少了从SVN向Gitq移的学习成本,q也是我特别大家首次接触Git的用方式。git svn是一个Git内置的工P你安装了Git也就安装了它Q譬如说你们团队有一个SVN服务器,但是你想利用Git本地的一些强大特性,那么你依然可以安装GitQ用Git的branch功能Q只不过再更C码和提交代码的时候,使用git svn命o卛_。在q里我简单的讲讲最怋用和需要注意的两个命oQ其余的命o读者可以通过'git svn --help'来查看:'git svn rebase'命o取代?svn update'用于服务器代码更新到本圎ͼ'git svn dcommit'取代?svn ci'Q需要注意的是,本地必须用Git提交了代码之后,再?git svn dcommit'。只需要这P你就可以LCSVN转向Git了?/p>
git citoolQ这是我个h使用率最频繁的一个工P上一文章也提到了,Git可以本地提交代码Q那么你自然可以本地修改你的提交了,q个工具是可视化界面,用于修改你本地的提交。只要在你的工作区间输入'git citool'Q就会出现如下的界面
你可以用它来提交代码Q可以用它来你本地的修改追加在上一ơ提交的代码中,你还可以用它来修改你上次提交的信息等{。这个工具可以大大帮助你完成以前SVN不可能完成的d
gitkQ是一个查看主q?分支情况的工P它主要用于观察整个项目的分支状况Q?gitk'命o׃出现一个图形化界面供你查看Q本就单的说一下,大家回去试试q道了
Git 的自动提C本:它是Shawn O. PearceZ让Git使用h更方便而写得Shell脚本Q你可以在http://gitweb.hawaga.org.uk/ 扑ֈ一个叫做gitcompletion的脚本,下蝲下来Qƈ按照该脚本中指导的方式进行配|,你就h了Git自动提示Q敲入部分Git命oQ再?Tab键)的功能,而且有了q个脚本Q你也可以看C当前工作在哪个branch下。惟一的不xQ它只支持Linux、Unix、Mac操作pȝQ推荐大安用Macq行开发)
Git实战─Git Hub
l过q么长时间理论知识的熏陶Q想必大家早已跃跃欲试了Q那么我们在Git Hub上徏立一个开源项目作为实战演习吧。Git Hub是全球最大的Git服务器供应商Q每个帐h100M的免费用空_|址是:https://github.com/
首先我们在Git Hub上创Z个帐P按照上面指导的方法设|好你的认证信息Q每ơ提交代码都会需要这个认证信息)
然后Q如下图新徏一个项?选择Create a New Repository)Q名叫git usage
在服务器端,你可以看到这个项目的信息Q包括项目源代码的URLQ如下图
在本C用如下的命oQ就可以完成你的W一ơ提交了Q?/p>
mkdir git-usageQ创建项目目录) cd git-usageQ进入项目目录) git initQGit初始化) touch READMEQ创Z个README文gQ?nbsp; git add READMEQ增加该文g到烦引) git commit -m 'first commit'Q本地提交) git remote add origin git@github.com:phoenixtoday/git-usage.gitQ增加远E服务器代码库地址Q?nbsp; git push origin masterQ将本地代码提交到远E服务器上)
ȝ
我所在的目组自从使用Git后,发现Git提供的种U特性大大提高了我们的开发效率,在认识Git前我们无法想象一个版本控制工具可以让开发Q务切换变得如此自然流畅。所以我强烈推荐大家使用GitQ你付出的学习绝对物有所?/p>
Git在Wikipedia上的定义Q它是一个免费的、分布式的版本控制工P或是一个强调了速度快的源代码管理工兗Git最初被Linus Torvalds开发出来用于管理Linux内核的开发。每一个Git的工作目录都是一个完全独立的代码库,q拥有完整的历史记录和版本追t能力,不依?于网l和中心服务器?/p>
Git的出现减M许多开发者和开源项目对于管理分支代码的压力Q由于对分支的良好控Ӟ更鼓励开发者对自己感兴的目做出贡献。其实许多开源项?包括Linux kernel, Samba, X.org Server, Ruby on RailsQ都已经q渡C用Git作ؓ自己的版本控制工兗对于我们这些喜Ƣ写代码的开发者嘛Q有两点最大的好处Q我们可以在M地点(在上班的地铁 ?提交自己的代码和查看代码版本;我们可以开许许多多个分支来实践我们的想法,而合q这些分支的开销几乎可以忽略不计?/p>
现在q入本篇文章真正的主题,介绍一下Git的基本命令和操作Q会从Git的版本库的初始化Q基本操作和独有的常用命令三部分着手,让大家能够开始用Git?/p>
Git通常有两U方式来q行初始?
git clone: q是较ؓ单的一U初始化方式Q当你已l有一个远E的Git版本库,只需要在本地克隆一份,例如'git clone git://github.com/someone/some_project.git some_project'命o是?git://github.com/someone/some_project.git'q个URL地址的远E版 本库完全克隆到本地some_project目录下面
git init和git remoteQ这U方式稍微复杂一些,当你本地创徏了一个工作目录,你可以进入这个目录,使用'git init'命oq行初始化,Git以后׃对该目录下的文gq行版本控制Q这时候如果你需要将它放到远E服务器上,可以在远E服务器上创Z个目录,q把 可访问的URL记录下来Q此时你可以利?git remote add'命o来增加一个远E服务器端,例如'git remote add origin git://github.com/someone/another_project.git'q条命o׃增加URL地址?git: //github.com/someone/another_project.git'Q名UCؓorigin的远E服务器Q以后提交代码的时候只需要?origin别名卛_
现在我们有了本地和远E的版本库,让我们来试着用用Git的基本命令吧Q?/p>
git pullQ?/span>从其他的版本?既可以是q程的也可以是本地的)代码更新到本地Q例如:'git pull origin master'是originq个版本库的代码更新到本地的masterLQ该功能cM于SVN的update
git addQ?/span>是将当前更改或者新增的文g加入到Git的烦引中Q加入到Git的烦引中pC入了版本历史中,q也是提交之前所需要执行的一步,例如'git add app/model/user.rb'׃增加app/model/user.rb文g到Git的烦引中
git rmQ?/strong>从当前的工作I间中和索引中删除文Ӟ例如'git rm app/model/user.rb'
git commitQ?/strong>提交当前工作I间的修改内容,cM于SVN的commit命oQ例?git commit -m "story #3, add user model"'Q提交的时候必ȝ-m来输入一条提交信?/span>
git pushQ?/strong>本地commit的代码更新到q程版本库中Q例?git push origin'׃本地的代码更新到名为orgin的远E版本库?/span>
git logQ?/span>查看历史日志
git revertQ?/strong>q原一个版本的修改Q必L供一个具体的Git版本P例如'git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20'QGit的版本号都是生成的一个哈希倹{?/span>
上面的命令几乎都是每个版本控制工h公有的,下面开始尝试一下Git独有的一些命令:
git branchQ对分支的增、删、查{操作,例如'git branch new_branch'会从当前的工作版本创Z个叫做new_branch的新分支Q?git branch -D new_branch'׃强制删除叫做new_branch的分支,'git branch'׃列出本地所有的分支
git checkoutQGit的checkout有两个作用,其一是在不同的branch之间q行切换Q例?'git checkout new_branch'׃切换到new_branch的分支上?另一个功能是q原代码的作用,例如'git checkout app/model/user.rb'׃user.rb文g从上一个已提交的版本中更新回来Q未提交的内容全部会回滚
git rebaseQ用下面两幅图解释会比较清楚一些,rebase命o执行后,实际上是分支点从CUd了GQ这样分支也具有了从C到G的功?nbsp;
git resetQ将当前的工作目录完全回滚到指定的版本号Q假讑֦下图Q我们有A-G五次提交的版本,其中C 的版本号?bbaf6fb5060b4875b18ff9ff637ce118256d6f20Q我们执行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么l果只剩下了A-C三个提交的版?/p>
git stashQ将当前未提交的工作存入Git工作栈中Q时机成熟的时候再应用回来Q这里暂时提一下这个命令的用法Q后面在技巧篇会重点讲?/p>
git configQ利用这个命令可以新增、更改Git的各U设|,例如'git config branch.master.remote origin'将master的远E版本库讄为别名叫做origin版本库,后面在技巧篇会利用这个命令个性化讄你的GitQؓ你打造独一无二?Git
git tagQ可以将某个具体的版本打上一个标{,q样你就不需要记忆复杂的版本号哈希gQ例如你可以使用 'git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20'来标记这个被你还原的版本Q那么以后你x看该版本Ӟ可以?revert_version标签名,而不是哈希g
Git之所以能够提供方便的本地分支{特性,是与它的文g存储机制有关的。Git存储版本控制信息时用它自己定义的一套文件系l存储机Ӟ在代码根目录下有一?git文g夹,会有如下q样的目录结构:
有几个比较重要的文g和目录需要解释一下:HEAD文g存放根节点的信息Q其实目录结构就表示一个树型结构,Git采用q种树Şl构来存储版本信息, 那么HEADpC根;refs目录存储了你在当前版本控制目录下的各U不同引?引用指的是你本地和远E所用到的各个树分支的信?Q它有heads?remotes、stash、tags四个子目录,分别存储对不同的栏V远E版本库、Git栈和标签的四U引用,你可以通过命o'git show-ref'更清晰地查看引用信息;logs目录Ҏ不同的引用存储了日志信息。因此,Git只需要代码根目录下的q一?git目录可以记录完 整的版本控制信息Q而不是像SVN那样根目录和子目录下都有.svn目录。那么下面就来看一下Git与SVN的区别吧
SVN(Subversion)是当前用最多的版本控制工具。与它相比较QGit最大的优势在于两点Q易于本地增加分支和分布式的Ҏ?/p>
下面两幅囑֏以Ş象的展示Git与SVN的不同之?/p>
对于易于本地增加分支Q图中Git本地和服务器端结构都很灵z,所有版本都存储在一个目录中Q你只需要进行分支的切换卛_辑ֈ在某个分支工作的效果?而SVN则完全不同,如果你需要在本地试验一些自q代码Q只能本地维护多个不同的拯Q每个拷贝对应一个SVN服务器地址。D一个实际的例子Q以前我所 在的组使用SVN作ؓ版本控制工具Q当我正在试囑֢Z个模块,工作做到一半,׃会改变原模块的行为导致代码服务器上许多测试的p|Q所以ƈ没有提交 代码。这时候上U对我说Q现在有一个很紧急的Bug需要处理, 必须在两个小时内完成。我只好本地的所有修改diffQƈ输出成ؓ一个patch文gQ然后回滚有兛_前Q务的所有代码,再开始修改Bug的Q务,{到 修改好后Q在patch应用回来。前前后后要完成多个J琐的步骤,q还不计中间代码发生冲突所要进行的工作量。可是如果用GitQ?我们只需要开一个分支或者{回到d支上Q就可以随时开始Bug修改的Q务,完成之后Q只要切换到原来的分支就可以优雅的l以前的d。只要你愿意Q每 一个新的Q务都可以开一个分支,完成后,再将它合q到d支上Q轻松而优雅?/p>
分布式对于Git而言Q你可以本地提交代码Q所以在上面的图中,Git有利于将一个大d分解Q进行本地的多次提交Q而SVN只能在本地进行大量的一 ơ性更改,D来合ƈCq上造成巨大的风险。Git的代码日志是在本地的Q可以随时查看。SVN的日志在服务器上的,每次查看日志需要先从服务器上下 载下来。我工作的小l,代码服务器在国Q每ơ查看小l几q前所做的工作Ӟ日志下蝲需要十分钟Q这不能不说是一个痛苦。后来我们迁UdGit上,利用 Git日志在本地的Ҏ,我用Ruby~写了一个Rake脚本Q可以查看某个具体Q务的所有代码历Ԍ每次只需要几U钟Q大大方便我的工作。当然分布式q?不是说用了Git׃需要一个代码中心服务器Q如果你工作在一个团队里Q还是需要一个服务器来保存所有的代码的?/p>
ȝ
本篇介绍了Git的基本概c一些常用命令和原理Q大家可以尝试动手体会一下,下一会重点介绍Git命o的用技巧,Git附带的工P最后会在Git Hub上创Z个开源项目?/p>