0%

Git(一)

Git

Git——版本控制工具。版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

Git准备

Git 安装

Mac

下载地址:http://git-scm.com/download/mac

Windows

下载地址:http://git-scm.com/download/win

Linux

1
$ yum install git

初次运行前的配置

设置用户名与邮件地址:

1
2
$ git config --global user.name "kevin"
$ git config --global user.email kevin@example.com

如果使用了 --global 选项,那么该命令只需要运行一次。

修改命令颜色

1
2
3
4
$ git config --global color.status auto  
$ git config --global color.diff auto
$ git config --global color.branch auto
$ git config --global color.interactive auto

自定义log格式

1
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'"

上述命令将创建一个命令别名 lg,可输入 git lg使用该命令 ,且该命令与 git log命令二者互不干扰。

要检查已有的配置信息,可以使用 git config --list 命令。

Git介绍

Git状态及工作区

Git 有三种状态:已提交(committed)、已修改(modified)和已暂存(staged)。

已提交表示数据已经安全的保存在本地数据库中。已修改表示修改了文件,但还没保存到数据库中。已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

根据 Git 状态,Git项目分为三个工作区域:Git 仓库、工作目录以及暂存区域。

Git 仓库是Git 用来保存项目的元数据和对象数据库的地方。

工作目录是对项目的某个版本独立提取出来的内容。这些从Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供使用或修改。

暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在Git 仓库目录中。

Git基础

Git基本操作

获取Git仓库

在现有目录初始化仓库

1
$ git init

克隆以有的仓库

克隆仓库的命令格式是git clone [url]。例如:

1
$ git clone https://github.com/libgit2/libgit2

如果想在克隆远程仓库的时候,自定义本地仓库的名字,你可以使用如下命令:

1
$ git clone https://github.com/libgit2/libgit2 mylibgit

本地创建的仓库名字变为mylibgit

基本命令

git add

git add 命令可将该文件添加到缓存,使git跟踪新文件。例如:

1
$ git add README hello.php 

也可以使用 “ . ” 代替文件名,这样可以添加所有未缓存文件的到缓存,例如:

1
$ git add .

git status

git status 可以查看上次提交之后是否有修改。具体命令如下:

1
$ git status

可以在命令后 加-s--short获得简短的描述,例如:

1
$ git status -s

新添加的未跟踪文件前面有??标记,新添加到暂存区中的文件前面有A标记,修改过的文件前面有M标记。M有两个可以出现的位置,出现在右边的M表示该文件被修改了但是还没放入暂存区,出现在靠左边的M表示该文件被修改了并放入了暂存区。

git diff

执行 git diff 可以查看执行 git status 的结果的详细信息。具体命令如下:

1
$ git diff

git commit

git commit 是记录缓存区的快照。具体命令如下:

s lcon s
1
$ git commit -m '提交备忘'

Git提供了一个跳过使用暂存区域的方式,只要在提交的时候,给git commit加上-a选项,Git就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤:

1
$ git commit -a -m '提交备忘'

我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行带有--amend选项的提交命令尝试重新提交:

1
$ git commit --amend

这个命令会将暂存区中的文件提交。如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。

文本编辑器启动后,可以看到之前的提交信息。编辑后保存会覆盖原来的提交信息。

例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:

1
2
3
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

最终你只会有一个提交,第二次提交将代替第一次提交的结果。

git rm

要从Git中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。具体命令如下:

1
$ git rm PROJECTS.md

git log

git log可以用来查看提交历史。具体命令如下:

1
$ git log

git reset HEAD

git reset HEAD可以使进入暂存(git add)的文件取消暂存。例如:

1
$ git reset HEAD CONTRIBUTING.md

git checkout –

git checkout -- <file>可以丢弃工作区的修改,该命令可以让这个文件回到最近一次git commitgit add时的状态。

1
$ git checkout -- readme.txt

git checkout -- <file>命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。

远程仓库

查看远程仓库

查看已经配置的远程仓库服务器,可以运行git remote命令。可以指定选项-v,会显示需要读写远程仓库使用的Git保存的简写与其对应的URL。

1
2
3
4
5
$ git remote
origin
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)

如果想要查看某一个远程仓库的更多信息,可以使用git remote show [remote-name]命令。

添加远程仓库

运行git remote add <shortname> <url>添加一个新的远程Git仓库,同时指定一个可以引用的简写:

1
$ git remote add pb https://github.com/paulboone/ticgit

从远程仓库中抓取与拉取

从远程仓库中获得数据,可以执行:

1
$ git fetch [remote-name]

这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成后,你将会拥有远程仓库中所有分支的引用,可以随时合并或查看。git fetch命令会将数据拉取到你的本地仓库,它并不会自动合并或修改你当前的工作。当准备好时你必须手动将其合并入你的工作。可以使用git pull命令来自动的抓取然后合并远程分支到当前分支。

推送到远程仓库

推送到远程仓库可以使用git push [remote-name] [branch-name]命令。当你想要将master分支推送到origin服务器时,那么运行这个命令就可以将你所做的备份到服务器:

1
$ git push origin master

当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会被拒绝。你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。

远程仓库的移除与重命名

如果想要重命名引用的名字可以运行git remote rename去修改一个远程仓库的简写名。例如,想要将pb重命名为paul,可以用git remote rename这样做:

1
$ git remote rename pb paul

如果想要移除一个远程仓库,可以使用git remote rm

1
$ git remote rm paul

打标签

查看标签

1
$ git tag

你也可以使用特定的模式查找标签。例如,Git 自身的源代码仓库包含标签的数量超过500 个。如果只对1.8.5 系列感兴趣,可以运行:

1
$ git tag -l 'v1.8.5*'

创建标签

Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。

附注标签

1
$ git tag -a v1.4 -m 'my version 1.4'

轻量标签

1
$ git tag v1.4-lw

后期打标签

假设提交历史是这样的:

1
2
3
4
5
6
7
8
9
10
11
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme

现在,假设在v1.2 时你忘记给项目打标签,也就是在“updated rakefile” 提交。你可以在之后补上标签。要在那个提交上打标签,你需要在命令的末尾指定提交的校验和(或部分校验和):

1
$ git tag -a v1.2 9fceb02

共享标签

默认情况下,git push命令并不会传送标签到远程仓库服务器上。在创建完标签后必须显式地推送标签到共享服务器上。可以运行git push origin [tagname]命令。

1
$ git push origin v1.5

如果想要一次性推送很多标签,也可以使用带有--tags选项的git push命令。这将会把所有不在远程仓库服务器上的标签全部传送到那里。

1
$ git push origin --tags

检出标签

在Git中你并不能真的检出一个标签,因为它们并不能像分支一样来回移动。如果想要工作目录与仓库中特定的标签版本完全一样,可以使用git checkout -b [branchname] [tagname]在特定的标签上创建一个新分支。

1
$ git checkout -b version2 v2.0.0

如果在这之后又进行了一次提交,version2分支会因为改动向前移动了,那么version2分支就会和v2.0.0标签稍微有些不同。