安装
配置
因为Git是分布式版本控制系统,所以首先应该配置一下你的身份,这样在提交代码的时候Git 就可以知道是谁提交的了。
安装后在终端里输入命令:
git config --global user.name "your name"
git config --global user.email "email@example.com"
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
Git全局配置文件.gitconfig
默认在当前系统用户文件夹下。
基础
- 工作区就是电脑里能看到的目录,比如我的版本库文件夹就是一个工作区。
- 暂存区就是图里的
stage
- 一图表示了
add
与commit
和三者的关系。
命令
初始化一个Git仓库:
git init
添加文件到Git仓库,分两步:
- 使用命令
git add <file>
,可反复多次使用或使用.
表示当前目录所有文件,添加多个文件; - 使用命令
git commit -m <message>
提交,在commit命令的后面,我们一定要通过-m 参数来加上提交的描述信息,没有描述信息的提交被认为是不合法的。
查看仓库当前的状态:
git status
命令可以让我们时刻掌握仓库当前的状态,新修改是否未add,add了是否没commit等。
查看工作区对对暂存区的修改:
git diff
命令查看工作区对对暂存区修改了什么内容;git diff HEAD -- <file>
,则是分支对工作区,可看更详细。
查看提交日志:
git log
可以看到最近到最远的提交日志,如果嫌输出信息太多,看得眼花缭乱的,可以加上--pretty=oneline
简化每此提交的日志为一行。看到的一长串SHA1
值就是commit id
(版本号)
当提交记录非常多的时候,如果我们只想查看其中一条记录,可以在命令中指定该记录的id,并加上-1
参数表示我们只想看到一行记录,如下所示:
git log 1fa380b502a00b82bfc8d84c5ab5e15b8fbf7dac -1
而如果想要查看这条提交记录具体修改了什么内容,可以在命令中加入-p
参数,命令如下:
git log 1fa380b502a00b82bfc8d84c5ab5e15b8fbf7dac -1 –p
git reflog
命令记录你的每一次commit
命令和commit id
(版本号)记录。
撤销工作区的修改全部
在Git中,用HEAD
表示当前版本,也就是最新的提交,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
git checkout -- <file>
命令把文件在工作区的修改全部撤销(新建的文件除外),这里有两种情况:
- 一种是readme.txt自修改后还没有被放到暂存区(未
add
),撤销修改后就回到和版本库(最近commit
)一模一样的状态; - 一种是readme.txt已经添加到暂存区后,又作了修改(
add
后又修改),撤销修改后就回到添加到暂存区后的状态(刚add
时)。
总之,就是让这个文件回到最近一次commit
或add
时的状态。
取消添加
对于已commit
提交的文件我们应该先对其取消添加,然后才可以撤回提交。取消添加使用的是reset命令:git reset HEAD <file>
虽然在调用时加上 --hard 选项可以令 git reset 成为一个危险的命令(可能导致工作目录中所有当前进度丢失!),但本例中工作目录内的文件并不会被修改。 不加选项地调用 git reset 并不危险 — 它只会修改暂存区域。
git reset --hard HEAD^
表示回到上一次提交的版本,--hard
后也可以加SHA1
值的commit id
(版本号),回退后log
里的最新就是旧的提交日志,新的会不见,不过只要知道新的commit id
就可以回到未来。
分支
分支是版本控制工具中比较高级且比较重要的一个概念,它主要的作用就是在现有代码的基础上开辟一个分叉口,使得代码可以在主干线和分支线上同时进行开发,且相互之间不会影响。
如果想要查看当前的版本库当中有哪些分支,可以使用git branch
这个命令,可加-v
参数。
创建分支:
git branch <分支名>
切换工作分支:
git checkout <分支名>
创建+切换分支:
git checkout -b <name>
合并某分支到当前分支:
git merge <name>
加参数--no-ff
表示普通合并,
git log --graph
命令可以看到分支合并图
删除分支:
git branch -d <name>
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而默认的fast forward
合并就看不出来曾经做过合并。
在新分支上修改并提交的代码将不会影响到master分支。同样的道理,在master分支上修改并提交的代码也不会影响到新分支。
如果我们在version1.0分支上修复了一个bug,在master 分支上这个bug 仍然是存在的。这时将修改的代码一行行复制到master 分支上显然不是一种聪明的做法,最好的办法就是使用merge 命令来完成合并操作,如下所示:
git checkout master (切换到主分支)
git merge version1.0
仅仅这样简单的两行命令,就可以把在version1.0 分支上修改并提交的内容合并到master 分支上了。当然,在合并分支的时候还有可能出现代码冲突的情况,这个时候你就需要静下心来慢慢地找出并解决这些冲突,Git 在这里就无法帮助你了。
最后,当我们不再需要version1.0 这个分支的时候,可以使用如下命令将这个分支删除掉:
git branch -D version1.0
远程库
比如说现在有一个远程版本库的Git 地址是https://github.com/example/test.git,就可以使用如下的命令将代码下载到本地:
git clone https://github.com/example/test.git
之后你在这份代码的基础上进行了一些修改和提交,那么怎样才能把本地修改的内容同步到远程版本库上呢?这就需要借助push 命令来完成了,用法如下所示:
git push origin master
其中origin
部分指定的是远程版本库的Git 地址,master
部分指定的是同步到哪一个分支上,上述命令就完成了将本地代码同步到https://github.com/example/test.git 这个版本库的master分支上的功能。
知道了将本地的修改同步到远程版本库上的方法,接下来我们看一下如何将远程版本库上的修改同步到本地。Git 提供了两种命令来完成此功能,分别是fetch
和pull
,fetch
的语法规则和push
是差不多的,如下所示:
git fetch origin master
执行这个命令后,就会将远程版本库上的代码同步到本地,不过同步下来的代码并不会合并到任何分支上去,而是会存放到一个origin/master
分支上,这时我们可以通过diff
命令来查看远程版本库上到底修改了哪些东西:
git diff origin/master
之后再调用merge
命令将origin/master
分支上的修改合并到主分支上即可,如下所示:
git merge origin/master
而pull
命令则是相当于将fetch
和merge
这两个命令放在一起执行了,它可以从远程版本库上获取最新的代码并且合并到本地,用法如下所示:
git pull origin master
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git
,
关联后,使用命令git push -u origin master
第一次推送master
分支的所有内容。
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改(加了参数-u
后,以后即可直接用git push
代替git push origin master
)。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。