Git入门讲解

207 阅读11分钟

Git是目前最先进的分布式版本控制系统。它是由大名鼎鼎的Linux之父Linus写的,此人非常了不起,一不小心就写出了非常NB的开源项目。

至于集中式版本控制系统和分布式版本控制系统在这就不累赘了,可以搜索一下,下图是Git的工作流程。

Workspace:工作区

Index/Stage:暂存区

Repository:本地仓库

Remote:远程仓库

window环境安装Git

从Git官网下载Git安装程序:

安装程序按照默认设置即可。安装完成后会在开始菜单出现Git工具列表,依次点击Git-->Git Bash会弹出类似命令行的窗口。因为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的目录,这个目录是Git来跟踪管理版本的,千万不要手动乱改这个目录里面的文件,否则会把git仓库给破坏了。如果没有该目录,是因为这是个隐藏目录,在查看中勾选隐藏的项目即可。

二、把文本交给Git来管理。

  1. 在GitCode目录下新建文本readme.txt,任意输入文字:"hello world",在Git命令行中输入cat readme.txt,该命令是显示整个文件内容。
  2. 使用命令 git add readme.txt将该文本添加到暂存区。
    在这里插入图片描述
  3. 用命令git commit -m "说明"告诉Git,把文件提交到仓库。

-m 后面输入的是本次提交的说明,说明文字要做到见说明知道本次提交变动。

  1. 使用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提示我们使用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 checkout 命令加上–b参数表示创建并切换,相当于2条命令:

git branch 分支名:创建名为dev的分支,但依然停留在当前分支 git checkout 分支名:分支切换到dev git branch查看所有分支,当前分支前面会添加一个星号。

分支合并 分支合并工作准备,在dev分支上,修改readme.txt文件,增加"hello xiaoming",然后提交到dev分支。

在这里插入图片描述
dev分支工作已经完成并且已经提交,现在切换到master分支上,查看文件。
在这里插入图片描述
发现master分支readme.txt文本中没有"hello xiaoming"这一行,因为我是在dev分支中添加的,对master没影响。

现在要把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分支。

现在切换到master分支上来,也在最后末尾添加内容,
现在要把dev分支的内容合并到master上,发现产生冲突,如下:
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<<HEAD是指主分支修改的内容,>>>>>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”,会出现如下文件: ![](img-blog.csdnimg.cn/20191006011… =250x) 使用记事本打开id_rsa.pub文件,复制里面内容。登录码云gitee.com),点击头像--设置--安全设置--SSH公钥,将公钥粘贴进去,确定即可。

然后登录码云,在头像左侧+号,点击创建仓库,如图所示:

本地库资源推送远程库

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

把本地库的内容推送到远程,使用 git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了 –u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。推送成功后,可以立刻在github页面中看到远程库的内容已经和本地一模一样了,上面的要输入github的用户名和密码如下所示:
在这里插入图片描述
查看远程库:
在这里插入图片描述
从现在起,只要本地作了提交,就可以通过如下命令:git push origin master,推送到远程库了。

克隆远程库 上面讲了先有本地库,再有远程库,然后关联,并将本地库资源推送到远程库中。接下来实现克隆远程库到本地,这个更简单。

  1. 首先创建远程库,比如仓库地址:gitee.com/xxxx/spring…
  2. 使用命令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到本地来。

在这里插入图片描述
我将项目克隆到E盘下的test目录下。首先模拟同事在master上做开发,在readme.txt文件末尾添加一行"i am xiaoyang"提交并push到远程库中。

实际不要在master上直接开发。

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

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

现在手动已经解决完了,我接在需要再提交,再push到远程库里面去。

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

IDEA中使用Git

待续吧,不想写了...