为什么选择GIT?
Git自从2005年问世以来,已经逐步成为本地和分布环境下版本控制的事实标准。Git最早由Linus Torvalds开发用来替代 BitKeeper,后者之前一直是全球Linux 内核开发人员使用的主要代码管理工具 。Git与其他版本控制工具相比,具有更灵活的许可证和更多社会化协作特性,因此很快受到开发人员的喜爱,并在开源社区中得到广泛使用。
Git能够在所有常见的操作系统中使用,并且能够支持非常多样化的应用场景,小到跟踪修改,存放文件,分享工作,大到支持包含众多用户参与的复杂协作项目。因此,Git在诸如艺术设计、工程建筑、教育教学等诸多领域都被越来越多地应用。
分布式版本控制
使得Git与其他传统版本控制工具如此不同的是它的本地工作,频繁提交,随时发布的创新特性。它不需要与服务器连接,所有的修改历史都保存在用户的本地机器上,因此你可以随时随地进行开发,只在需要时才将修改后的工作成果(代码)快速进行提交。Git扮演了分布式版本控制系统(Distributed Version Control System - DVCS)的角色。
开始使用GIT
安装Git
Git非常小巧,对于大部分操作系统,你只需要将它的二进制版本拷贝到系统中,并将所在目录添加到系统环境变量 $PATH 中就可以了。Git主要是使用C来编写的,也就是说,对于每个操作系统,它都有一个不同的二进制版本或安装程序,你需要根据你的系统进行选择。
使用下面的命令,可以检查你当前正在使用的Git版本。
git --version
可以通过下面的链接地址,获取Git的官方安装包
http://git-scm.com/download
创建用户标识
一旦你在自己的操作系统上安装完Git之后,你需要告诉Git你的用户名和电子邮件地址,从而创建自己的用户标识。你的所有代码提交都会与你的用户标识关联,这一点非常重要。
git config --global user.name “Ji jiang”
git config --global user.email “jijiang@techmask.net”
git config --global color.ui “auto”
上面的代码会将你的个人标识和系统偏好设置写入你的home目录下的.gitconfig文件中(在UNIX和Mac上为\\~,而在Windows中则是%USERPROFILE%对应的目录)
Git不会为代码库自动设置安全策略,你可以通过选择不同的安全协议(SSH或HTTPS)或者操作系统中的文件系统权限设置来支持代码仓库的用户验证和授权。
GITHUB
GitHub.com利用了Git的标准DVCS特性,并提供了一个将其社会化特性最大化的解决方案。
GitHub.com 使存储Git仓库和共享代码变得非常容易。一旦你将代码仓库提交到了GitHub,那么后续的代码仓库共享,代码审查,以及向开源项目贡献代码这些流程都将比之前任何时候都要简单许多。
GitHub通过提供免费的账号来支持开源,免费账号可以创建公共代码库,这些代码库对于所有人都是可见的。当然你也可以花一些费用来购买私有账号,基于费用的不同,你可以创建不同数量或规模的私有仓库。公共和私有账号都可以通过https://github.com/signup 来创建。
创建仓库
一个Git仓库可以被创建在不需要任何网络连接的本地机器上,当然也可以通过GitHub上的用户界面来创建。
本地创建
打开命令行工具,在任何目录下创建一个Git仓库目录(你也可以使用已经存在的项目目录),并定位到该目录下。然后通过下面的命令将这个目录初始化为一个Git仓库
git init
git add .
git commit –m “The first commit”
- 第一条命令进行初始化,它会在当前目录下创建一个包含所有元数据和仓库变更历史的.git隐藏目录。后面所有针对这个代码仓库所做的操作,都会被Git记录到这个目录下,这样完全不会破坏你本身代码结构,使得整个项目更加整洁。
- 第二条命令的符号“.”告诉Git开始跟踪并记录当前目录下所有文件变化。
- 最后一条命令则将当前目录下的所有内容进行了一次提交,其中-m是message的意思,一般用来标识此次提交的内容变化信息。
通过GitHub创建
登录GitHub后,点击“New repository”菜单,在填写了Git仓库名称后点击“Create repository”你就可以在你的账号下创建一个代码仓库了。
要将一个代码仓库取回到本地,可以通过GitHub代码库页面上提供的地址,用以下命令克隆到本地环境中:
git clone git@github.com:githubtrainer/hellogitworld.git
clone命令会执行一些额外的子任务,这些子任务对于用户来说都是透明的。最终这个Git仓库所包含的所有文件连同它的修改历史都将被拷贝到你的本地环境中。
从GitHub克隆到本地的代码仓库相当于GitHub上原始代码库的本地镜像。远程的代码库地址等信息也会被预设到这个新建的本地库中,用于更新或同步远程GitHub代码仓库。
本地仓库处理
编辑
一旦你通过克隆或初始化创建了一个新的Git项目后,你就可以像修改本地文件一样修改项目目录中的任何文件。与传统VCS中的检出概念不同,Git中没有文件锁的概念。
Adding
当有新的文件需要提交前,首先需要将这些文件放入暂存区,这样Git才会对这些文件进行跟踪。你可以将一个文件,一个文件夹或通过使用通配符将一组文件添加到暂存区中。
git add index.html
git add javascript/
git add *.js
你也可以使用-i参数,以交互方式,一步一步添加文件。
git add -i
-p参数是一种更精确的提交方式,允许你只提交部分修改的内容
git add -p
Committing
git commit命令可以将当前暂存区中的文件实际保存到仓库的历史记录中。通过这些记录,我们就可以在工作树中复原文件。下面的命令会打开文本编辑器,要求你输入此次提交的说明。
git commit
你也可以在命令行中直接指定提交说明,并完成提交
git commit –m ”Your commit message”
要修改上一次提交的说明,可以使用--amend参数。执行下面的命令后,文本编辑器会自动打开,你就可以编辑提交说明了。
git commit –-amend
Moving
你可以在操作系统里移动一个文件,Git能够自动识别出文件的移动,并给这个文件打上“move”的标识。然而,使用Git命令往往是最高效的。你可以使用以下命令来移动一个文件。
git mv originalfile.txt newsubdir/newfilename.txt
Removing
使用git rm命令能够将一个文件标识为删除状态,你可以在下一次提交时确认删除。
git rm filetoremove.txt
Aborting
如果你希望忽略当前所有还没提交的操作,并返回到最后一次提交后的状态,可以使用下面的reset命令,其中 --hard参数能够循环地将所有未提交或未被放入暂存区的文件进行回滚。
git reset --hard
在很多情况下,你或许只希望回滚某一个文件,此时你可以使用checkout命令
git checkout modifiedfile.txt
查看
在我们的日常工作中需要经常查看代码仓库的当前或历史信息,包括当前工作目录下变更状态,通过对比之前的提交历史了解代码的变化等等。
Status
通过status命令检查当前目录下文件的状态,如新添加的,被修改的,未跟踪的等。
git status
Diff
git diff命令可以查看工作树、暂存区、最新提交之间的差别,它提供了一个patch-style的视图,方便用户可以直观的查看文件前后的变化。
git diff
git diff --staged
git diff HEAD
git diff 查看当前工作树与暂存区的差别。如果暂存区是空的,那么它将显示工作树与最新提交状态之间的差别。“+”号标出的是新添加的行,被删除的行用“-”表示。
git diff --staged 查看暂存区与最新一次提交之间的差别
git diff HEAD 查看本次提交与上次提交之间的区别。这里的HEAD是指向当前分支中最新一次提交的指针。在git commit前查看两次提交之间的差异,是一个良好的编程习惯。
Log
git log命令可以查看以往仓库中提交的日志。包括可以查看某个时间点以来,最近指定次数的提交,或是指定文件或目录的变更历史等。
git log
git log -3
git log --since=yesterday
Blame
git blame命令可以帮你发现文件中的每一行是在什么时间以及为什么被加上或更改的。
git blame <filename>
分支
Git中的分支与其他版本控制很像,但不同点在于Git中的任何一个分支都可以被取回到本地,也可以通过push与其他团队成员共享。使用Git创建和使用分支非常方便,这样开发人员就可以通过创建分支来进行试验性的开发尝试。如果尝试失败了,则可以将对应的本地分支丢弃,而如果成功了,则可以将本地分支与主分支进行归并提交。
git branch <new branch name> <from branch>
git branch <new branch name>
选择一个分支
通过提供一个分支的名称就可以方便地检出或切换一个分支。
git checkout <branch name>
下面的命令中,首先通过git branch来创建一个新的分支,然后使用git checkout命令来将当前分支切换到新创建的分支上。远程分支总是只读的,只有在本地创建分支后才能进行对文件进行修改操作。
git branch <new branch name> <from branch>
git checkout <new branch name>
或者你也可以直接使用git checkout -b来操作,下面命令的效果与上面两条命令是相同的。
git checkout -b <new branch name> <from branch>
显示所有分支
你可以通过下面的命令来显示当前代码库中的所有分支
git branch -a
可以看到本地的分支显示为白色,而这里的master分支显示为绿色,左边带有“*”标识,这说明master是我们的当前工作分支。远程分支会以红色表示,并且加上remotes这个前缀。
归并分支
像其他版本控制工具一样,Git也允许你将一个或多个分支归并到当前工作分支中。
git merge <branch one>
git merge <branch one> <branch two>
如果在归并的过程中出现冲突,Git会提示你,并将文件中存在冲突的部分用>>>>>>>>> 和 <<<<<<<< 包裹起来。你需要手工消除这些冲突,然后用git add和git commit命令提交更改。
压缩分支
可以将一个分支的修改内容压缩到另一个分支中,系统会根据每一次提交的先后顺序在目标分支中增加提交内容。
git rebase <source branch name>
git rebase <source branch name> <destination branch name>
提交哈希
不同于使用顺序的版本号,Git会给每一次提交标识一个唯一的SHA–1的哈希值。这样就允许我们通过这个哈希值来定位到任何一次提交。
一个完整的SHA–1哈希值包含40个字符:
64de179becc3ed324daab72f7238df1404723672
为了能够更加高效地定位历史提交,Git提供了一些速记符号。你也可以直接使用哈希值的一部分来定位一次提交,通常情况下你只需要提供一个哈希值中的4-5个字符,Git就能识别出对应的提交了。
速记符 | 定义 |
---|---|
HEAD | 最后一次提交 |
HEAD^ | 前一次提交 |
HEAD^^ | 之前第二次提交 |
HEAD~1 | 前一次提交 |
HEAD~3 | 之前三次提交 |
Git速记符能够与其他命令配合使用,比如下面的例子:
git diff HEAD~3
git checkout HEAD^^ git merge RELEASE–1.0
高级命令
除了前面介绍的核心Git工作流程外,还有许多其他命令可以帮助你提高在日常开发中的工作效率。
Stashing
当你做了一些修改,但还未完成,此时临时需要返回之前的某一个状态,但同时你又希望保修这些更改,方便未来继续使用时,Git提供了一个非常有用的功能。对于那些修改使用stash会将这些修改压入到一个栈中。
git stash
当你需要将之前的修改取回,并继续工作时,只需要使用stash pop将它们从栈中取回即可。
git stash pop
Stash只会将修改过的,且已被跟踪(在暂存区中)的文件放入栈中,但是对于那些新添加的还未跟踪(不在暂存区中)的文件,它并不会进行处理。
Tagging
Git提供了标签机制,能够为我们的每一次提交打上标签,这样我们可以通过标签来查看所有对应的提交。如果没有指定具体的提交哈希值,那么Git将默认为最近的一次提交(HEAD)打上标签。
git tag <tag name>
git tag <tag name> <commithash>
通过下面的命令可以列出所有的标签
git tag
远程仓库处理
对远端代码仓库进行操作也是Git的核心功能。你可以通过push来发布你对远程仓库的更新,或使用pull来同步远端代码仓库。通常情况下Git仓库更多通过SSH协议来进行连接。
Git代码仓库是通过一个简单的守护程序来提供共享服务的https://www.kernel.org/pub/software/scm/git/docs/git-daemon.htm
Remotes
通过remote命令可以给本地仓库设置对应的远程仓库作为源或目标。
你所设置的远程仓库地址可以通过以下命令查询:如果你是通过clone命令将一个远程仓库同步到本地的,那么默认的,它会显示一个叫做“origin”的远程库。
git remote -v
使用下面的命令来添加远程仓库
git remote add <remote name> <remote address>
Push
Push命令可以将本地的代码仓库变更推送到远程仓库中。
git push <remote name> <branch name>
git push <remote name> <local branch name:remote branch name>
像这样执行git push命令,你能就将当前本地分支的内容推送给远程仓库的指定分支,一般情况下是origine的master分支。完成推送以后,其他具有权限的人就可以获取到你的更新了。
Pull
Pull命令实际上包含了两个操作,首先是获取(fetching)远程仓库的内容,然后与本地仓库的内容与提交历史作自动的归并操作。
git pull
Fetch
另一种同步方式是使用Fetch命令将远程仓库内容放入本地缓存,接着你可以对获取的内容进行检查评估,然后人工进行归并操作。
git fetch <remotename>
git merge <remotename/branchname>
探索GITHUB
在你熟悉了Git相关的所有操作,并能够熟练地克隆代码仓库,提交和发布更新的代码之后,你就可以开始探索GitHub带来的社会化编程特性了,这也是Git和GitHub与其他传统版本控制工具的最大不同之处。
Forking
如果你想修改GitHub中的开源项目,可以通过Fork操作来实现。Fork一个代码仓库,GitHub将会完整地将这个代码仓库拷贝到你自己的账户下,然后你就可以像自建仓库一样使用这个代码仓库并进行修改了。
点击Fork按钮你就可以将任何可访问的代码仓库导入到自己的账户中。
所有被fork的代码仓库都会在仓库页面显示它原来的名称。
Pull Request
被fork的代码仓库始终会保持与源代码仓库的关联关系,这样你修改源代码之后,可以方便地通过Pull Request请求对方仓库采纳你所做的修改。只要Pull Request被源库管理员接受,那么你将成为这个项目的Contributor。
要提交Pull Request申请,你需要先选择你fork的代码仓库中的一个分支,然后带点击分支左侧的绿色按钮,这时会跳转到查看分支差别的页面,在确认修改无误后,点击“Create Pull Request”按钮,并在表单中填写此次请求的相关说明,最后点击“Send pull request”按钮,你的请求就顺利发出了。
源库的管理员会收到你的请求,然后通过review你的修改来决定是否接受代码归并。
GUIS
标准Git版本中都自带了两套用户界面,分别使用Tcl和Tk编写。它能为用户提交修改或查看提交历史等操作提供更直观的视图。
Git Gui提供了一个面板,用户可以选择需要添加的文件,查看暂存文件列表,完成提交等常用操作。
git git
Gitk提供了一个图表视图很直观地显示了项目的提交历史和分支。
gitk --all
SUBVERSION & GIT
Git是一个高度协作化的版本控制系统,它同时支持与远程Subversion库进行交互。
Cloning
你可以通过下面的命令将远程Subversion仓库(使用传统的)克隆到本地目录中。新创建的Git项目不会带有Subversion中与代码无关的控制文件。
git svn clone --stdlayout <svn-repo-url>
由于Git需要进行很多转换操作,因此从Subversion克隆到本地代码库可能需要较长的时间。
推送Git提交到Subversion
Git提交也可以被推送到远程Subversion仓库中
git svn dcommit
从Subversion更新
当远程Subversion代码仓库发生变化,你可以使用svn rebase命令,将变更同步回本地Git仓库。
git svn rebase
使用Subversion操作GitHub项目
如果你仍然希望保留Subversion的相关工作流程,并且使用GitHub来存放和管理你的项目。那也非常简单。在GitHub中的所有代码仓库都能支持SVN工具和操作。
使用下面的命令从GitHub上做一次传统的SVN检出操作
svn checkout https://github.com/<username>/<project>
同样可以使用下面的命令作部分检出操作
svn checkout https://github.com/<username>/<project> <partial>
其他参考材料
Git官方网站
包括:安装包,版本说明,文档
http://git-scm.org
GitHub
官网,注册,帮助文档
https://github.com
https://github.com/signup/
https://help.github.com
简书签约作者:技匠,以上内容欢迎大家分享到朋友圈/微博等。如需转载,请通过简信联系授权。谢谢大家!