Git的安装与使用

Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

官方教程 : https://git-scm.com/book/zh/v2

Git 基本工作流程

主要涉及到四个关键点:

  1. 工作区:本地电脑存放项目文件的地方,比如learnGitProject文件夹;

  2. 暂存区(Index/Stage):在使用git管理项目文件的时候,其本地的项目文件会多出一个.git的文件夹,将这个.git文件夹称之为版本库。其中.git文件夹中包含了两个部分,一个是暂存区(Index或者Stage),顾名思义就是暂时存放文件的地方,通常使用add命令将工作区的文件添加到暂存区里;

  3. 本地仓库:.git文件夹里还包括git自动创建的master分支,并且将HEAD指针指向master分支。使用commit命令可以将暂存区中的文件添加到本地仓库中;

  4. 远程仓库:不是在本地仓库中,项目代码在远程git服务器上,比如项目放在github上,就是一个远程仓库,通常使用clone命令将远程仓库拷贝到本地仓库中,开发后推送到远程仓库中即可;

    工作目录暂存区git 仓库远程仓库
    被Git管理的项目临时存放被修改的文件目录用于存放提交记录远程代码仓库
    git initgit addgit commitgit push

Git命令

配置用户信息

第一次使用git需要配置用户信息

  • 配置用户名:

    1
    git config --global user.name "你的用户名"
  • 配置用户邮箱:

    1
    git config --global user.email "你的邮箱"
  • 查询配置信息:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    列出当前配置:
    git config --list;

    列出repository配置:
    git config --local --list;

    列出全局配置:
    git config --global --list;

    列出系统配置:
    git config --system --list;

基本命令

git clone

克隆仓库:使用 git clone远程仓库 中拷贝项目

1
2
3
4
5
6
7
8
9
git clone [仓库地址] [本地目录]

ps:
[本地目录] : 可加参数、默认在当前目录下克隆。

例子:
git clone git@github.com:spring-projects/spring-boot.git

git clone git@github.com:spring-projects/spring-boot.git spring //在当前目录下的spring目录下克隆

git init

初始化仓库:在执行 git init 命令后,会在当前目录下生成一个 .git 目录(需要显示隐藏目录)

1
2
3
4
git init [目录名]

ps:
[目录名] : 可加参数、在[目录名]下生成 .git 目录。

git status

查询当前工作区所有文件的状态

1
2
3
4
git status 

ps:
-s :以获得简短的结果输出;

git diff

显示工作区,暂存区,版本区之间的差别

1
2
3
4
git diff : 尚未缓存的改动
git diff --cached : 查看已缓存的改动:
git diff HEAD : 查看已缓存的与未缓存的所有改动
git diff --stat : 显示摘要而非整个 diff

git add

提交文件到暂存区

1
2
3
4
5
6
7
git add [文件名/文件列表] 

ps:
git add . : 提交工作区所有文件到暂存区;
git add 文件名 : 提交工作区中指定文件到暂存区;
git add 文件1 文件2 文件3 ... : 提交工作区中指定的多个文件到暂存区;
git add [dir] : 提交工作区中某个文件夹中所有文件到暂存区;

git commit

将暂存区里的改动提交到本地的版本库

1
git commit -m [提交信息] 
  1. 将暂存区中的文件提交到本地仓库中,即打上新版本:git commit -m “提交信息”;
  2. 将所有已经使用git管理过的文件暂存后一并提交,跳过add到暂存区的过程:git commit -a -m “提交信息”;
  3. 提交文件时,发现漏掉几个文件,或者注释写错了,可以撤销上一次提交:git commit –amend;

git log

查看提交记录

1
2
3
4
5
6
7
git log 

git log --pretty=oneline

ps:
-p : 展开每次提交的内容差异,用-2显示最近的两次更新、如git log -p -2;
--pretty=oneline : 查看一行

git checkout

切换分支或恢复工作树文件

1
2
3
4
git checkout [分支名]  切换到指定分区

git checkout -- filename
用暂存区中filename文件来覆盖工作区中的filename文件。相当于取消自上次执行git add filename以来(如果执行过)的本地修改。

git reset

版本回退

1
2
3
4
5
git reset --hard [提交编号]

ps:
[提交编号] : 通过git log可以查看,至少写七位编号
回退之后查看不了历史版本可以通过git reflog查看

git pull

拉取远程仓库代码

1
git pull git@github.com:用户名/仓库名.git

git push

提交本地仓库到远程仓库

1
git push

git mv

用于移动或重命名一个文件、目录、软连接。

1
git mv [文件名]  [新文件名]

分支管理

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。

git branch

查看分支

1
git branch 

git branch 分支名称

创建分支

1
git branch 分支名称 

git checkout

切换指定分支

1
git checkout 分支名称 

git merge

将当前分支与指定分支进行合并

1
git merge 分支名 

git branch -d

删除分支(分支合并后才允许被删除)

1
2
3
4
git branch -d 分支名称

ps:
-D : 大写强制删除

总结

  1. 创建分支:git branch ,如git branch testing
  2. 从当前所处的分支切换到其他分支:git checkout ,如git checkout testing
  3. 新建并切换到新建分支上:git checkout -b ;
  4. 删除分支:git branch -d
  5. 将当前分支与指定分支进行合并:git merge ;
  6. 显示本地仓库的所有分支:git branch;
  7. 查看各个分支最后一个提交对象的信息:git branch -v;
  8. 查看哪些分支已经合并到当前分支:git branch --merged;
  9. 查看当前哪些分支还没有合并到当前分支:git branch --no-merged;
  10. 把远程分支合并到当前分支:git merge /,如git merge origin/serverfix;如果是单线的历史分支不存在任何需要解决的分歧,只是简单的将HEAD指针前移,所以这种合并过程可以称为快进(Fast forward),而如果是历史分支是分叉的,会以当前分叉的两个分支作为两个祖先,创建新的提交对象;如果在合并分支时,遇到合并冲突需要人工解决后,再才能提交;
  11. 在远程分支的基础上创建新的本地分支:git checkout -b /,如git checkout -b serverfix origin/serverfix;
  12. 从远程分支checkout出来的本地分支,称之为跟踪分支。在跟踪分支上向远程分支上推送内容:git push。该命令会自动判断应该向远程仓库中的哪个分支推送数据;在跟踪分支上合并远程分支:git pull
  13. 将一个分支里提交的改变移到基底分支上重放一遍:git rebase,如git rebase master server,将特性分支server提交的改变在基底分支master上重演一遍;使用rebase操作最大的好处是像在单个分支上操作的,提交的修改历史也是一根线;如果想把基于一个特性分支上的另一个特性分支变基到其他分支上,可以使用--onto操作:git rebase --onto ,如git rebase --onto master server client;使用rebase操作应该遵循的原则是:一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行rebase操作

Git标签

Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。

git tag

列出现在所有的标签

1
git tag

其他

  1. 使用特定的搜索模式列出符合条件的标签,例如只对1.4.2系列的版本感兴趣:git tag -l "v1.4.2.*";
  2. 创建一个含附注类型的标签,需要加-a参数,如git tag -a v1.4 -m "my version 1.4";
  3. 使用git show命令查看相应标签的版本信息,并连同显示打标签时的提交对象:git show v1.4;
  4. 如果有自己的私钥,可以使用GPG来签署标签,只需要在命令中使用-s参数:git tag -s v1.5 -m "my signed 1.5 tag";
  5. 验证已签署的标签:git tag -v ,如git tag -v v1.5;
  6. 创建一个轻量级标签的话,就直接使用git tag命令即可,连-a,-s以及-m选项都不需要,直接给出标签名字即可,如git tag v1.5;
  7. 将标签推送到远程仓库中:git push origin ,如git push origin v1.5
  8. 将本地所有的标签全部推送到远程仓库中:git push origin --tags;

Github远程仓库的使用

基于HTTPS协议

  • 通过 git clone https://github.com/Github用户名/仓库名.git

  • 修改 .git 下的 config 的内容

    1
    2
    3
    4
    5
    6
    7
    [remote "origin"]
    url = https://github.com/Github用户名/仓库名.git

    修改为

    [remote "origin"]
    url = https://用户名:密码@github.com/Github用户名/仓库名.git
  • git remote add origin https://github.com/Github用户名/仓库名.git 要上传的远程仓库

  • git push 将本地仓库提交到远程仓库

基于SSH协议

  • 生成公私钥

    1
    ssh-keygen -t rsa -C "example@example.com"

    然后找到生成的秘钥:位置在 C:/Users/你电脑的用户名/.ssh
    用记事本打开id_rsa.pub复制里面的内容

    进入 https://github.com/settings/keys 点击New SSH Key把之前复制的内容粘贴到这里就可以了。

  • git remote add origin git@github.com:用户名/仓库名.git 要上传的远程仓库

  • git push 将本地仓库提交到远程仓库

解决冲突

多人开发同一个项目时,如果两个人修改了同一个文件同一个地方

解决方法:

  1. 手动解决冲突
  2. 写代码之前要先git pull 拉去最新代码

忽略文件

在git根目录下创建.gitignore

1
2
3
4
5
6
7
8
9
10
11
12
13
# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录下所有扩展名为 txt 的文件
doc/**/*.txt

同时提交多个仓库

第一种方式

  1. 在本地项目文件夹执行 git init 之后

    先添加第一个仓库

    1
    git remote add origin https://gitee.com/zykj/test.git

    再添加第二个仓库

    1
    git remote set-url --add origin https://github.com/zykj/test.git

    如果还有其他,则可以像添加第二个一样继续添加其他仓库。

  2. 然后使用下面命令提交:

    1
    git push origin --all

    打开.git/config,可以看到这样的配置:

    1
    2
    3
    4
    [remote "origin"]
    url = https://gitee.com/zykj/test.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = https://github.com/zykj/test.git

    刚才的命令其实就是添加了这些配置。如果不想用命令行,可以直接编辑该文件,添加对应的url即可。

第二种方式

  1. 在本地项目文件夹执行 git init 之后

    先添加第一个仓库

    1
    git remote add gitee https://gitee.com/zykj/test.git

    再添加第二个仓库

    1
    git remote add github https://github.com/zykj/test.git

    如果还有其他,则可以像添加第二个一样继续添加其他仓库。

    在这里为了方便区分,我把github仓库地址代号(上面代码add后面的单词)命名为github,码云仓库地址代号命名为gitee

  2. git bash中输入git remote -v可以查看本地仓库现在连接了那个远程仓库。

  3. 使用git push仓库代号 分支提交代码到远程仓库

    刚才我链接的两个远程仓库,推得时候就要这样写了:

    1
    2
    git push github master
    git push gitee master

    打开.git/config,此时配置文件如下所示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [remote "github"]
    url = git@github.com:zykj/test.git
    fetch = +refs/heads/*:refs/remotes/github/*
    [remote "gitee"]
    url = git@gitee.com:zykj/test.git
    fetch = +refs/heads/*:refs/remotes/gitee/*
    [branch "master"]
    remote = gitee
    remote = github
    merge = refs/heads/master

    和第一种方法一样,如果不想用命令行,可以直接编辑该文件,添加对应的remoteurl即可。

参考链接: