您的位置:首页 > 其它

git使用基础教程

2016-02-20 17:10 295 查看

一、Git介绍

Git是一款目前最流行的分布式版本控制系统,同类型的主要有Mercurial、Bazaar、Darcs等等。客户端提取的不仅仅是最新版本的文件快照,而是拷贝整个仓库的镜像,所以每一次Clone操作实际上都是对代码仓库的完整备份。各节点之间都可以互相pull和push进行同步。Git主要特点如下:

1.1. 分布式

传统的版本控制系统如CVS、Subversion等等采用单一的集中管理服务器保存所有文件的修订版本。协同工作者可以通过客户端连接到这台服务器,取出最新的文件或者提交更新。这样做法的优点是协作者可以在一定程度上看到其他人在做什么,管理员也可以轻松控制每个开发者的权限;缺点是单点存储数据,一旦出现故障客户端均无法使用,并且数据安全性存储极大隐患。集中话版本控制结构如下:



Git 是分布式版本控制系统,客户端并不止提取最新版本的文件快照,而是把代码仓库完整的镜像拷贝下来,每一次clone操作都是一次对代码仓库进行完整的备份。一旦源服务器出现问题,其他clone的仓库就可以用来恢复。不过这时候恢复的是更新到的最新状态,Git不会自动去更新其他子节点,而是将这部分权限放置到使用者。因此git可以在各子节点中间进行更新和提交。Git结构图如下:



1.2. 存储方式

Git和其他版本控制系统的一个重要差别是数据的存储方式。CVS、Subversion等这类系统将他们保存的信息看座是一组基本文件和每个文件随时间逐步积累的差异。如下图:



Git更像是把数据看作对小型文件系统的一组快照。每次更新提交或在Git中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,不再重新存储该文件而只是保留一个链接指向之前存储的文件。存储过程如下图:



1.3. 大量本地操作

Git中大多数操作都只需要访问本地文件和资源,而不需要访问网络上其他服务器。因为本地就是一个仓库,所有更新就可以直接进行提交到本地仓库,需要远程操作的是和远程仓库节点进行同步。

二、Git操作

1. Git 文件状态

committed:已经提交到本地仓库

modified:已经修改但未提交到本地仓库

staged:已暂存,对已修改的文件做了标记,使之包含在下次提交的快照中

根据三种中状态引入了三个工作区域概念:Git仓库、工作空间、暂存区域

通过git add命令可以把已经修改的文件放入暂存区,add用于添加内容到下一次提交中。

查看文件状态:git status

提交到本地仓库:git commit

存储到暂存区域:git add

2. Git 配置文件

/etc/gitconfig:配置系统上所有用户 (C:\Users\$USER\.gitconfigWindows)

~/.gitconfig:配置当前用户

.git/config:配置当前仓库

使用git config命令配置信息,首先应该配置用户基本信息(name、email等)

$ git config --global user.name “your name”

$ git config –global user.email
you@exmaple.com

$ git config –list # 查看当前配置

$ git config <key> # 查看特定key配置,如user.name

global 参数标识设置全局变量,如果只需要针对当前仓库的变量不需要global

3. 获取Git仓库

3.1 通过导入现有目录到Git仓库

$ git init

$ git add files

$ git commit –m“initial project”

3.2 从远程服务器Clone Git仓库

$ git clone URL # 如果需要自定义名字在URL后跟上名称即可

-o origin_name 参数可以修改远程别名默认为origin,即clone地址的别名

4. 文件忽略

有些文件可能需要git忽略到不进行跟踪,如日志,字节码文件等。可以在仓库根目录设置.gitignore文件设置需要忽略的文件。

.gitignore 文件格式规范如下:

a. 所有空行或者#开头的行都不生效

b. 可以使用标准的glob模式匹配(Shell 使用的简化版正则表达式)

c. 匹配模式可以用(/)开头防止递归

d. 匹配模式可以用(/)结尾指定目录

e. 可以使用(!)对指定模式文件或目录取反

5. 文件操作

删除文件:

$git rm file # 手动删除是无效的,再次运行gitrm命令删除;-f 强删

$ git rm file –cached file # 删除时保留本地文件

重命名文件:

$ gitmv name name _new

6. 撤销操作

取消暂存(取消add):

$ git reset HEAD <file> #注意git reset --hard 会把工作空间还原到仓库状态

撤销文件的修改:

$ git checkout file

HEAD 为指向当前的本地分支的指针

7. 远程仓库操作

查看远程仓库:

$ git remote

$ git remote –v #列出具体读写远程地址

$ git remote show [remote_name]

默认clone仓库为origin,即originclone仓库地址shortname

添加远程仓库:

$ git remote add <shortname> URL

获取远程分支更新:

$ git fetch remote_name # 只获取远程数据不会自动合并,默认为远程默认分支

$ git pull remote_name # 获取远程数据并自动合并(fetch +merge)

推送更新到远程:

$ git push remote_name branch_name # 如果远程已被其他人更新需要先pull

$ git push remote_namebranch_name:remote_branch_name

远程仓库移除与重命名:

$ git remote rename remote_name new_name

$ git remote rm remote_name

8. 标签操作

Git 标签分为轻量标签(lightweight)和附注标签(annotated),附注标签可以记录打标签者姓名、日期等信息。

查看标签:

$ git tag

$ git show tag_name #查看标签信息

打标签:

$ gittag –a v1.0 –m ‘my v1.0’ [commit_id] # 附注标签

$ git tag v1.0 # 轻量标签

推送标签:

$ git push origin tag_name # 推送指定tag到origin

$ git push origin --tags # 推送所有tag

9. 分支操作

查看分支:

$ git branch –a # -a 列出所有分支,包括本地和远程

*所指向的分支为HEAD指针指向分支,即当前分支

-v 可以查看每一个分支的最后一次提交

--merged, --no-merged可以分别过滤查看已经合并和未合并到当前分支的分支

创建分支:

$ git branch branch_name

切换分支:

$ git checkout branch_name

$ git checkout -b branch_name [source_branch]# 先创建分组再切换branch + checkout,可以指定基于source_branch创建

$ git checkout --track remote_branch # 从远程检出对应本地分支(跟踪分支)

删除分支:

$ git branch -d branch_name

合并分支:

$ git merge branch_name # 合并branch_name到当前分支

查看各分支当前所指对象:

$ git log --decorate

HEAD 是一个指向当前所在的本地分支的指针

10. 冲突解决

分支合并产生冲突时(git merge),直接编辑文件。冲突文件中会出现HEAD >>> === <<<等字符。冲突部分用=====符号隔开,上面HEAD部分代表当前分支更新部分,下面部分表示最后提交版本中文件对应的部分。我们可以选择其中一部分或者合并两部分进行冲突解决,最后删除表标记符号,并保存文件。保存后用git add来标记冲突已经解决加入暂存区中。

利用git pull 远程代码提示文件冲突时,可以使用git stash先缓存本地文件,然后再pull,再利用git stash apply后手工合并文件。

提交代码时应该是先commit本地代码,再pull远程代码,如果有冲突这时候就可以手工合并。合并后再推送(push)到远程仓库。

11. 变基(rebase)

变基的目的是为了让合并历史更加简洁,显得串行化一下。rebase命令将提交到某一分支上的所有修改都转移到另一个分支上。合并流程如下:

$ git checkout branch # 切换到修改的分支上

$ git rebasedes_branch # 合并修改到目标分支des_branch中

$ git checkoutdes_branch

$ git mergebranch # 快进合并到des_branch中

注意:不要对有副本的分支进行变基
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: