Windows
下的Git
的使用命令和Linux
、Unix
、Mac
都一样,本文将首先从一些应用场景介绍Git
的基本命令(上),然后详细介绍如何在Virtual Studio 2015
里使用Git
(下)。(至于安装,在windows
下实在是太简单了就不介绍了,直接去官网下载安装吧)
一、Git的基本操作
0. 一些必要的介绍
(1) 工作区,就是我们在本机上Git
目录,我们直接修改文件的时候,所有的修改都只是在工作区。
(2) 暂存区(stage
或者index
),是版本库中的一部分。工作区中的修改需要通过git add
添加到暂存区,这些修改在暂存区中等待被提交到版本库中形成版本。
(3) 分支,是版本库中的重要部分。初始情况下Git
为我们自动创建了第一个分支master
,我们之后创建的分支,以及所有分支里的所有提交形成的版本记录都保存在这里。
(4) HEAD
指针,也是版本库中的重要部分。初始情况下它指向master
,HEAD
所指向的版本就是当前版本,也就是最新的提交。
1. 两种开始方式(创建新的版本库 or
从远程库克隆)
创建新的版本库,需要首先在本地创建一个空文件夹(最好不要有中文),然后在该目录下使用命令git init
来把这个目录变成Git
可以管理的仓库。
从远程库克隆,首先你需要有一个远程库,不妨设为git@github.com:test/test.git
,那么你就可以使用命令 git clone git@github.com:test/test.git
来把远程库里的所有文件克隆到本地。
2. 对原始代码进行修改后提交
(1) 创建分支(并不是修改代码一定要创建分支,也可以直接在master
上进行,但是一个良好的习惯是无论是添加新的feature
还是fix bug
最好先创建一个分支,修改好了提交再合并到master
)
首先你要清楚当前你所处的branch
,然后确定你的修改要基于哪个branch
。假设你要在master
上进行修改,当前又不在master branch
则需要先切换过去,git checkout master
,然后采用下面的命令创建你的分支。
git branch dev/feature // 创建新的分支,名字是dev/feature git checkout dev/feature // 从master切换到我们刚创建的分支
上面这两句话可以通过一个参数变成一句话,即-b
,表示创建新的branch
且切换过去。
git checkout -b dev/feature
(2) 修改文件(与git
无关就不介绍了,假设修改了文件test.cs
)
(3) 将修改添加到暂存区
git add test.cs
注意,如果test.cs
是你的project
里的一个文件,还需要带上整个相对路径,如果不清楚,可以在add
之前git status
命令看看,它会告诉你哪个文件修改了还没有提交,直接用它提示的那个文件名
(4) 把修改提交到仓库
git commit -m "comment on your change"
-m
后面是本次提交的说明,你可以在这里简要描述你的修改内容,这样查看或者查找修改的历史记录时会比较方便。
(5) 把修改合并到master
git checkout master git merge dev/feature
默认情况下这样合并是“快进模式”(Fast-forward
),也就是直接把master
指向dev/feature
的当前提交,所以合并速度非常快。如果不想让他这样做,则可以使用参数--no-ff
:
git merge --no-ff -m "merged dev/feature" dev/feature
(6) 把修改提交到Server
git push origin master
(7) 删除分支
如果dev/feature
不会再使用,则可以在merge
之后就删掉它,反正Git
里创建和删除分支的代价很小。
git branch -d dev/feature
3. 撤销修改
上面介绍了如果提交你的修改,那如果发现修改不对,要撤销修改怎么办呢?当然在不同的阶段,撤销的方法也是不一样的。
(1) 尚未将修改添加到暂存区
采用git checkout -- file
直接丢弃工作区的修改。如果同一个文件你要保留一部分修改,撤销一部分的话,好像不行。所以建议你每完成一小块的工作就通过git add
添加到暂存区。这样工作区的修改不会太大,直接丢弃没什么影响。
比如,你先在test.cs
文件里添加了func1()
函数,add
到暂存区;然后添加了函数func2()
函数。突然间对这部分不满意了,这个时候直接采用git checkout -- test.cs
就可以丢弃添加的func2()
函数,对func1()
没影响。
(2) 修改已经添加到暂存区,但是尚未提交
用命令git reset HEAD file
(这里HEAD
表示最新的版本)可以把暂存区的修改撤销掉,这些修改被重新放回工作区,可以在工作区接着修改后添加到暂存区,或者在工作区再采用(1)中的方法直接丢弃。
(3) 修改已经提交到版本库,但尚未推送到远程库
参见接下来的一节 版本回退
4. 版本回退
(1) 用git log
命令查看提交的历史记录
可以添加参数--pretty=oneline
让每个记录只输出一行
git log --pretty=oneline
也可以设置一些其他的参数,如下所示,你可以试试。
git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
(2) 确定你要回退到的版本
从上面的log
中你可以看到历史上的各个版本,但是要确定你要回退到的版本,你首先要知道Git
中的版本表示。在Git
中,HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。
(3) 使用git reset
命令回退到指定版本
git reset --hard HEAD^
(4) 若回退后又想回到新版本
git reflog git reset --hard 3628164
5. 合并的过程中遇到冲突
当merge
的时候遇到冲突时,我们需要手动修改冲突的部分,然后再提交。
假设我们在master
和test
两个分支下都修改了test.cs
的相同位置,则将test
分支合并到master
时就会出现冲突。我们打开test.cs
文件,可以看到冲突的位置。可以直接修改后保存,再提交到master
。
可以用带参数的git log
也可以看到分支的合并情况:
git log --graph --pretty=oneline --abbrev-commit
参考文献: