1 *基础*
Git创建的全过程
1.1 *初始配置*
git config :专门用来配置或读取相应的工作环境变量
· /etc/gitconfig 文件:系统中对****所有用户****都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
· ~/.gitconfig 文件:用户目录下的配置文件****只适用于该用户****。若使用 git config 时用 --global 选项,读写的就是这个文件。
· 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置****仅仅针对当前项目****有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
1.1.1 *用户信息*
$ git config --global user.name “John Doe”
$ git config --global user.email johndoe@example.com
如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
1.1.2 *文本编辑器*
一般会是vim,如果换其他的,可以
$ git config --global core.editor emacs
1.1.3 *差异分析工具*
解决合并冲突时使用哪种差异分析工具
$ git config --global merge.tool vimdiff
1.1.4 *查看配置信息*
git config –list
也可以直接查阅某个环境变量的设定,只要把特定的名字跟在后面即可,像这样:
$ git config user.name
Scott Chacon
1.2 *取得项目的git仓库*
有两种取得 Git 项目仓库的方法。第一种是在现存的目录下,通过导入所有文件来创建新的 Git 仓库。第二种是从已有的 Git 仓库克隆出一个新的镜像仓库来。
1.2.1 *从公共目录初始化新仓库*
要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执行:
$ git init
初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。*但我们还没有开始跟踪管理项目中的任何一个文件。*
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:
$ git add *.c #将文件纳入版本控制
$ git add README
$ git commit -m ‘initial project version’ #提交
add会把文件放入暂存区,如果add之后又有修改,需要再次add才行,否则commit的是修改之前的文件
1.2.2 *从现有仓库克隆*
克隆仓库的命令格式为 git clone [url]比如
$ git clone git://github.com/schacon/grit.git
如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:
$ git clone git://github.com/schacon/grit.git mygrit
1.3 *记录每次更新到仓库*
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
工作目录下面的所有文件都不外乎这两种状态:*已跟踪或未跟踪*。已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区。而所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。
在编辑过某些文件之后,Git 将这些文件标为已修改。我们逐步把这些修改过的文件放到暂存区域,直到最后一次性提交所有这些暂存起来的文件,如此重复。
1.3.1 *检查文本状态*
要确定文件当前处于什么状态,可以用 git status 命令。
1.3.2 *忽略某些文件*
我们可以创建一个名为 .gitignore的文件,列出要忽略的文件模式。*查看已暂存和未暂存的更新*
1.3.3 *查看已暂存和未暂存的更新*
git status 列出修改过的文件
git diff 此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容
git diff –staged 看已经暂存起来的文件和上次提交时的快照之间的差异
1.3.4 *提交更新*
现在的暂存区域已经准备妥当可以提交了。在此之前,请一定要确认还有什么修改过的或新建的文件还没有 git add 过,否则提交的时候不会记录这些还没暂存起来的变化。所以,每次准备提交前,先用git status 看下,是不是都已暂存起来了,然后再运行提交命令 git commit
也可以用 -m 参数后跟提交说明的方式
1.3.5 *跳过使用暂存区*
git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
1.3.6 *移除文件*
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。
用 --cached 选项即可:
$ git rm --cached readme.txt #不再跟踪这个文件
1.3.7 *移动文件*
要在 Git 中对文件改名
$ git mv file_from file_to
其实,运行 git mv 就相当于运行了下面三条命令
$ mv README.txt README
$ git rm README.txt
$ git add README
1.4 *查看提交历史*
在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 git log 命令查看
*选项* | *说明* |
---|---|
-p | 按补丁格式显示每个更新之间的差异。 |
–word-diff | 按 word diff 格式显示差异。 |
–stat | 显示每次更新的文件修改统计信息。 |
–shortstat | 只显示 --stat 中最后的行数修改添加移除统计。 |
–name-only | 仅在提交信息后显示已修改的文件清单。 |
–name-status | 显示新增、修改、删除的文件清单。 |
–abbrev-commit | 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。 |
–relative-date | 使用较短的相对时间显示(比如,“2 weeks ago”)。 |
–graph | 显示 ASCII 图形表示的分支合并历史。 |
–pretty | 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。 |
–oneline | –pretty=oneline --abbrev-commit 的简化用法。 |
*gitk* *图形化工具*
1.5 撤销操作
1.5.1 *修改最后一次提交*
$ git commit -m ‘initial commit’
$ git add forgotten_file
$ git commit –amend
上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。
1.5.2 *取消已经暂存的文件*
git reset HEAD … 的方式取消暂存
1.5.3 *取消更改*
git add .
git reset --HARD
1.5.4 *取消对文件的修改*
git checkout – …
该文件已经恢复到修改前的版本。你可能已经意识到了,这条命令有些危险,所有对文件的修改都没有了,因为我们刚刚把之前版本的文件复制过来重写了此文件。所以在用这条命令前,请务必确定真的不再需要保留刚才的修改。
1.5.5 *返回某旧的版本*
git log
取得各个版本信息
1.6 *打标签*
1.6.1 *列出已有标签*
git tag
1.6.2 *新建标签*
Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。
创建一个****含附注类型的标签****非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可
$ git tag -a v1.4 -m ‘my version 1.4’
可以使用 git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。
****轻量级标签****实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a,-s 或 -m 选项都不用,直接给出标签名字即可:
$ git tag v1.4-lw
2 *分支*
创建一个新的分支 git branch
$ git branch testing
要切换到其他分支,可以执行 git checkout 命令。我们现在转换到新建的 testing 分支
$ git checkout testing
2.1 *分支的新建与合并*
2.1.1 *分支的新建与切换*
要新建并切换到该分支,运行 git checkout 并加上 -b 参数:
$ git checkout -b iss53
这相当于执行下面这两条命令:
$ git branch iss53
$ git checkout iss53
用 git merge 命令来进行合并:
$ git checkout master
$ git merge hotfix
使用 git branch 的 -d选项执行删除操作:
$ git branch -d hotfix #Deleted branch hotfix (was 3a0874c).
2.1.2 *分支的合并*
在问题 #53 相关的工作完成之后,可以合并回 master 分支。实际操作同前面合并 hotfix 分支差不多,只需回到 master 分支,运行 git merge 命令指定要合并进来的分支:
$ git checkout master
$ git merge iss53
2.1.3 *遇到冲突时的分支合并*
这种问题只能由人来裁决。
2.2 *分支管理*
git branch
如果不加任何参数,它会给出当前所有分支的清单:
$ git branch
iss53
* master
Testing
若要查看各个分支最后一个提交对象的信息,运行 git branch –v
2.3 *分支的衍合*
把在 C3 里产生的变化补丁在 C4 的基础上重新打一遍。在 Git 里,这种操作叫做衍合(rebase)。有了 rebase 命令,就可以把在一个分支里提交的改变移到另一个分支里重放一遍。