Git

Git Guide

使用git管理你的文档

Posted by Wxk on February 10, 2018

Git - fast, scalable, distributed revision control system

源码地址

本文用于教学,面向初学者

Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而使用C和Shell开发的一个开放源码的版本控制软件。

GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。

如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。

网上资源

安装

Centos/RedHat

$ yum install curl-devel expat-devel gettext-devel \
  openssl-devel zlib-devel

$ yum -y install git-core

$ git --version
git version 1.7.1

Windows

安装包

Git 配置

Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。

这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是 C:\Documents and Settings$USER。

此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。

$ git config --global user.name "wangxk"
$ git config --global user.email seb.wang@zippowxk.com

文本编辑器

$ git config --global core.editor emacs

差异分析工具

$ git config --global merge.tool vimdiff

查看配置信息

$ git config --list
$ git config user.name

工作流

一般协作方式

img

开源协作方式

img

Git三区

我们先来理解下Git 工作区、暂存区和版本库概念

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

img

Git建库

$ git init   或者  $ git init reponame
$ git add .  或者 $ git add filename
$ git commit -m '初始化项目版本'

我们使用 git clone 从现有 Git 仓库中拷贝项目(类似 svn checkout)。

克隆仓库的命令格式为:

$ git clone <repo> <directory>
$ git clone /Users/wxkmac/Document/a/.git   # 本地 
$ git clone git://github.com/schacon/grit.git # 远程git协议
$ git clone http://github.com/schacon/grit.git # 远程http协议

基本操作

基本快照

Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。本章将对有关创建与提交你的项目的快照的命令作介绍。

git add

git add 命令可将该文件添加到缓存,如我们添加以下两个文件:

$ touch README
$ touch hello.php
$ ls
README        hello.php
$ git status -s
?? README
?? hello.php
$ git add README hello.php
$ git status -s
A  README
A  hello.php

git status

git status 以查看在你上次提交之后是否有修改。

$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   README
    new file:   hello.php

git diff

git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别

  • 尚未缓存的改动:git diff
  • 查看已缓存的改动: git diff –cached
  • 查看已缓存的与未缓存的所有改动:git diff HEAD
  • 显示摘要而非整个 diff:git diff –stat
$ echo this is some new content >> README 
$ git diff

git status 显示你上次提交更新后的更改或者写入缓存的改动, 而 git diff 一行一行地显示这些改动具体是啥。

git commit

使用 git add 命令将想要快照的内容写入缓存区, 而执行 git commit 将缓存区内容添加到仓库中。

Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址。

$ git add hello.php
$ git status -s
A  README
A  hello.php
$ $ git commit -m '第一次版本提交'
$ git status
# On branch master
nothing to commit (working directory clean)
$ git commit -a -m "commit message"

-a 可以省略 git add . 这一步。

-m 如果缺省则会进入对应的文本编辑器中,填写commit 信息

git reset HEAD

git reset HEAD 命令用于取消已缓存的内容。

git rm

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 Changes not staged for commit 的提示。

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。可以用以下命令完成此项工作

$ git rm <file>

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f

$ git rm -f <file>

如果把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 –cached 选项即可

$  git rm --cached <file>

git mv

git mv 命令用于移动或重命名一个文件、目录、软连接。

分支管理

列出分支

$ git branch
* master

此例的意思就是,我们有一个叫做”master”的分支,并且该分支是当前分支。

当你执行 git init 的时候,缺省情况下 Git 就会为你创建”master”分支。

如果我们要手动创建一个分支。执行 git branch (branchname) 即可。

$ git branch testing
$ git branch
* master
  testing

切换分支

$ git checkout master

创建分支并切换

$ git checkout -b newtest

删除分支

git branch -d (branchname)
$ git branch -d testing

分支合并

一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用以下命令将任何分支合并到当前分支中去:

git merge otherbranch

合并冲突

合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。

在两个分支对同一个文件进行修改,然后使用进行合并

$ git merge change_site
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
$ cat test.txt 
<<<<<<< HEAD
runoob.com
新增加一行
=======
www.runoob.com
>>>>>>> change_site

出现了冲突,可以手动编辑文件或使用冲突工具解决冲突。

<<<<<<< HEAD
runoob.com
新增加一行
=======
www.runoob.com
>>>>>>> change_site

删掉 <<<<<<< HEAD ======= >>>>>>> change_site

确认冲突最终解决方案。

修改完成后使用

$git add .

保存修改

查看历史

$ git log
$ git log --oneline  # 显示单行
$ git log --oneline --graph # 展示分支合并的拓扑图
$ git log --reverse --oneline # 反向展示
$ git log --author=Linus --oneline -5  # 只看某个作者的提交 
$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges  # 带有日期

标签

如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。

现在,注意当我们执行 git log –decorate 时,我们可以看到我们的标签了:

#### 打标签

$ git tag -a v1.0 
$ git tag -a <tagname> -m "runoob.com标签"  # tag信息

#### 查看标签

$ git tag
v0.9
v1.0

远程库

git remote add [shortname] [url] # 添加远程库
git remote  # 查看远程库

提取远程仓库

从远程仓库下载新分支与数据:

git fetch 

该命令执行完后需要执行git merge 远程分支到你所在的分支。

从远端仓库提取数据并尝试合并到当前分支:

git merge

推送到远程仓库

推送你的新分支与数据到某个远端仓库命令:

git push [alias] [branch]

以上命令将你的 [branch] 分支推送成为 [alias] 远程仓库上的 [branch] 分支,实例如下。

$ git push origin master    # 推送到 远程库的master分支中

删除远程仓库

git remote rm [别名]

参考