Skip to content
dandananddada edited this page Aug 5, 2015 · 1 revision

####介绍

Git本身是一个分布式的版本控制系统,也就是说你可以在任何一台机器作为仓库对代码或者文件进行管理。

当然真正使用时多数还是选择一台机器作为中心仓库用来托管代码,之后项目组成员从中心仓库pull代码到本地,然后以master分支为基础创建dev分支进行开发。测试通过后将dev分支merge到master,然后push到中心仓库。

####有关于Git,这里想要强调的大概三部分内容

  1. 本地Git环境
  2. 分支(Git branch)
  3. 协作开发

本地Git环境

本地的git环境可以分成三部分理解,首先是工作现场,你的所有修改删除等操作在这里完成,然后是缓存区,你要通过add命令将工作现场的文件提交到缓存区,此时这些被添加的文件状态会更改为Staged,最后是本地仓库,你要通过commit命令将缓存区的文件提交到本地仓库。

如果你要向远程提交代码的话,就通过push命令将本地仓库的代码提交到你配置好的远程代码库。

最后这里说明下git项目默认的主分支为master,一般通过remote add命令添加远程代码库时命名为origin,所以git push origin master其实就是将本地的master分支提交到远程代码库origin(默认也是master分支)。

Git Branch

CVS和SVN这类的版本控制系统,其原理是存储版本间文件的变化,而Git则是将各个版本的文件内容全部存储,但这并不意味着git会浪费大量存储空间,因为git所存储的不过是一个指向某之前版本的指针。

同理Git的分支其实也是指针,初始状态下Git会有一条master主线,除此之外还有一个HEAD指针用来标识当前工作现场关联到哪个分支,当你创建一个分支时会创建一个指针,这个指针会指向你作为基础点创建该分支的节点,当你将工作现场切换到该分支时,其实是HEAD指针指向该新建的分支指针,同样的道理当你merge一个分支的时候其实就是将两个分支都指向了那个最新的节点,删除分支也无非是删除了指向某节点的指针。

也正因为如此Git分支的创建合并删除是十分快的,而在SVN中由于分支创建删除耗时长的缘故几乎没人会在意并使用分支。

协作开发

第一种是比较容易接受的中心仓库方式,正如我之前所说的,Git本身是一个分布式的CVS,但是就像群聊QQ一样,你不会对群里每个人都发一次聊天内容,虽然聊天本身的灵活性允许你这么做。

道理是一样的Git允许任何人的任何机器作为仓库托管代码并相互提交,但是你不会把代码给项目组的几个人依次反复提交,所以在正常使用时我们还是会在一台服务器建立中心仓库,所有项目组成员把中心仓库作为基础进行代码的pull和push。这种开发模式是大家应该都比较容易入手的。这种方式下与SVN等传统的代码托管工具区别无非是你可以在本地建立分支,合并,删除,提交,这样会更灵活,自然也会更繁琐些。

另外一种协作方式是Pull-Request模式,也就是某人init一个项目,但其他人不能直接对项目进行修改提交,其他人想要contribute to这个项目,需通过fork将项目拷贝到自己的git仓库,然后在自己的仓库进行分支开发,当你想提交代码时就发出一个Pull-Request申请,源代码的所属人会根据你的申请选择是否同意merge项目。当你想要更新fork过来的项目时可以通过配置upstream进行更新。

####Git安装

以Ubuntu为例,安装命令为:

$ apt-get install git

安装结束,通过--version查看当前版本。

$ git --version

配置用户和邮箱

安装完成后,在使用git之前需要配置用户名和邮箱,查看版本日志的时候可以辨别谁提交了什么,怎么联系这个人。

$ git config --global user.name "Your username"

$ git config --global user.email "Your email@example.com"

设置推送模式

当push命令没有明确推送源和目标时,会按照push.default模式进行推送(这步也可以跳过),一般默认设置为simple即可。

$ git config --global push.default simple

Git创建一个版本库(repository)

在你要上传的文件夹执行init命令,创建版本库。

$ git int

远程库

$ remote -v 命令查看当前版本库关联的fetch和push路径(如果用github做代码库的话该路径一般为https://github.com/account/repository.git,个人感觉-v应该是view的意思)。

$ git remote -v

在没有关联远程版本库的情况下,需要添加关联,用remote add命令。

$ git remote add origin "https://github.com/account/repository.git"

如果想删除当前关联的远程版本库,可以用remote remove命令。

$ git remote remove origin

其中origin为本地版本库的别名,系统默认采用origin。

####上传文件 将本地版本库文件上传到关联的远程版本库,需要添加需要上传的文件,提交上传请求,推送上传内容到远程。

以下上传版本库下所有文件到关联的远程版本库。

$ git add .

$ git commit -am "Input your message about this commit"

$ git push -u origin master

之后终端会要求输入github账号和密码,请求上传认证。

其中push命令后的参数origin为链接到远程的目标,master为本地的源

$ git add -u

更新本地修改,包括删除和新增。

####删除文件

通过rm命令删除文件,并通过commit提交。

$ git rm [文件名] $ git commit

####查看信息

通过status查看本地版本库和远程版本库那些文件不一致(只显示两端不一致文件的名字,新增文件也会显示)。

$ git status

通过diff查看,远程版本库和本地版本库相比不一致的文件做了什么修改(注意本地新增的文件不会显示)。

$ git diff

通过log命令可以查看修改记录。

$ git log

####版本控制

将版本库中的readme.txt文件替换到当前工作区(可用来丢弃修改,恢复删除)。

$ git checkout --readme.txt

将已经提交到缓存区的readme.txt文件替换为本地仓库的readme.txt文件。

$ git reset HEAD --readme.txt

回退n个版本。

$ git reset —hard HEAD ~n

####Git分支(Branch)

查看本地分支。

$ git branch

创建一个分支,创建一个分支名字叫v1.0。

$ git branch v1.0

创建分支并切换。

$ git checkout -b branchname

切换分支,切换到分支v2.0。

$ git checkout v2.0

切换到指定的commit(根据commit id)。

$ git checkout bc5176d

删除分支,删除分支v1.0。

$ git branch -d v1.0

强制删除分支v1.0。

$ git branch -D v1.0

提交当前分支,提交v1.0到远程,如果远程没有则在远程创建此分支。

$ git push -u origin v1.0

合并分支,把v2.0和当前分支合并。

$ git merge v2.0

合并指定的commit 到当前(根据commit id)。

$ git merge bc5176d

合并2.0分支到当前分支,并作为一个新的任务提交。

$ git merge --no-ff -m “comment” V2.0

查看远程分支。

$ git branch --remote

删除远程分支,删除远程v1.0分支。

$ git push origin --delete v1.0

####暂存工作区

将当前修改状态暂存。

$ git stash

列出工作现场。

$ git stash list

恢复并删除工作现场。

$ git stash pop

####多人协作

从远程更新代码到本地代码库。

$ git pull

创建本地dev分支并与远程dev分支建立链接。

$ git branch —set-upstream-to=origin/dev dev

除此之外,当你fork别人的代码时,需要添加远程的上流。

$ git remote add upstream http://github.com/username/project.git

更新上流。

$ git remote update upstream

将上流master分支拷贝到本地代码库master分支。

$ git rebase upstream/master master

####SSH Key 每次上传下载项目的时候都需要输入git的账号和密码是一件很麻烦的事,这个时候就可以用SSH Key的方式进行版本的管理。

生成SSH Key。

$ ssh-keygen -t rsa -C "your_email@example.com"

这个时候会在你当前账户目录下创建一个.ssh目录,在这个目录下会有一个id_rsa和一个id_rsa.pub文件,复制pub文件内容。

$ pbcopy < ~/.ssh/id_rsa.pub

之后将你复制的内容粘贴到git工具下面的添加公钥中就可以了。

然后再你复制项目路径的时候选择SSH路径,而不是Https路径。

最后设置远程路径

$ git remote set-url origin git@example.com:<username>/<project>.git