Git入门
git初始化
设置你的名字和email,这些是你再提交commit时的签名,每次提交记录中都会包含这些信息。
使用git config命令进行配置:
git config --global user.name 'haohj'
git config --global user.email 'haohj@outlook.com'
执行了上面的命令后,就会在C:\Users\Administrator下建立一个叫.gitconfig的文件(Administrator是我本机的用户名)。内容一般是像下面这样的
[user]
email = haohj@outlook.com
name = haohj
上面的配置文件就是Git全局配置文件,一般的配置方法是git config --global <配置名称> <配置的值>。
如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config命令不带 --global选项来设置。这会在你当前的项目目录下创建.git/config,从而使用针对当前项目的配置。
获得一个Git仓库
有两种方法可以得到一个Git仓库:一种是从已有的Git仓库中clone (克隆,复制);还有一种是新建一个仓库,把未进行版本控制的文件进行版本控制。
Clone一个仓库
git clone https://github.com/haohj/gitproject
初始化一个新的仓库
对一个已存在的文件夹使用下面的命令让它置于Git的版本控制管理之下。
git init
正常的工作流程
git的基本工作流程如下:
- 创建或修改文件
- 使用git add命令添加新创建或修改的文件到本地的缓存区(Index)
- 使用git commit命令提交到本地代码库
- (可选,有的时候并没有可以同步的远端代码库)使用git push命令将本地代码库同步到远端代码库
创建或修改文件
在项目目录下创建一个文件,比如我们创建一个README.md文件。
创建完可以使用git status命令查看当前git仓库的状态,可以发现刚刚创建的文件处于untracked状态,下一步我们需要使用git add命令将这些文件加入到缓存区(Index)。
使用git add加入缓存区
使用git add命令将新建的文件添加到缓存区:
git add README.md
使用git commit提交修改
当所有新建,修改的文件都被添加到了缓存区,我们就需要使用git commit提交到本地仓库
git commit -m "add README.md"
注意:
- 新建文件,修改文件,都需要使用git add命令添加到缓存区才可以提交。
- 删除文件,则需要直接使用git rm命令删除后会自动将已删除文件的信息添加到缓存区,git commit提交后就会将本地仓库中的对应文件删除。
如果我们还希望将本地仓库关联到远端服务器,我们可以使用git remote命令,不同于git clone命令,直接将远端的仓库克隆下来。如果我们当前的仓库是使用git init初始化的本地仓库,那么我们需要将本地仓库与远程仓库关联,使用如下命令(需要修改下面的远程仓库地址为自己的仓库地址)
git remote add origin https://github.com/haohj/gitproject.git
对于上述命令而言,git remote add命令用于添加远程主机,origin是主机名,此处我们可以自定义,不一定非要使用origin。
这个时候如果本地的仓库连接到了远程Git服务器,可以使用下面的命令将本地仓库同步到远端服务器:
git push origin
分支与合并
Git的可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线。分支的作用体现在多人协作开发中,比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,其它同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。
创建分支
一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫test的分支:
git branch test
运行git branch命令可以产科当前的分支列表,以及目前的开发环境处在哪个分支上。
切换分支
通过刚才的查看分支命令我们可以看到,test分支是我们刚才创建的,master分支是Git系统默认创建的主分支。星号标识了你当前工作在哪个分支下。使用如下命令可以切换到其它分支:
git checkout test
切换到test分支,切换完成后,我们先编辑一下里面的一个文件,再提交(commit)改动,最后切回“master”分支
这时我们会发现刚刚修改的内容看不到了。这是因为我们刚刚是在test分支下修改的,现在切换回了master分支,目录下的文件都是master分支上的文件了。
合并分支
现在我们在master分支上继续做一些不同的修改
这时两个分支有了各自不同的修改,分支内容都已经不同了,需要使用git merge命令来合并test到主线分支master。
-m参数仍然是需要填写合并的注释信息。
- 如果两个分支修改的文件不同,那么就不会有冲突,执行上面的命令后合并就完成了。
- 如果两个分支都修改了同一个文件,则合并失败。
我们刚刚的修改就是第二种情况,现在合并失败了。这时我们用git status命令查看状态会发现文件显示both modified。
查看文件就会看到文件中有git自动产生的冲突<<<<<<<<<符号
这时需要我们手动解决冲突然后再重新提交。
删除分支
当我们完成合并后,不再需要test时,可以使用下面的命令删除:
git branch -d test
git branch -d只能删除那些已经被当前分支合并的分支。如果你要强制删除某个分支的话就需要用git branch -D
撤销一个合并
如果你觉得你合并后的文件有问题,想把当前的修改都放弃,可以使用下面的命令回到合并之前的状态:
git reset --hard HEAD^
快速向前合并
还有一种需要特殊对待的情况在前面没有提到。通常,一个合并会产生一个合并提交(commit),把两个父分支的每一行内容都合并进来。
但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交(commit)都已经存在另一个分支里了,git就会执行一个“快速向前”(fast forward)操作;git不创建任何新的提交(commit),只是将当前分支只想合并进来的分支。
Git日志
查看日志
git log命令可以显示所有的提交(commit):
git log
如果提交的历史记录很长,回车会逐步显示,输入q可以退出。
git log有很多选项,可以使用git help log查看。Git会根据git log命令的参数,按时间顺序显示相的提交。
日志统计
如果使用--stat选项使用git log,则会显示在每个提交中哪些文件被修改了,这些文件分别添加或删除了多少行内容,这个命令相当于打印详细的提交记录。
git log --stat
格式化日志
你可以按你的要求来格式化日志输出。--pretty参数可以使用若干表现格式,如oneline:
git log --pretty=oneline
或者你也可以使用short格式:
git log --pretty=short
你也可以用medium,full,fuller,email或raw。如果这些格式不完全符合你的需求,你也可以用--pretty=format参数定义格式。
--graph选项可以可视化你的提交图,会用ASCII字符来画出一个很漂亮的提交历史(commit history)线:
git log --graph --pretty=oneline
日志排序
日志记录可以按不同的顺序来显示。如果你要指定一个特定的顺序,可以为git log命令添加顺序参数。
按默认情况,提交会按照时间逆序排列显示,可以指定--topo-order参数,让提交按拓扑顺序来先(就是子提交在它们的父提交前显示)。
git log --pretty=format:'%h : %s' --topo-order --graph
你也可以用--reverse参数来逆向显示所有提交日志。