• Git基操


    一、git简介

    1.1、git概述

    Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS) ,分为两种类型的仓库:本地仓库和远程仓库。 下载地址:https://git-scm.com/download

    • 本地仓库:是在开发人员自己电脑上的Git仓库

    • 远程仓库:是在远程服务器上的Git仓库

      图片2

    1.2、git工作流程

    1. 从远程仓库中克隆代码到本地仓库(git clone)
    2. 从本地仓库中checkout代码然后进行代码修改(checkout)
    3. 在提交前先将代码提交到暂存区(add)
    4. 提交到本地仓库。本地仓库中保存修改的各个历史版本(commit)
    5. 修改完成后,需要和团队成员共享代码时,将代码push到远程仓库(push)

    图片3

    1.3、Git常用的代码托管平台

    ​ 我们的远程仓库就建立在代码托管平台上,常见的有GitHub,GitLab,还有码云等

    • itHub( 地址:https://github.com/ )是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名gitHub
    • 码云(地址: https://gitee.com/ )是国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快
    • GitLab (地址: https://about.gitlab.com/ )是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务

    二、Git常用命令

    2.1、环境配置

    • 设置用户信息

      git config --global user.name "name" # 设置git用户名
      git config --global user.name "email"# 设置git邮箱
      
    • 查看用户的配置信息

      git config --list # 查看git的配置
      git config user.name # 查看git的用户名
      git config user.email #查看邮箱
      

      image-20200919105057953

      通过上面的命令设置的信息会保存在C盘用户目录下的.gitconfig文件中

      image-20200919093020372

    2.2、获取Git仓库

    要使用Git对我们的代码进行版本控制,首先需要获得Git仓库

    • 可以通过clone命令从远程仓库克隆一个到本地

      image-20200919093827404

    • 可以通过init命令在本地初始化一个Git仓库

      image-20200919093900566

    通过以上两种方式都可以在本地撞见一个仓库,它会生成一个.git的文件,有这个文件代表着是一个git本地仓库

    2.3、工作目录、暂存区和版本库

    • 前面看到的.git隐藏文件夹就是版本库,版本库中存储了很多配置信息、日志信息和文件版本信息等
    • 包含.git文件夹的目录就是工作目录,主要用于存放开发的代码
    • .git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫做stage。暂存区是一个临时保存修改文件的地方

    图片15

    Git工作目录下的文件存在两种状态:

    1. untracked未跟踪状态(未被纳入版本控制)
    2. tracked已跟踪(被纳入版本控制)
      • unmodified 未修改状态
      • modified 已修改状态
      • staged已暂存状态

    2.4、本地仓库操作

    1. git status 查看文件状态

    image-20200919094935812

    我们新建了一个.gitignore文件(可以在这个文件里面配置哪些文件不必纳入版本控制),此时查看文件状态发现.gitignore是未被跟踪状态,也可以使用git status -s 命令简介的显示文件状态

    image-20200919095210626

    ​ 2. git add 将文件添加到暂存区

    image-20200919095944281

    此时查看再次查看文件状态

    image-20200919100041939

    1. git reset 将暂存区的文件取消暂存

    我们添加到暂存取得文件并没有提交到本地的仓库,可以通过git reset命令取消暂存,再次查看文件,文件又处于未被跟踪状态.

    image-20200919100419666

    1. git commit 将暂存区文件提交到仓库

    image-20200919104227996

    参数-m的意思是记录提交的日志,想要commit必需要经过add

    1. git rm 删除文件

      image-20200919104143441

      此时显示.gitignore文件已经被删除,但是这只是删除了工作区的文件并没有删除本地仓库的文件。

      将删除操作提交到本地仓库

    image-20200919104406634

    注意:使用git rm 删除后默认进入暂存区可以直接commit,但是如果在windows中删除则需要add

    1. .gitignore忽略文件

      一般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在工作目录中创建一个名为 .gitignore 的文件

      image-20200919104836504

      7.git log 查看日志记录

      image-20200919104947551

    2.5、远程仓库操作

    1. git remote 查看远程仓库

      image-20200919105341768

      如果本地仓库是直接从远程仓库clone的,我们可以看到一个origin 。这是Git克隆的仓库服务器的默认名字。

      如果没有指定远程仓库,则啥也没有

      image-20200919105642320

    2. 添加和断开远程仓库

      git remote add 添加一个新的远程 Git 仓库,同时指定一个可以引用的简写

      image-20200919110239300

      如果想要断开与远程仓库的连接可以使用git remote remove [仓库(origin)]注意:此命令只是从本地移除远程仓库的记录,并不会真正影响到远程仓库image-20200919110432857

      image-20200919110542263

      远程仓库可以添加多个

      image-20200919110731993

    3. 从远程仓库克隆

      如果你想获得一份已经存在了的 Git 仓库的拷贝,这时就要用到 git clone 命令。 Git 克隆的是该 Git 仓库服务器上的几乎所有数据(包括日志信息、历史记录等),而不仅仅是复制工作所需要的文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。

      命令形式:git clone [url]

      image-20200919111619839

    4. 从远程仓库fetch

      git fetch 是从远程仓库获取最新版本到本地仓库,它会将数据放在git文件的object文件里面,我们找不到,它不会自动merge,fetch过后需要使用merge命令将本地仓库的数据和fetch来的数据合并。

      命令形式:git fetch[remote-name] [branch-name]

      ​ git merge[remote-name]/ [branch-name]

      image-20200919113844065

      注意:如果本地仓库不是从远程仓库克隆而来而是init初始化而来。则第一次合并或者提交的时候会出现fatal:refusing to merge unrelated histories,我们需要在命令后面加上--allow-unrelated-histories,表示允许不相关的历史

    5. 从远程仓库pull

      命令形式:git push [remote-name] [branch-name]

      image-20200919130555847

      如果第一次出现出现fatal:refusing to merge unrelated histories,也需要加上--allow-unrelated-histories

    6. 将本地仓库代码推送到远程仓库

      当你想分享你的代码时,可以将其推送到远程仓库。 命令形式:git push [remote-name] [branch-name]

    2.6、Git分支

    ​ 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。master分支是git仓库的默认分支。

    1. 查看分支

      列出所有本地分支:git branch

      列出所有远程的分支:git branch -r

      列出所有本地分支和远程分支:git branch -a

      image-20200919132645018

    2. 创建分支

      命令格式:git branch [branch_name]

      image-20200919133002897

    3. 切换分支

      使用git checkout [branch_name]可以切换分支,前面的*和绿色就表示当前分支

      image-20200919134215409

      在当前分支下创建一个文件master2.txt并push到远程仓库maste2分支,此时master分支没有master2.txt文件。

      当我们切换到master分支没有master2.txt文件

      image-20200919135958985

      当我们切换到master2分支,发现master2.txt文件

      image-20200919140131733

    4. git合并分支

      命令格式:git merge [branch_name]

      image-20200919143837145

      注意:如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没办法合并它们,同时会提示文件冲突。此时需要我们打开冲突的文件并修复冲突内容,最后执行git add命令来标识冲突已解决

    5. 删除分支

      git branch -d [branch_name]

      如果要删除的分支中进行了一些开发动作,此时执行上面的删除命令并不会删除分支,如果坚持要删除此分支,可以将命令中的-d参数改为-D

      git branch -D [branch_name]

      image-20200919144200156

      如果要删除远程仓库中的分支,可以使用命令git push origin –d [branch_name]

      image-20200919144418787

      image-20200919144406718

      此时远程仓库只剩下master分支,没有master2分支

    2.7、Git标签

    Git 可以给历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 、v1.2等)。标签指的是某个分支某个特定时间点的状态。通过标签,可以很方便的切换到标记时的状态。

    1. 创建标签

      git tag [tag_name]创建一个新的标签

      image-20200919150323085

    2. 列出标签

      git tag查看有哪些标签

      git show [tag_name] 查看标签的详细信息

      image-20200919150436211

    3. 将标签推送到仓库

      git push [remote] [brance] [tag_name]

      image-20200919150852772

      可以看到远程仓库多了一个v1.0标签

      image-20200919150900334

    4. 新建一个分支,指向某个标签

      命令格式:git checkout -b [branch] [tag]

      image-20200919151154501

    5. 删除标签

      git tag -d [tag_name] 删除本地标签

      git push [remote] [branch] :refs/taags/[tag_name] 删除远程标签

      image-20200919151515750

    三、Git时光机

    3.1、reset和checkout

    ​ 在工作中,一旦误删了文件或者是把文件弄乱了,我们可以从最近的一个commit版本恢复。git log命令 显示从最近到最远的提交日志,可以见看到我们各个版本的日志每个版本都有一个commit id,其HEAD表示当前版本,HEAD表示上一个版本,HEAD表示上上一个版本,往上100个版本可以写成HEAD加连续100个,也可以写成:HEAD~100。

    git log :显示从最近到最远的提交日志

    image-20200919165001383

    git log --pretty=oneline:将只会显示提交的commit id号和对应的注释。

    image-20200919165125494

    回退到上一个版本

    git reset --hard HEAD^

    image-20200919165413066

    已经成功回退到上一个版本,此时执行以此git log,已经没有第三个版本的信息

    image-20200919165510348

    此时我们如果想要恢复到第三个版本,我们需要使用 git reflog来查看过的你使用过的每一条命令

    image-20200919165727751

    执行命令 git reset --hard [commitId]

    image-20200919165912466

    image-20200919165935022

    已经回到第三个版本!

    git reset --soft [id] :最近一次提交节点的提交记录回退到暂存区。此时a.txt已经添加到暂存区但是未被提交

    image-20200919171710334

    git reset --mixed HEAD^ :将最近一次提交节点的提交记录回退到工作区

    image-20200919170844761

    如果想要将暂存区的内容回退到工作区直接使用git reset 命令。

    如果想要清除工作区某个文件的修改可以使用 git checkout -- [file_name]命令,git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

    3.2、revert

    git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。

    参考连接:https://blog.csdn.net/yxlshk/article/details/79944535

    参考连接:https://www.jianshu.com/p/09dbd8dc7345

  • 相关阅读:
    QLU Regular Contest 002 题解
    QLU_ACM 2021 专题训练(一)题解 [暴力、排序、贪心、二分]
    QLU ACM-ICPC 2020 Training Contest 11 @2016 ICPC Dalian [Cloned] 题解
    Codeforces Round #696 (Div. 2) AB题解
    Educational Codeforces Round 102 (Rated for Div. 2) ABCD题解
    20210114
    Codeforces Round #169 (Div. 2) CDE题解
    树剖注意要点
    bzoj3631树链剖分
    bzoj1103树状数组水题
  • 原文地址:https://www.cnblogs.com/myblogstart/p/13697389.html
Copyright © 2020-2023  润新知