Git
Git——版本控制工具。版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
Git准备
Git 安装
Mac
下载地址:http://git-scm.com/download/mac
Windows
下载地址:http://git-scm.com/download/win
Linux
1 | $ yum install git |
初次运行前的配置
设置用户名与邮件地址:
1 | $ git config --global user.name "kevin" |
如果使用了 --global
选项,那么该命令只需要运行一次。
修改命令颜色
1 | $ git config --global color.status 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 是记录缓存区的快照。具体命令如下:
1 | $ git commit -m '提交备忘' |
Git提供了一个跳过使用暂存区域的方式,只要在提交的时候,给git commit
加上-a
选项,Git就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add
步骤:
1 | git commit -a -m '提交备忘' |
我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行带有--amend
选项的提交命令尝试重新提交:
1 | git commit --amend |
这个命令会将暂存区中的文件提交。如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。
文本编辑器启动后,可以看到之前的提交信息。编辑后保存会覆盖原来的提交信息。
例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:
1 | git commit -m 'initial commit' |
最终你只会有一个提交,第二次提交将代替第一次提交的结果。
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 commit
或git add
时的状态。
1 | git checkout -- readme.txt |
git checkout -- <file>
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令。
远程仓库
查看远程仓库
查看已经配置的远程仓库服务器,可以运行git remote
命令。可以指定选项-v
,会显示需要读写远程仓库使用的Git保存的简写与其对应的URL。
1 | git remote |
如果想要查看某一个远程仓库的更多信息,可以使用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 | git log --pretty=oneline |
现在,假设在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
标签稍微有些不同。