Git是目前最先进的分布式版本控制系统。它是由大名鼎鼎的Linux之父Linus写的,此人非常了不起,一不小心就写出了非常NB的开源项目。
至于集中式版本控制系统和分布式版本控制系统在这就不累赘了,可以搜索一下,下图是Git的工作流程。

Index/Stage:暂存区
Repository:本地仓库
Remote:远程仓库
window环境安装Git
从Git官网下载Git安装程序:

git config --global user.name "your name"
git config --global user.email "your email"

用户名和邮箱只是作为标识。--global参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。
版本管理
版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件“还原”。
一、创建版本库 在文件夹空白处鼠标右击弹出快捷菜单,点击Git Base Here,弹出命令行窗口,输入pwd,可见当前位置是该文件夹位置。
通过命令git init把该目录变成Git可以管理的仓库:

二、把文本交给Git来管理。
- 在GitCode目录下新建文本readme.txt,任意输入文字:"hello world",在Git命令行中输入
cat readme.txt,该命令是显示整个文件内容。
- 使用命令
git add readme.txt将该文本添加到暂存区。
- 用命令
git commit -m "说明"告诉Git,把文件提交到仓库。
-m后面输入的是本次提交的说明,说明文字要做到见说明知道本次提交变动。
- 使用
git status来查看是否还有文件未提交。返回说明指示没有要提交的东西了。
所有的版本控制系统,只能跟踪文本文件的改动,比如txt文件,网页,所有程序的代码等,Git也不列外,版本控制系统可以告诉你每次的改动,比如添加或删除哪些文字,但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是知道图片从1kb变成2kb,但是到底改了啥,版本控制也不知道。
三、版本修改 文件修改后提交,修改提交和新建提交是一样的,第一步是git add,第二步git commit。
四、版本回退
倘若我们想知道提交的历史版本信息,可以使用命令git log,显示从最近到最远的提交日志信息。git log --pretty=oneline显示简略信息。

git reset --hard HEAD^:回退到上一个版本git reset --hard HEAD~100:回退到前100个版本git reset --hard 版本号:通过git log查找版本号,使用该命令。版本号不必全部拼出和其它版本号有区分即可。
五、撤销修改 我想在readme.txt中添加一行:"hello world",发现错误输入成:"hello word",想改回去怎么办?有几种方式:
- 手动去更改错误的部分,然后add命令,最后commit命令。
- 版本回退到上一个版本。使用
git reset --hard HEAD^
还有一种方式,通过撤销命令,在撤销之前,我们先用git status命令查看下:

git restore <file>来放弃工作区文件更改。
- 已经add到暂存区的文件无法撤销更改。
git restore <file>是Git2.23版本引入的命令,之前版本使用git checkout -- <file>,目前 git checkout 命令承载了太多的功能,这样的改变我认为是比较合理的。
六、删除文件
一般情况下,直接在文件管理器中把文件删掉,或者用rm命令删除,因此,工作区和版本库就不一致了,git status命令会告诉你哪些文件被删除了:

git rm <file>,然后命令git commit -m "说明"。

工作区和暂存区
工作区:就是你在电脑上看到的目录,比如目录下gitcode里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。
版本库(Repository):工作区有一个隐藏目录.git,这个不属于工作区,这是版本库。其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。
我们前面说过使用Git提交文件到版本库有两步: 第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。 第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。
创建与合并分支
Git都把每次提交的版本串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
分支创建 创建dev分支,然后切换到dev分支上:

git branch 分支名:创建名为dev的分支,但依然停留在当前分支
git checkout 分支名:分支切换到dev
git branch查看所有分支,当前分支前面会添加一个星号。
分支合并 分支合并工作准备,在dev分支上,修改readme.txt文件,增加"hello xiaoming",然后提交到dev分支。


现在要把dev分支上的内容合并到分支master上,在master分支上,使用命令git merge dev:

git merge 分支名:用于合并指定分支到当前分支上。
查看一下master上文件内容,发现dev分支上的合并进来了:

查看分支:git branch 创建分支:git branch name 切换分支:git checkout name 创建+切换分支:git checkout –b name 合并某分支到当前分支:git merge name 删除分支:git branch –d name
解决冲突 先制造冲突。切换到dev分支上,在文件末尾添加内容,并提交到dev分支。




远程仓库
我们使用过版本的控制的同学都知道大名鼎鼎的GitHub,在国内使用可以回遇到网速慢的问题,我们可以使用国内的Git托管服务——码云(gitee.com)。和GitHub相比,码云也提供免费的Git仓库。此外,还集成了代码质量检测、项目演示等功能。对于团队协作开发,码云还提供了项目管理、代码托管、文档管理的服务,5人以下小团队免费。
远程库配置
首先注册码云账号,由于你的本地Git仓库和github仓库之间的传输是通过SSH加密的,所以还需要SSH Key。在用户主目录下(C盘-用户-选择已登录的账户),查看.ssh目录下,有没有id_rsa和id_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,输入如下命令:
ssh-keygen -t rsa –C “youremail@example.com”,会出现如下文件:

使用记事本打开id_rsa.pub文件,复制里面内容。登录码云(gitee.com),点击头像--设置--安全设置--SSH公钥,将公钥粘贴进去,确定即可。
然后登录码云,在头像左侧+号,点击创建仓库,如图所示:

对于已有仓库gitee给的提示:



git push origin master,推送到远程库了。
克隆远程库 上面讲了先有本地库,再有远程库,然后关联,并将本地库资源推送到远程库中。接下来实现克隆远程库到本地,这个更简单。
- 首先创建远程库,比如仓库地址:gitee.com/xxxx/spring…
- 使用命令
git clone 仓库地址克隆克隆远程库到本地。
多人协作
当你从远程库克隆时候,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程库的默认名称是origin。
要查看远程库的信息 使用 git remote 要查看远程库的详细信息 使用 git remote –v
推送分支
推送分支就是把该分支上所有本地提交到远程库中,推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上。使用命令 git push origin master
现在本地库和远程库中readme.txt文本内容都是一样的:

git push origin master

拉取分支
现在我在Gitee上直接修改readme.txt文件,本地通过git pull拉取远程库最新版本。
团队协作冲突处理 多人协作时,大家都会往master分支上推送各自的修改。现在模拟另外一个同事,可以在另一台电脑上(要把SSH key添加到码云上)或者同一台电脑上另外一个目录克隆。我们使用第二种方式,新建目录并克隆GitCode到本地来。

实际不要在master上直接开发。
接下来就是我做开发了。我也在同样的文本同个地方作了修改,并试图推送到远程库,如下:

由上面可知:推送失败,因为我的同事最新提交的和我试图推送的有冲突,解决的办法也很简单,上面已经提示我们,先用git pull把最新的提交从origin/master抓下来,然后在本地合并,解决冲突,再推送。

因此:多人协作工作模式一般是这样的: 首先,可以试图用git push origin branch-name推送自己的修改。 如果推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并。 如果合并有冲突,则需要解决冲突,并在本地提交。再用git push origin branch-name推送。
IDEA中使用Git
待续吧,不想写了...