Git快速入门

01、Git下载以及安装

下载地址:https://git-scm.com/download/win

这里我选择的是64位的免安装版

下载完成后是一个是一个自解压程序,我们可以使用7-zip将它解压到我们喜欢的地方,因为我们使用的是免安装版本,所以需要我们手动在系统环境变量的PATH变量中增加如下设置即可

1
2
3
4
# 例如这里我是将Git解压到E:\Software 请自行替换自己解压的位置
E:\Software\Git\bin
E:\Software\Git\usr\bin
E:\Software\Git\mingw64\bin

到这里我们可以使用cmd来进行确认是否安装成功

1
git --version

如果看到对应的git版本号信息的话,就说明我们的环境已经准备完成了~

02、Git的本地结构

一共分为三个部分:工作区、暂存区、本地库

  • 工作区:我们写的代码以及相关文件都会被存在这里
    • 通过git add可以提交到暂存区
  • 暂存区:我们想要提交但是还没有提交的文件在这里
    • 可以通过git commit继续提交到本地库
    • 可以通过git reset撤回到本地工作区
  • 本地库:存储所有真正的文件历史版本相关数据信息

03、Git使用场景

我们已经有了本地库,同样需要一个代码托管中心来帮我们维护远程库

本地库与远程库的交互,分为如下两个场景:

  • 团队内部协作

    • 由项目经理创建本地库,然后将本地库代码push推送到远程库
    • 开发人员将远程库的代码clone到自己的本地库
    • 代码开发完成,开发人员将本地库代码push推送到远程库
    • 项目经理在开发人员提交后,将新的远程库代码pull拉取到本地
  • 跨团队协作

    • 由A项目经理创建本地库,然后将本地库代码push推送到A远程库
    • 由B项目经理将A的远程库进行fork复制一个新的B远程库
    • A和B的开发人员按照团队内部协作方式各自进行开发
    • B团队需要将代码发起拉取申请pull reqeust操作
    • A团队看到申请后,觉得B团队提交的代码没有问题,进行merge合并
    • 合并完成后即完成了A的远程库和B的远程库进行同步的操作

下面通过考试的场景帮助大家更好的理解这个过程

  • 考试时你做的试卷相当于仓库
  • 做错的题目相当于bug
  • 老师把你的试卷拿过来相当于fork操作
  • 老师在你的试卷进行批改相当于git commit
  • 改好的试卷还给你,相当于申请pull request
  • 你按照老师的批改把做错的题目进行了改正相当于merge

当你想更正别人仓库里的错误时,要走一个流程:

  1. fork别人的仓库,相当于拷贝一份,相信我,不会有人直接让你改修原仓库的
  2. 将代码clone到本地分支,做一些bug的修改
  3. 发起pull request给原仓库,让他看到你修改的bug
  4. 原仓库review这个bug,如果是正确的话就会merge到他自己的项目中

常见的托管中心种类分为局域网以及外网

  • 局域网可以自行搭建GitLab

  • 外网可以使用Github或者Gitee

04、Git创建本地仓库

接下来我们就要开始创建本地仓库了,首先随便创建一个文件夹,并进行初始化操作

1
2
3
4
5
6
7
8
9
10
11
# 因为我使用的是windows自带的cmd 所以需要先进入bash控制台
bash

# 创建文件夹 这步也可以在系统手动创建
mkdir gitdemo

# 进入文件夹
cd gitdemo

# 初始化一个本地库
git init

经过以上几个步骤后,我们就可以在gitdemo文件夹内看到一个隐藏文件夹,其中会包含如下文件内容,这些文件内容请不要随意修改,可能会导致git无法正确识别到

05、Git设置全局签名

设置全局签名,有利于将来让别人知道代码是谁提交的,这一步对于甩锅或者追责非常重要喔~

1
2
3
4
5
# 设置名称 可以随意写 非托管中心账号
git config --global user.name "Levi"

# 设置邮箱 可以随意写 非托管中心邮箱
git config --global user.email "15011507338@163.com"

06、Git添加到暂存区

我们在gitdemo文件夹中随便创建一个文件当作我们编写的文件,并将它添加到暂存区

1
2
3
4
5
# 将demo.txt添加到暂存区
git add demo.txt

# 添加全部文件则使用.
git add .

07、Git提交文件

1
2
# 提交demo.txt并添加注释"第一次提交"
git commit -m "第一次提交" demo.txt

需要注意的是:

  • 不放在git本地仓库的文件是不会被git进行管理的
  • 即使放在git本地仓库的文件,也要通过git addgit commit才会被git管理

08、Git查看文件状态

我们可以随时使用git status对本地仓库内的文件的状态进行查看

1
2
3
4
# 以下提示代表暂存区是空的 没有需要提交的文件
$ git status
On branch master
nothing to commit, working tree clean

这时如果我们在本地仓库内新建一个demo2.txt的文件,再次运行git status

1
2
3
4
5
6
7
8
# 以下提示代表 有一个demo2.txt文件没有被追踪管理 并提示可以使用git add进行添加操作
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
demo2.txt

nothing added to commit but untracked files present (use "git add" to track)

然后我们使用git adddemo2.txt添加到暂存区中,再次运行git status

1
2
3
4
5
6
7
8
9
10
11
# 将文件添加到暂存区
Levi@DESKTOP-STVLE5R MINGW64 /d/gitdemo (master)
$ git add demo2.txt

# 以下提示代表 有一个demo2.txt文件可以进行提交操作
Levi@DESKTOP-STVLE5R MINGW64 /d/gitdemo (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: demo2.txt

然后我们使用git commitdemo2.txt进行提交,再次运行git status

1
2
3
4
5
6
7
8
9
10
11
12
# 将demo2.txt进行提交操作
Levi@DESKTOP-STVLE5R MINGW64 /d/gitdemo (master)
$ git commit -m "第二次提交" demo2.txt
[master 3f754d0] 第二次提交
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 demo2.txt

# 因为暂存区已经无待提交的文件 所以提示和最开始一样
Levi@DESKTOP-STVLE5R MINGW64 /d/gitdemo (master)
$ git status
On branch master
nothing to commit, working tree clean

09、Git查看提交日志

我们可以使用git log来对我们历史提交过的文件日志进行查看

1
git log

commit后面的一长串数字 可以理解为当前操作记录的索引值 可根据它进行查找

1
git log b55262a24db3bf2a244a5d63c4af22e2b7344f48

如果在日志很多的情况下,默认会显示分页信息,可以使用空格换到下一页,使用b换到上一页,如果看到结尾显示END则代表已经到尾页了,使用q可以结束查看日志,回到正常命令模式

但是如果我们的日志很多,这种方式显示起来就不是那么美观,我们可以使用一种更简洁的方式来打印我们需要的日志信息

1
2
# 显示完整索引号
git log --pretty=oneline

1
2
# 显示简短索引号
git log --oneline

我们还可以使用git reflog查看日志信息,其中HEAD@{数字}后面的数字代表需要几步才能回退到当前版本信息

1
git reflog

10、Git前进或回退历史版本

在上面查看日志的时候,我们可以看到每一次提交信息对应的索引信息,下面我们就可以使用name.txt文件来讲解reset命令的使用

前置准备条件:创建一个name.txt文件

  • 第一次编写zhangsan进行提交
  • 第二次编写lisi进行提交
  • 第三次编写wangwu进行提交

然后我们使用git reflog查看日志信息

这个时候我们可以看到,当前指针的位置是在最后一次提交的add wangwu上,我们此时如果想回到add zhangsan版本,可以使用如下命令

1
2
# hard后面的索引值 可以在日志中进行查看
git reset --hard a672d61

这时我们打开name.txt会发下内容已经回滚到zhangsan版本了,但是如果这时候我们又想再次回到wangwu版本怎么办呢?还是同样命令,修改为wangwu对应的索引即可

这里我们使用了--hard参数,相关的还有一个参数是--mixed参数和--soft参数

  • soft:重置git commit,即所有修改都回到暂存区中,可以再次进行commit
  • mixed:重置git commitgit add,即所有修改都回到工作区中,可以再次add
  • hard:重置git commitgit add和工作副本的修改,即未做任何修改,全部回滚

11、Git删除文件及找回

如果我们想把已经提交的文件进行删除,可以使用如下命令

1
2
3
4
5
6
7
8
# 删除本地仓库中的name.txt文件
rm name.txt

# 添加文件
git add name.txt

# 提交文件
git commit -m "delete name.txt" name.txt

这里需要注意的是,如果误删了某个文件,删除操作并非真正的删除,只是将索引值指向了别处而已,可以使用上一节讲到的reset进行回滚到上一个版本索引,实现文件找回操作

12、Git比对文件差异

如果我们想要比较出自己修改了哪些文件,可以使用如下命令

1
2
3
4
5
# 比较某一个文件差异 例如name.txt 红色-代表删除行 绿色+代表增加行
git diff name.txt

# 比较所有文件的差异
git diff

需要注意的是,使用diff命令比较的是工作区和暂存区,如果我们想要跟历史的某个版本进行比对,可以直接在命令后追加索引即可

1
2
# 6354a90为要比对版本的索引值 name.txt为要比对的文件
git diff 6354a90 name.txt

13、Git查看分支

什么是分支?

  • 在版本控制中,使用多条线同时推进多个任务,这里说的多条线,就是多个分支

分支的好处?

  • 同时多个分支可以并行开发,互不耽误,提高开发效率
  • 如果某个分支开发失败,可以直接删除,不影响主分支

我们可以使用git branch来查看都有哪些分支,✳代表当前在哪个分支开发

1
2
3
4
5
# 查看所有分支
git branch

# 查看所有分支以及最新版本索引
git branch -v

14、Git创建分支

我们可以使用git branch 分支名称来创建一个新分支

1
2
# 创建一个名字叫prod的新分支
git branch prod

15、Git切换分支

我们可以使用git checkout 分支名称来切换到另一个分支上

1
2
# 切换到prod分支
git checkout prod

16、Git解决冲突

冲突是比较常见的问题,下面说一下如何解决冲突问题

前置环境准备:

  • 新建一个分支prod

    1
    2
    # 新建prod分支
    git branch prod
  • 切换到prod分支修改name.txt,删除全部内容并重新写入aaaa提交

    1
    2
    3
    4
    5
    6
    # 切换到prod分支
    git checkout prod
    # 修改name.txt 写入aaaa 然后添加到缓存区
    git add name.txt
    # 提交name.txt
    git commit -m "add aaaa" name.txt
  • 切换回master分支修改name.txt,删除全部内容并重新写入bbbb提交

    1
    2
    3
    4
    5
    6
    # 切换到master分支
    git checkout master
    # 修改name.txt 写入bbbb 然后添加到缓存区
    git add name.txt
    # 提交name.txt
    git commit -m "add bbbb" name.txt

首先查看目前分支版本情况

1
2
# 查看分支版本情况
git branch -v

可以看到目前两个分支索引已经不再同一个位置了,下面开始合并prod分支内容到master

1
2
# 合并prod到master 合并到哪个分支就要先切换到哪个分支
git merge prod

从提示中我们可以看到,自动合并失败,需要我们手动去解决错误然后进行commit提交

打开文件后,我们可以看到出现了很多<<<<====>>>>符号

  • <<<<到====之间为master中的内容

  • <<<<到====之间为prod中的内容

我们需要做的就是,找到两个分支的开发人员进行确认分支之间的不同,并对文件进行修改,最后去掉所有的符号再次提交

如果这时候你使用以前的方式进行提交,会看到如下的报错,并且可以看到master后面的状态显示为MERGING显示,表示目前master分支依旧处于冲突状态

这里我们提交的时候不能在最后写上具体的某个文件名

1
2
# 提交冲突
git commit -m "fix merge"

这时我们已经看不到master|MERGING了,说明我们已经成功将prod合并到master

17、Git远程地址别名

我们的代码都是要提交到远程地址的,但是每次都要输入地址比较麻烦,这里我们可以给远程地址起一个别名方便日后使用

1
2
3
4
5
# 查看是否有别名
git remote -v

# 添加demo为别名 可以随便起 最后为你要提交的远程地址
git remote add demo https://github.com/tomatoLevi/demo.git

18、Git推送本地到远程

我们可以使用git push将本地仓库的代码推送到远程仓库中,这里可能会弹出账号密码输入框,按照你选择的代码托管平台进行输入即可

1
2
3
4
5
# 将本地master分支的代码推送到demo别名的地址
git push demo master

# 当然也可以直接写地址
git push https://github.com/tomatoLevi/demo.git master

然后我们打开github,可以看到文件已经推送过来了,并且自动创建了master分支

如果上文中我们使用prod分支的话,会怎么样呢?当然是在远端新创建一个prod分支啦~

1
2
# 将本地prod分支的代码推送到demo别名的地址
git push demo prod

19、Git克隆远程到本地

代码已经发布到远程仓库了,现在有一个新入职的开发人员需要拉取代码进行开发,这时候他就需要用到git clone命令从远程拉取代码到本地了

1
2
# 新建mygit文件夹用于存放远端拉取的代码
git clone https://github.com/tomatoLevi/demo.git

这时候我们可以看到,在mygit文件夹内,已经创建好了一个demo文件夹,并且其中包含了所有远程仓库中的文件信息以及一个隐藏的.git文件夹

可以看到clone克隆操作已经自动帮我们完成了三件事情

  • 执行git init初始化操作
  • 将远端代码完全复制到本地仓库中
  • 自动帮我们给地址起了一个origin别名

20、Git更新远程到本地

使用git pull进行拉取远端仓库代码到本地仓库的操作,等同于使用fetchmerge两个操作

1
2
# 更新别名为origin的远程master分支代码到本地
git pull origin master