GIT使用教程(简化版)

原文链接:http://oss.lzu.edu.cn/artical.php?id=16

说明:1、图片来自《Pro Git》 2、本文系原文的精简


1、什么是GIT

Git是一个免费开源的、分布式版本控制软件和源码管理系统,遵从GNU v2Git最初是由Linus Torvalds为内核开发而设计。Git自从推出以来,已被很多开源项目所采纳。每一个Git工作目录是一个带有完整历史记录和版本信息的仓库,不依赖网络和中央服务器。


2、为什么用GIT

  • 更顺畅的工作流程,开发过程中,完全可以离线操作
  • 快速,Git分布式架构使得本地仓库包含所有的历史版本信息,你可以在不同的版本之间快速切换
  • 弹性的本地分支,在svn下,你建一个分支需要把源代码复制到另外一个文件夹,而在Git下,创建分支的代价是非常小的,只需一条命令
  • 仓库目录结构简洁,用Git复制一个项目,只会在项目根目录创建一个.git的目录,而其他目录很干净
  • 内容按元数据方式存储,所有的版本信息都位于.git目录下
  • 完整性好,更易于协作开发
  • 用户群大,现在已经有成千上万个开源项目采用Git来做项目管理,github上更是有无数个代码仓库


3、GIT安装与配置

a) 安装

1. 源码安装

2. 在Linux上安装:如果是 Linux 系统 ,通过以下命令安装

    yum install git-core (Fedora)

    apt-get install git-core (Ubuntu)

3. 在Windows上安装

http://msysgit.github.com/ 下载安装 msysgit

Msysgit默认会安装Git bash 和 Git GUI,一般用 Git bash 就可以了,它支持常用命令。

如果对Linux命令行不熟,可以用Git GUI,但功能有限。


b) 第一次使用GIT

在安装好Git之后,需要一些配置,才能正常使用Git

Git通过“git config”命令来配置Git,这个命令有2个选项:--system, --global, 加上默认选项,分别对应Git3级配置文件。第一个是/etc/gitconfig文件,和--system对应,这是全局配置文件,修改这个文件,将会影响系统上所有的用户,所有的仓库。第二个是你家目录下的/.gitconfig文件,与--global对应,修改它会对你当前用户的所有仓库产生影响。第三个是你仓库中的.git/.gitconfig文件,这是“git config”默认修改的配置文件,它只会对你当前仓库产生影响。

在第一次使用Git时,你需要告诉你的协同开发者,你是谁以及你的邮箱,在你提交的时候,Git需要这两个信息。具体通过以下命令设置:

git config --global user.name “Test OSS”

git config --global user.email [email protected]

当然你也可以不用--global选项,但这意味这你在每一个仓库中都要这样设置。

同时,你也可以指定你的编辑器,你的Diff工具:

git config --global core.editor vim

git config --global merge.tool vimdiff

你还可以通过”git config --list”命令来查看你的设置。

当你把Git设置好之后,如果你要和从Git服务器上获得仓库,或者向Git服务器提交你的代码(比如github),你可能需要生成你自己的ssh密钥对。Git支持4种与服务器端通信的协议:githttpsshhttps。其中git只是一个只读协议,也就是说你只可以从服务器端获取仓库,但是你不能提交你自己的代码。而httphttps用的很少,大部分都只支持ssh协议和Git协议。

当你通过ssh协议与远端服务器进行通信的时候,你可以通过以下命令生成ssh密钥对:

ssh-keygen -t rsa

如果你没有指定密钥名称和存放路径的话,它默认把两个不对称密钥放在你的家目录下的.ssh目录下,密钥文件默认名称为id_rsaid_rsa.pub,前者是私钥,后者是公钥。中间可能会要你设定访问密钥密码,这个可以设,可以不设,但为了安全考虑,还是建议你设一个访问密码。否则,意味着任何持有你密钥的人都可以使用该密钥。

然后把你的公钥发给Git仓库管理员,然后你就可以通过ssh协议来访问服务器端,期间程序会自动进行密钥对匹配,如果你设了访问密码,你可能需要输入密码。

更多关于ssh的内容,请访问这里:http://www.freebsd.org/doc/zh_CN/books/handbook/openssh.html

这些设定完之后,你可以通过获得任何一个公开的代码仓库来检测你的git是否工作正常。比如下面这个:

git clone git://git2.kernel.org/pub/scm/git/git.git


4、GIT仓库

Git作为一个资源管理和跟踪系统,如果想要把自己的文件托管在Git上,那么首先你得让Git知道你需要管理的文件在哪。比如说现在我有一个项目,它在test文件夹里,我想让Git管理这个项目,这个时候你需进入到这个目录,然后运行“git init”命令。这个时候Git就会在该目录下生成一个.git的隐藏目录,Git用来进行版本控制和内容跟踪的所有文件都在该文件夹下。

处于git跟踪下的文件只具有三种状态:

  • Modified(working directory):被修改过的文件
  • Staged(staging area):通过git add添加到暂存区域的文件
  • Committed(git directory):通过git commit提交到仓库的文件

所以,一般的git工作流程可能是这样:修改过某些文件,然后把这些文件添加都暂缓区,再提交到仓库中形成一个版本或快照,最后提交到git服务器上。而在中间,可能伴随着分支管理,分支切换,撤消与合并。

可能有些人会觉得很奇怪,为什么git会有暂存区域这个概念,直接提交到仓库中不就ok了。其实这是git为了做版本控制用的,试想如果没有暂存区域,每修改一个文件,就会形成一个版本,太过频繁,不易于管理。暂存区域其实就是下一个版本的文件清单,你可以自由控制该往仓库中提交什么文件,这也可以避免在一个版本中包含一些中间文件,比如编译后的文件。

GIT使用教程(简化版)_第1张图片

GIT使用教程(简化版)_第2张图片

5、GIT基本流程

1.初始化仓库(两种方法)

第一种:在空目录里建新仓库:

    git init

第二种:从其他地方复制仓库,例如:

    git clone git://git2.kernel.org/pub/scm/git/git.git (远程仓库)

    git clone https://github.com/jquery/jquery.git (远程仓库)

    git clone [email protected]:wengpingbo/MicroBlog.git (远程仓库)

    git clone /home/oss/test.git (本地仓库)

第一次从服务器上复制仓库,速度可能比较慢,因为git要把所有历史记录和版本全部复制下来。

复制完后,会在当前目录下生成一个目录,以仓库的名字命名。如果你不想指定目录,那就在上面的命令后加一个目录就ok了。比如我想把test仓库放到oss仓库中:

    git clone /home/oss/test.git oss

之后就可以开始工作啦!


2、添加文件

在编辑了几个文档之后,你可能突然想起来,好像文件还没有让git跟踪。Git并不会实时的跟踪你的文件,只在你明确让它记录你的文件时,它才会把指定的文件的当前状态记录到仓库中去,然后又撒手不管了。我想这就是说git笨的原因吧。这个时候,你需要手动添加你的文件当暂存区域:

    git add filename1 filename2

如果你懒得一个一个加:

    git add -A    // 把当前目录下所有文件都添加到暂存区


3、添加一个版本

在添加完文件后,你可能觉得应该创建一个commit

git commit

怎么样?是不是有点不对劲,好像这个命令并没有按你想象的那样跳出一个提交成功的提示,而是直接跑到了你在配置中指定的编辑器中了。仔细看一下,原来是让你给这个版本做一些备注,随便写点什么,然后保存退出就ok了。如果你不想这么麻烦,可以这么干:

git commit -m ‘initial version’

可能你觉得之前讲的太罗嗦了,提交一个commit还这么麻烦,其实有一个捷径可以使你跳过添加文件这个过程:

git commit -a -m ‘initial version’

大功告成,这个命令会把之前所有的已经添加的文件都加入到这个版本中。

可能你又有疑问了,之前添加的文件不是自动会加入到下一个版本中吗,问什么还加这个-a参数?

其实git add命令只是把指定文件的当前状态添加到暂存区域,并不代表一个文件一旦添加,就会一直存在每个版本中。如果你添加一个文件后对这个又进行了修改,在你commit时候,只会commit这个文件添加时的状态,不会把之后的修改也commit进去,除非你再次添加。


4、推送变更

commit之后,你可能想把代码提交到git服务器。

如果是在本地建立起的仓库,默认没有配置服务器地址;如果是从其他服务器复制的仓库,这个服务器地址会自动添加到你的仓库。查看方式:

   git remote -v

如果执行“git remote”,则只列出服务器端的别名,不会列出地址。

一个仓库可以有多个服务器地址,这就意味着,你可以从不同的人的手中复制同一仓库,但这并不会打乱你自己的分支,哪怕双方的分支名字都相同。假如你现在在和另外两个人做同一个项目中的同一个分支,你发现A的一个模块正是你想要的,你想把他的代码合并到你现在的版本中,这时候可以这样做:

   git remote add code_a git://url/test.git  //添加对方的地址,code_a是别名

    git fetch code_a  //复制对方的仓库到本地,但不合并,git pull会自动合并

    git merge code_a/master //把对方master分支合并到自己当前版本下

合并之后,你可能想提交你的代码到其他的服务器上,这时候你可以先把要提交的服务器地址添加进来,然后:

   git push origin master //把自己的master分支提交到名为origin的服务器上


5、创建并管理分支

在做项目的时候,你可能想写一些扩展性的功能,或者做一些实验,但是又不想影响现在的项目。这时候,你可以创建一个分支,然后在这个分支里写东西,当觉得不好的时候,可以把这个分支删掉,对你之前的主分支没有任何影响。或者你觉得这个新特性超出了自己的预想,可以合并到主分支,这时候你只要把工作转回主分支,然后合并分支,最后删除分支。具体操作如下:

    git branch test  //创建一个test分支

    git checkout test  //转到test分支

    edit something...commit something...

    git checkout master  //转到master分支

    git merge test  //合并test分支

    git checkout -b test2  //创建test2分支,并转到test2分支

    git branch -d test //删除test分支

    git branch  //列出分支列表

    git branch -v  //列出分支列表和当前commit

git merge 把两个版本合并,然后在当前分支创建一个新的commit,如果你在两个分支的同一个文件的同一个地方都做了修改,这时候merge会失败,git就不会自动创建一个新的commit,而是停住。你需要手动修改这些冲突文件,选择这两个分支中的一个版本,或者自己重写这个部分,然后手动添加这些文件到暂存区,再commit 一下就ok了。要查看哪些文件冲突,可以用git status”。


6、撤消改动

当你执行某个命令之后,突然发现自己写错了,怎么办?

1)如果提交得太早、忘了添加某些文件,可以这样做:

git commit -m ‘add something’

git add file1

git commit --amend

上面的第三条命令把当前暂存区域设置为最近一次提交的内容。

执行git commit之后,马上执行git commit --amend会直接跳到编辑commit备注里面,可以修改上次commit时所写的备注。

2)如果添加了错误的文件,可以这样挽回:

git add .      // 把所有的文件都添加进去

git reset HEAD readme  //readme文件从暂存区域去除

3)如果发现编辑错了一个文件,想把它恢复到上一个版本的状态:

git checkout -- filename1 // 只撤消这一个文件

4)如果觉得这个版本糟糕透了,想完全回滚到上一个版本:

git reset --hard HEAD^

HEAD 指向当前版本,^指当前版本的父版本,这个操作无法撤消。

可以把 --hard 换成--soft,只会回退commit信息。

还有一个 --mixed 默认选项,大家可以参考官方文档,查看这3个选项的具体区别。


6、GIT常用命令

git add

git clone

git commit

git push

git checkout

git reset

git pull

git status

git branch

git tag

git log

git merge

你可能感兴趣的:(GIT使用教程(简化版))