Git 新手使用学习手册

发布时间 2023-04-09 10:54:30作者: 一抹彩宏

一、Git 概述

1.Git 介绍

git 是目前世界上最先进的分布式版本控制系统。通过对信息的压缩和摘要,所占空间小,能够支持项目版本迅速迭代的开发工具。

版本控制系统:是一种记录一个或者多个文件内容变化,便于查阅特定版本修订情况的系统。

例如,为论文准备文稿时,对文稿的多次删除或更改,造成有许多版本的文稿内容,在之后的修改过程中,因内容变动,需退回之前的文稿,就需要查阅之前的版本。

image

2.Git 安装

git 是一个类似于 Python 的开发工具,使用前需要下载安装,选择不同平台下载安装包,即可安装。

二、Git 分区

为理解 git 的基本工作方式,需要了解三大分区、文件三大状态,分区转换指令,以及分区内容对比指令。

1.三大分区和三大状态

(1)存储三大分区

  • 工作区(Working Directory)

    用于直接编辑文件的区域,对于新增的文件,如果没有 add 到暂存区,就会以红色形式放置在工作区。

  • 暂存器(Stage, index)

    数据暂时存放的区域,使用 add 指令版本控制的文件,也就是进入暂存区了。以计算机工作方式理解为,数据存入内存条,还未存入硬盘中。由于还未存入本地仓库,也就是数据暂存的区域。

    注:信息存放于 .git 目录下的 index 文件中(.git/index)。

  • 版本库,又称本地仓库(commit History)

    在暂存区的文件执行 commit 指令会将文件放入版本库中。可以理解为版本存入到本地计算机,若执行 push 指令,会将本地仓库内文件发送至远程仓库,可类比云存储过程。

    注:版本信息存放于工作区中 .git 目录下。

(2)文件三大状态

  • 已修改(modified)

    已修改表示修改了文件,但还没保存到暂存区中。文件为

  • 已暂存(staged)

    已暂存表示对一个已修改文件的当前版本做了标记,使之在下次提交的快照中,被保存于暂存区中。

  • 已提交(committed)

    已提交表示数据已经安全的保存在本地数据库中。

2.分区转换指令

  • git add

    数据从工作区转移至暂存区

  • git commit

    数据从暂存区存入版本库,即存入本地仓库

  • git push

    数据从版本库中发送到远程仓库

  • git pull

    数据从远程仓库取回到本地仓库

注:远程仓库操作,需要创建 GitHub 账号,并建立远程仓库,将本地仓库与远程仓库连接后进行操作。

image

2.分区对比指令

当文件版本过多,其中文件可能因为修改,造成文件的差异,使用分区对比指令,对文件差异进行对比,便于在工作区进行修改再次上传。

  • git diff

    工作区与暂存区对比

  • git diff head

    工作区与版本库对比

  • git diff --cached

    暂存区与版本库对比
    image

三、Git 配置

使用 git 更新到远程仓库时,需要以下准备,用户配置和查看和远程仓库配置。

1.用户配置

在第一次使用 git 时,需要进行用户的配置,也就是提供用户名称和用户邮箱,用于在多人协作的场景下,能找到更改部分的作者以及联系方式。

  • 相关命令

    //设置全局用户信息
    git config --global user.name [用户名]
    git config --global user.email [邮箱]
    
    //查看用户名称
    git config user.name
    //查看用户邮箱
    git config user.email
    
    //检查所有配置信息
    git config --list
    

2.远程仓库配置

(1)生成 SSH key

创建一个 Github 账号后,就可以自由的 clone 或者直接下载 .zip 文件,也可以创建新的项目,但是不能没法提交代码。

在提交代码之前,Github 需要 SSH 的授权,Linus 与 Mac 默认安装了 SSH,而 Windows 系统安装 git bash 也应该安装了 SSH。可以在终端下(win 下在 git bash 里)输入 ssh 命令检测。

image

接下来输入 ssh-keygen -t rsa 命令,就是指定 rsa 算法生成密钥,接下来三个回车(不需要输入密码),然后就会生成两个文件 id_rsa 和 id_rsa.pub,而 id_rsa 是密钥,id_rsa.pub 就是公钥。

这两个文件默认分别在以下目录中生成:

Linus/Mac 系统在 ~/.ssh 下,Windows 系统在 /c/Documents and Settings/username/.ssh 下,两个文件为隐藏文件。

之后需要将 id_rsa.pub 的内容添加到 Github 上,本地的 id_rsa 密钥和 Github 上的 id_rsa.pub 公钥进行配对,授权成功才可提交代码。

(2)GitHub 上添加 SSH key

在 GitHub 上的设置页面,点击最左侧 SSH and GPG keys,选择 New SSH key 按钮,将 id_rsa.pub 公钥文件粘贴到 Key 栏中,Tittle 栏无需填写,保存结束。

image

SSH key 添加成功后,输入 ssh -T git@github.com 进行测试,如果出现以下提示证明添加成功。

image

四、Git 本地操作

git 在实际使用过程中的常见操作和常见问题,创建本地仓库、版本回退、撤销修改和删除文件。

1.创建本地仓库

在使用 git 服务之前,需要将文件夹设置为 git 文件夹,否则无法进行 git 控制,创建成功后,在目录下将出现隐藏文件夹 .git,用于跟踪管理版本信息。

  • 当未进行项目初始化之前,无法进行 git 操作,打开 git bash 使用 git status 查看文件状态,会出现以下提示
    image

  • 在项目目录下,单击右键打开 git bash 进行操作
    image

  • 使用指令 git init 对文件夹进行初始化,此时在文件夹中出现隐藏文件 .git
    image

  • 此时再使用 git status 查看文件状态,会提示项目在当前分支下,无提交版本!
    image

  • 使用 git add <文件名>git add . ,提交全部文件】将单独文件从工作区转换至暂存区,再使用 git status 查看文件状态,目前在本地仓库依旧无版本,但在暂存区出现文件名

    git status:最常用的命令之一,用于查看工作区和暂存区的状态,也可使用于查看是否还有文件未提交。

    若所有文件都已经从工作区、暂存区提交,则显示在当前分支上,没有被跟踪的文件。

image

  • 接下来,将暂存区的文件提交至本地仓库,使用 git commit -m "备注信息" git commit -a -m "备注信息",-a 表示无需执行 git add 命令,直接提交】,此时使用 git log 查看已经提交版本以及相关信息

    git commit -m "备注信息":其中的 -m 用于备注当前版本的相关信息,若没有 -m,Git 会尝试打开编辑器以填写信息。

image

  • 若此时修改文本内容,再输入 git status 查看文件状态,提示文件存在未被提交的修改,使用 git diff 查看工作区与暂存区文件差异,可以看到增加了内容 2.0
    image

  • 使用 git add a.txt 提交现版本文件到暂存区,再次修改工作区,此时工作区、暂存区和本地仓库文件应不相同,依次使用 git diff 对比工作区和暂存区文件异同,git diff --cached 对比暂存区和本地仓库,git diff head 对比工作区和本地仓库
    image

  • 将后两个版本都提交到本地仓库,使用 git commit -m “+2.0“ 将暂存区文件提交至本地仓库,使用 git commit -a -m "+3.0" 从工作区直接提交至本地仓库
    image

2.版本回退

(1)以版本号实现

以上操作创建了多个版本的文件到本地仓库后,在实际操作中,可能会出现需要推到某个版本中,将文件从本地仓库将退回暂存区,以及从最新版本退回后,git log 无法查看最新版本,使用 git reflog 查看日志查看版本号退回。

image

  • 现在使用 git log 查看已经提交的版本,其中出现 (HEAD -> master) 表示当前分支下,所指向的版本,退回版本需要使用到 HEAD 进行操作
    image

  • 从本地仓库退回暂存区,HEAD 指向当前所在的前一个版本,此时 git log 无法查看到之前指向最新的版本

    • 第一种方法,使用 git reset --hard HEAD^ (退回上一个版本),git reset --hard HEAD^^ (退回上上个版本),以此类推
    • 第二种方法,使用 git reset --hard HEAD~100 (退回前 100 个版本)
      image
  • 若此时需要退回最新版本,使用 git reflog 查看操作日志,找到最新版本的版本号,使用 git reset --hard <版本号> 退回最新版本,使用 cat <文件> 查看文件中内容

    cat <文件>:用于查看工作区的内容,对比可知工作区和本地仓库版本。

image

(2)以标签实现

在实际使用中,针对本地仓库中不同版本的提交 commit 做标签,类似于起别名,常见的标签形式有:v1.0、v2.0,诸如此类。

git 中提供一个 tag 命令,用于对某一次的提交 commit 做标签,相当于给版本号做了标记,此时,除了通过 git log 查看版本命令;git reflog 查看日志命令,找到版本号;还可以通过查看标签,找到版本号信息。

  • 常用命令:

    /*创建标签*/
    //给当前指向 commit 本地仓库版本设置标签
    git tag <标签名>
    //给指定提交版本创建标签
    git tag <标签名> <提交版本号>
    
    
    /*查看标签*/
    //直接列出所有标签
    git tag
    //根据其中包含信息,对标签筛选,如选择带有 v4.0 信息的标签
    git tag -l "信息*"
    //查看标签的信息
    git show <标签名>
    
    
    //删除标签,指定删除标签名称
    git tag -d <标签名>
    

3.撤销修改

撤销修改操作,针对于工作区与暂存区,将暂存区的文件撤销,在提交之前,发现文本有误需要修改,则暂存区撤销修改退回前一次添加。

image

  • 先输入 git status 查看当前文件状态,显示文件均已提交,再在工作区修改文本内容,输入 git add a.txt 将工作区文件转换到暂存区
    image

  • 先使用 cat <文件> 查看工作区内容,再次输入 git status 查看文件状态,为撤销修改内容,有两种情况

    • 第一种情况,输入 git restore --staged <文件> 将暂存区文件撤销,退回到上一次修改状态,对工作区文件内容无修改
      image

    • 第二种情况,输入 git restore <文件> 暂存区文件不进行撤销修改,工作区在暂存后修改的内容进行撤销,若工作区文件无修改则无变化

      以下为文件转换暂存区,暂存区内容到”4.0“,工作区增加”5.0“内容
      image

4.删除文件

当文件中有文件需要删除,有多种删除命令,完成不同的功能。

  • rm 命令

    作用:删除工作区文件,等同于直接在文件中删除文件。

    执行删除命令:

    $ rm test.txt
    

    查看状态(成功删除工作区文件):

    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add/rm <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            deleted:    test.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    

    rm 命令只是删除了工作区的文件,并没有删除版本库的文件,想要删除版本库文件还需执行以下命令:

    $ git add test.txt
    $ git commit -m "delete test"
    

    此时,更新了暂存区和本地仓库的文件,彻底删除。

  • git rm 命令

    作用:删除工作区文件,并且将这次删除放入暂存区

    注意:要删除的文件是没有修改过的,也就是与当前本地仓库的内容相同。

    执行删除命令:

    $ git rm test.txt
    rm 'rest.txt'
    

    查看状态(成功删除了工作区文件,并将这次删除放入了暂存区):

    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            deleted:    test.txt
    

    提交版本(成功删除了版本库文件):

    $ git commit -m "delete test"
    [master f05b05b] delete test
     1 file changed, 3 deletions(-)
     delete mode 100644 test.txt
    

    删除了工作区和版本库的文件,因暂存区不可能有该文件(如果有意味着该文件修改后 git add 到暂存区,那样 git rm 命令会报错,如下情况)

  • git rm -f 命令

    作用:删除工作区和暂存区文件,并且将这次删除放入暂存区

    注意:要删除的文件已经修改过,也就是与当前本地仓库的内容不同

    • test 文件修改过还没 git add 到暂存区

      $ git rm test.txt
      error: the following file has local modifications:
          test.txt
      (use --cached to keep the file, or -f to force removal)
      
    • test 文件修改过已经 git add 到暂存区

      $ git add test.txt
      $ git rm test.txt
      error: the following file has changes staged in the index:
          test.txt
      (use --cached to keep the file, or -f to force removal)
      

    可见文件修改后,无论是否 git add 到暂存区,使用 git rm 命令删除就会报错。

    解决方法:

    执行删除命令:

    $ git rm -f test.txt
    rm 'test.txt'
    

    查看状态(成功删除工作区和暂存区文件,并且将这次删除放入暂存区):

    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            deleted:    test.txt
    

    提交版本(成功删除了本地仓库文件):

    $ git commit -m "delete test"
    [master 9d5d2d2] delete test
     1 file changed, 3 deletions(-)
     delete mode 100644 test.txt
    

    删除了工作区、暂存区和本地仓库的文件。

  • git rm --cached 命令

    作用:删除暂存区文件,但保留工作区文件,并且将这次删除放入暂存区。

    执行删除命令:

    $ git rm --cached test.txt
    rm 'test.txt'
    

    查看状态(成功删除暂存区文件,保留工作区文件,并且将这次删除放入暂存区,注意这里文件取消了跟踪):

    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            deleted:    test.txt
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
            test.txt
    

    提交版本(成功删除了本地仓库文件):

    $ git commit -m "delete test"
    [master 223d609] delete test
     1 file changed, 3 deletions(-)
     delete mode 100644 test.txt
    

    删除了暂存区和本地仓库的文件,但保留了工作区的文件。

    如果文件有修改并 git add 到暂存区,再执行 git rm --cachedgit commit ,那么保留的工作区文件是修改后的文件,同时暂存区的修改文件和本地仓库的文件也被删了。

五、Git 远程操作

将本地仓库中的文件发送到远程仓库中,首先需要创建一个远程仓库,且连接本地仓库和远程仓库,最后提交版本。

1.创建远程仓库

  • 创建 Github 账号后,在主页位置选择“+”,点击新建仓库,跳转到创建仓库界面。
    image

  • 在创建仓库界面,输入仓库名称和描述,一般选择添加 README 文件,点击创建,完成了远程仓库的创建。
    image

2.连接远程仓库

  • 首先需要获取远程仓库地址,打开远程仓库,点击代码按钮,可以选择弹出的 HTTP 或 SSH 两种协议,任选其中之一的地址复制。
    image

  • 之后需要将地址告知本地仓库,在本地仓库中,打开 git bash 配置远程仓库信息,使用以下命令:

    //添加远程版本仓库
    git remote add <仓库地址重命名> <远程仓库 HTTP 或 SSH 地址>
    /*相关命令*/
    git remote -v						//显示所有远程仓库
    git remote rm name					//删除远程仓库
    git remote rename <旧命名> <新命名>	//修改仓库名
    
    
    /*以下为示例*/
    //将地址重命名为 neiwang
    git remote add neiwang http://192.168.1.100/zhangsan/sixsixsix.git
    
    //将地址重命名为 origin
    git remote add origin http://192.168.1.100/zhangsan/sixsixsix.git
    
    
  • 接下来,只需要在本地仓库进行提交即可,通过以下命令完成:

    • 第一种,通过分支名提交到远程仓库

      //将指定分支上传到远程仓库
      git push <仓库地址命名> <分支名>
      
      //示例
      git push origin master
      
      
    • 第二种,通过标签名提交到远程仓库

      //将指定标签上传到远程仓库
      git push <仓库地址命名> <标签名称>
      
      //将所有不在远程仓库中的标签上传到远程仓库
      git push <仓库地址命名> --tags
      
      //删除远程仓库的指定标签
      git push <仓库地址命名> :<标签名称>
      git push <仓库地址命名> --delete <标签名称>
      
      

3.远程仓库下载

从远程仓库获取版本方式有两种:

  • 第一种,使用命令,从远程地址获取代码并合并到本地的版本

    //从远程仓库地址获取所需分支,并选择与本地分支合并
    git pull <远程主机名> <远程分支名>:<本地分支名>
    
    //当远程分支是与当前分支合并,则冒号后部分可省略
    git pull <远程主机名> <远程分支名>
    
    /*示例*/
    //拉取远程主机 origin 的 master 分支,与本地的 brantest 分支合并
    git pull origin master:brantest
    
    //远程分支与当前分支合并
    git pull origin master
    
    
  • 第二种,复制远程仓库的地址后,通过命令,将远程仓库的代码下载到本地,此时下载的版本等同于下载新的文件,需要手动调取文件,不自动进行合并,重名不可下载

    //从远程地址克隆一个本地库
    git clone <远程仓库地址 HTTP 或 SSH>
    
    //克隆一个项目
    git clone http://192.168.1.100/zhangsan/sixsixsix.git
    
    

六、分支创建与合并

git 可进行开发主线的分离操作,在不影响主线开发的同时继续工作。

对于个人开发者,则可分为稳定版主线,以及修改版分支,当修改完成后,再进行分支合并操作。

image

1.创建、切换与删除分支

  • 相关命令:

    //查看分支
    git branch
    
    //创建新分支
    git banch <分支名>
    //以标签为基础,创建分支
    git checkout -b <分支名称> <标签名称>
    
    //切换分支命令
    git checkout <分支名>
    
    //删除分支
    git branch -d <分支名>
    
    

2.分支合并与冲突

(1)分支合并

当分支内容,最终会需要合并回主线上,且常常合并完分支后,就会删除分支。

  • 使用以下命令进行分支合并操作:

    //首先切换至主线上,再将所选分支合并到当前分支中
    git merge <分支名>
    
    

(2)分支冲突

合并并不是简单的文件添加、移除的操作,当两个或多个分支,修改同一个位置,但所修改结果不同,git 就会提示报错。

解决方法是,在 git 中对比文件内容差异,选取其中一种或都不选,然后在工作区中总体修改这部分内容,将内容修改一致后,再使用 git add 告知 Git 文件冲突已解决,解决后就可提交结果。