• git使用详解


    目录

    一,什么是git?

    二,如何安装git

    三,git的基本操作

    1.创建git本地仓库

    2.配置本地仓库

    3.认识工作区,暂存区,版本库。

    4.基本操作-添加文件

    5.基本操作-查看文件

    6.基本操作-修改文件

    7.版本回退 

    8.撤销修改

    四.分支管理

    1.创建分支 

    2.删除分支

    3.合并冲突

    4.分支管理策略

    5.bug分支

    6.强制删除分支

    五,远程操作

    1.创建远程仓库

    2.克隆远程仓库

    3.向远端仓库推送

    4.拉取远端仓库

    5.忽略特殊文件

    6.配置命令别名

    六,标签管理

    1.操作标签

    2.推送标签


    一,什么是git?

            Git是一种开源的分布式版本控制系统,用于跟踪计算机文件的更改,通常用于协调编写软件源代码的程序员之间的工作。

    Git与其他版本控制系统(如CVS、Subversion或Perforce)的主要区别在于它对数据的处理方式。Git将其数据视为一个迷你文件系统的快照序列。

    每次提交或保存项目状态时,Git会拍摄所有文件在该时刻的样子,并存储对该快照的引用。为了提高效率,如果文件没有更改,Git不会再次存储该文件,而只会存储到先前已经存储过的相同文件的链接。这使得Git更像是一个带有一些非常强大工具的迷你文件系统,而不仅仅是一个版本控制系统。

           通过git我们可以对本地项目中的任何格式的文件进行快速有效的版本管理:git会每次记录修改以及版本迭代的文件,其次也可以控制电脑上各种格式的文件,那么对于开发者来说它可以很好地帮我们管理所写的各种源代码文件。

    二,如何安装git

    对于Linux操作系统上,以centos7版本为例,首先我们可以通过指令:

    来查看我们的是否装有(我这里已经装过了),没装过就会说找不到该指令。

    git::command not found

    安装也很简单通过指令即可下载安装:

    sudo yum install git -y
    

    ubuntu环境下下载git:

    sudo apt-get install git -y

    windows下

    三,git的基本操作

    1.创建git本地仓库

    文件只有在git仓库中才能被追踪管理,我们自己电脑上或其他服务器的文件是无法通过git管理的,故我们需要创建git仓库来管理我们需要管理和维护的文件。

    1. $ mkdir githouse
    2. //首先创建一个文件夹,用来存放我们需要管理的文件
    3. $ cd githouse
    4. [githouse]$ ls
    5. //利用指令git init 来初始化仓库
    6. [githouse]$ git init
    7. //提示我们已经初始化好了一个空仓库
    8. Initialized empty Git repository in /home/danchengwei/githouse/.git/

    可以看到这里会生成一个.git的隐藏目录,这里的文件就是用来修改追踪的,里面的内容最好不要删改。

    2.配置本地仓库

    主要配置两个东西--用户的name以及用户的email地址,这两个是必须配置的,否子之后向远程仓库提交时汇报错误的。

    配置name,通过指令git config就可以配置所需要配置的,用户名+user.name "你想要的命名"。

    git config user.name "名字"

    配置email是相似的指令:

    git config user.email "你的邮箱"

    之后查看是否配置好,列出所有的配置选项

    git config -l

    如果配置出现错误,我们也可以删除,重新配置

    1. git config --unset user.name
    2. git config --unset user.email

    当然上述的配置指令只针对当前的仓库,我们也可以通过添加--global使得之后创建的仓库都是这样的配置,若想重置删除,删除时也应加上--global。

    git config --global user.name  "你的名字" 

    3.认识工作区,暂存区,版本库。

       我们想要git来管理我们,可以创建一个文件ReadMe,让git管理该文件,但实际上git现在是无法管理该目录中的文件,而是要.git内才行,而.git我们是不能修改的,那该如何管理?

    首先我们所说的.git文件就是这里的版本库,我们不能去修改它,其次该目录下叫做工作区,比如这里的ReadMe文件,就是在工作区中,.git是不属于工作区的,而我们可以通过指令将我们管理的文件添加到git的暂存区中,再将暂存区的内容提交到master的分支下,之后才可以管理(如上图),其次修改的工作区内容会写入对象库中的一个新的对象中,从而维护文件的版本

    4.基本操作-添加文件

    通过上述认识了三个区,我们基本了解如何时git去管理文件首先 add到暂存区,在commit递交到master分支下 .

    1.将我们对文件的修改所有添加到暂存区

    1. //创建文件
    2. git add 文件名
    3. git add . //只有一个文件时,也就代表添加这一个文件

    2.递交到master

    git commit -m "本次修改的日志"

    这里的日志我们最好不要乱写,对于代码而言,就写对代码的哪里修改,或者实现了什么功能,即文档的主题即可。

    通过学习了三个工作区,我们可以明白,add指令就是将文件及其修改添加到暂存区,而commit就是将暂存区里的文件再次递交到master中,master中有.git的各个对象(commit ID)来对应各个文件,从而实现记录文件。

    3.git log

    git log --pretty=oneline

     打印一行漂亮的可观的记录。

    git log

    打印我们所有提交记录包含日志,还有commit ID。

    5.基本操作-查看文件

    tree一下.git隐藏文件,可以发现和之前最开始得.git文件不一样,新增了一个index的暂存区,cat查看master,其中object里面也放的是一些索引,这与master中的字符串不谋而合。

     细心发现这与我们第一次运行git log查看的的commit ID一样。

    对于这个ID:

     该文件内容我们可以理解为.git的一个个对象,查看git这些内容利用cat是无法查看的,我们这样查看:

    git cat-file -p  commitTD

    例如:

     我们可以看到name与email,其中还有ID,再次打开看,我们会看到所创建的ReadMe底下的所有文件都有一个ID与之对应-我们也可以在object找到这些。

     故此通过这样的方式,每一次修改都会有一个对象对应该文件,从而实现记录文件。

    6.基本操作-修改文件

    在这里强调一下,git追踪管理的并不是我们的一个整个文件,而是我们对它的修改。

    这里我们修改一个工作区中的文件ReadMe,然后查看他的状态:

    git status//查看当前仓库的状态

    可以看到它提示我们暂存区无修改,工作区ReadMe修改了。

    我们还可以查看工作区与暂存区的差异

    git diff 文件名//查看暂存区与工作区的差异

    -代表改动前,+代表改动后。

    7.版本回退 

    我们知道git可以管理文件的版本,这也是版本控制器的重要能力,那么在git中如何进行版本回退呢?

    1. git reset 【-soft -mixed -hard】 commitID//版本回退
    2. --soft 回退版本库
    3. --mixed 回退暂存区与版本库
    4. --hard 回退暂存区,工作区与版本库

    所谓版本库本质上是将版本库中的内容回退。所以对于-hard选项操作是要非常慎重的,一旦都回退了,就会消失。

    如果我们回退了之后后悔了,当前终端还在,那么我们还是可以继续回退到之前的版本,还是一次回退指令git reset --hard commitID.

    其次可以利用指令git reflog 查看每一次的提交,通过这种方式我们可以对想回退的commitID再次进行回退。

    8.撤销修改

    所谓撤销修改这里是指的是在还未add添加到暂存区时,想对编写的代码或者文件进行撤销操作,也就是写了很长时间后想回退到之前写的,如何操作?

    情况一:

    在工作区中回退到最近一次add指令或者commit指令时的内容

    git checkout -- 文件名

    情况二:

    当然对于回退版本库里的当前内容利用指令git reset --mixed/hard也是可以的。

    git reset --hard/--mixed

    情况三:

    首先,以上撤销指令都是在版本库对远程仓库的推送前,也就是commit后,但不push,撤销是成功的,是不影响远程仓库的。当需要回退三个区的内容时

    git reset --hard

    9.删除文件

    如何删除版本库中的文件呢?

    rm filename

    利用rm指令是只能删除工作区中的文件的,对于已经提交到本地仓库,暂存区中的:

    1. //将修改之后变动提交到暂存区中,在提交一次,就可以实现对暂存区版本库中的修改
    2. //如删除file5
    3. rm file5
    4. git add file5
    5. git commit -m "删除file5"

    这里的操作可以通过git rm(删除暂存区与操作区)指令缩减为两步:

    1. git rm file5
    2. git commit -m "删除file5"

    四.分支管理

    我们知道,对于文件的每一次提交的时间线都会被记录在.git下的master之中,master就是主分支,通过一个指针我们找到master,根据maser我们可以找到最近一次提交,然后就可以找到上一次,上上一次的提交。

    1.创建分支 

    我们可以通过创建在合并分支,自己创建分支。

    1. git branch 分支名 //创建分支
    2. git brach //查看分支

    我们可以利用cat .git/Head来查看路径,之后我们tree可以看到heads下出现了除master外的分支,

    其中查看里面的comitID也是最新的一次提交。

    创建之后那么我们如何使用我们创建的这个分支,head指向我这个,而不是master?

    git checkout 分支名

    切换到该分支名,head指向该分支,之后就可以提交到分支下。

    2.删除分支

    当我们创建成功后,使用一段时间后合并到master中,对于我们该分支可能就没用了,那么如何删除呢?

    git brach -d 分支名
    

    删除该分支,其次删除一个分支需要在另一个分支上。

    3.合并冲突

    git merge 分支名

    一般需要合并分支到master是,会出现冲突---对于某个文件的修改,master与我们新建的分支都做了记录,但两者所记录的不一样,合并时就会出现冲突 ,此时我们必须要⼿动调整冲突代码,并需要再次提交修正后的结果!!对于再次提交是非常重要,切勿忘记。

    4.分支管理策略

    通常合并分⽀时,如果可能,Git 会采⽤ Fast forward 模式。还记得如果我们采⽤ Fast
    forward 模式之后,形成的合并:
       在这种 Fast forward 模式下,删除分⽀后,查看分⽀历史时,会丢掉分⽀信息,看不出来最新提
    交到底是 merge 进来的还是正常提交的
    但在合并冲突部分,我们也看到通过解决冲突问题,会再进⾏⼀次新的提交,得到的最终状态为
    那么这就不是 Fast forward 模式了,这样的好处是,从分⽀历史上就可以看出分⽀信息。例如我
    们现在已经删除了在合并冲突部分创建的 dev1 分⽀,但依旧能看到 master 其实是由其他分⽀合并得到。

    5.bug分支

    我们知道想要修改bug分支,不能直接修改,而是要重新创建一个新的分支,在上面来操作bug分支,那么如何操作呢?

    为了不影响其他文件,Git 提供了 git stash 命令,可以将当前的⼯作区信息进⾏储藏,被储藏的内容可以在将来某个时 间恢复出来。
    git stash

    隐藏的信息比在工作区中,在一个.git下,之后我们开始修复bug,之后还是需要添加和递交操作。

    修改完之后恢复我们的内容:

    git stash pop
        最终⽬的是要让 master 合并 改修改 分⽀的,那么正常情况下我们切回 master 分⽀直接合
    并即可,但这样其实是有⼀定⻛险的。
    是因为在合并分⽀时可能会有冲突,⽽代码冲突需要我们⼿动解决(在 master 上解决)。我们⽆法 保证对于冲突问题可以正确地⼀次性解决掉,因为在实际的项⽬中,代码冲突不只⼀两⾏那么简单, 有可能⼏⼗上百⾏,甚⾄更多,解决的过程中难免⼿误出错,导致错误的代码被合并到 master 上。
         解决这个问题的⼀个好的建议就是:最好在⾃⼰的分⽀上合并下 master ,再让 master 去合并
    其他分支  ,这样做的⽬的是有冲突可以在本地分⽀解决并进⾏测试,⽽不影响 master。

    6.强制删除分支

    一般情况下,我们在创建的分支下进行了许多的创作,并且有过很多次提交了,但是突然不需要了,想要删除git brach -d,此时.git会保护改分支,认为是有用的。那么如何强制删除:
    git brach -D  分支名

    五,远程操作

    1.创建远程仓库

    创建远程仓库这里使用的是国内的马云平台Gitee - 企业级 DevOps 研发效能平台,在这里我们可以注册账号,之后在这里可以创建远程仓库。

    创建的过程中我们就可以看到会自动生成一个地址,通过该地址就可以访问到该远端仓库。

    一般推荐选择ReadMe模板创建,生成之后就可以看到仓库里的一些属性和内容:

    可以看到远端仓库也有远端分支,当前之后主分支master:

    选择ReadMe模板也会有对应的文件:

    除此之外,还有issues和pull request两个模板:

    对于issue:一般我们开源之后项目出现了bug,有的在浏览的人发现了,就可以在isssue中提交发现的bug,开发者与之再次交流。

    对于pull request:在我们的项目完成之后,需要将该分支合并到master中,这是提交一个pull request,可以理解为合并申请单,说明其中理由,仓库管理员同意之后才会被merge。

    当然通过管理选项我们也可以看到各种对仓库成员和内容的设置:

    2.克隆远程仓库

    对于克隆gitee平台提供了四种协议,我们常用也就是https和ssh这两种协议,对于ssh是有保护加密的,https是没有的。

    那么如何克隆本地仓库到远端仓库呢?前提,不能在本地仓库下的某个目录执行改命令,而其他目录下就可以克隆。

    对于https:

    git clone http提供的链接

    对于ssh协议:

    首先我们需要查看设置ssh的公钥,在设置里可以找到,之后配置ssh公钥:

    第一步:在⽤⼾主⽬录下,看看有没有.ssh⽬录,如果有,再看看这个⽬录下有没有 id_rsa 和 id_rsa.pub 这两个⽂件,如果已经有了,可直接跳到下⼀步。如果没有,需要创建 SSH Key。
     ssh-keygen -t rsa -C "创建gitee使用的邮箱号一致"

    没有邮箱可以在平台中设置。然后一路i回车,,,,再在仓库下查看是否还有这两个文件,其中id_rsa.pub就是公钥.

    第⼆步:添加⾃⼰的公钥到远端仓库,复制其中
    注意:如果这里是多人开发就需要所有人的公钥。

    之后就可以clone远端仓库到本地。

    git clone ssh提供的链接

    之后就可以看到创建了一个远端仓库一样的目录,其中内容:

     可以看到远端仓库与本地仓库的格式基本一样。

    其次我们也可以查看远端信息:对应的地址与指令权限

    git remote -v //查看远端信息

    我们创建(clone)的这个本地仓库食用油对远程仓库的推(pull)与拉(fetch)的操作的。

    将本地的开发推送到远端仓库就是利用push指令。

    将远端的仓库某些项目拉到本地仓库就是利用指令fetch。

    3.向远端仓库推送

    那么如何将本地仓库中的修改推送到远端仓库呢?

    利用push指令 可将本地仓库的master分支下修改的内容推送到远端的master下。

    首先进入到我们clone的仓库下,配置好name与email。如何推送:

    1. git add 文件名
    2. git commit -m "日志"
    3. git push origin master:master //推送本地的master到远端master
    4. git push origin master //分支名相同可省略

    4.拉取远端仓库

    若远程仓库的内容是领先本地仓库的话没那么我们还是可以拉取远端仓库的内容到本地仓库。

    1. git pull origin master:master
    2. git pull origin master //拉取远端仓库master到本地master

    5.忽略特殊文件

    在⽇常开发中,我们有些⽂件不想或者不应该提交到远端,⽐如保存了数据库密码的配置⽂件,那怎么让 Git 知道呢? 在 Git ⼯作区的根⽬录下创建⼀个特殊的 .gitignore ⽂件,然后把要忽略的⽂件 名填进去,Git 就会⾃动忽略这些⽂件了。
    这个文件在我们创建仓库是会提供给有模板:

    当然没有的话我们自己也可以创建,在工作区根目录下直接:

    vim .gitignore

    之后将我们不想推送到远端的文件名写入其中。

    一般推送时,我们都是将当前目录下所有的文件添加到暂存区。有时候,对于我们想推送的一个文件之前被添加到gitignore下,我们可以在.gitignore下!+文件名,此时就不会去隐藏该文件,除此之外的会被隐藏。

    当,gitignore下的文件越来越多时,我们一般都是统一将某个后缀的文件都忽略了,此时有一个文件无法被准总但我们不知道是不是因为gitignore的原因,我们可以:

    git check-ignore -v 文件名  //检查是否时ignore下的

    6.配置命令别名

    git提供配置使得我们可以给指令启别名:

    git config --global alias.set status//全局设置给status启了一个别名叫做 set

    长命令我们可以加单引号。

    六,标签管理

    标签 tag ,可以简单的理解为是 对某次 commit 的⼀个标识,相当于起了⼀个别名 。例如,在项⽬
    发布某个版本的时候,针对最后⼀次 commit 起⼀个 v1.0 这样的标签来标识⾥程碑的意义。
    这有什么⽤呢? 相较于难以记住的 commit id ,tag 很好的解决这个问题,因为 tag ⼀定要给⼀
    个让⼈容易记住,且有意义的名字
    当我们需要回退到某个重要版本时,直接使⽤标签就能很快定位到!!!

    1.操作标签

    git tag 标签名  //默认给最新的一次提交打标签

    当然我们可以查看所有的标签名:

    git tag

    我们也可以在.git下查看到。

    1. git log --pretty=oneline --abbrev-commit //以简短简洁的方式查看所有提交记录
    2. git tag 标签名 commitID//对某一次提交打标签,我们需要知道他的commitID

    此外我们还可以对标签进行说明:

    git tag -a 标签名 -m "说明"  commitID

    再利用指令查看其详细信息:

    git show 标签名

    2.推送标签

    对于本地的标签我们也可以推送到远端:

    git push origin 标签名
    git push origin --tags//将所有标签推送到远端

    删除标签并推送到远端仓库:

    git tag -d 标签名//删除标签

    对于推送到远端,就是将修改推送到远端: 

    git push origin :标签名
  • 相关阅读:
    continue和break的区别与用法
    新手如何用Airtest实现在图片范围内随机点击?
    Elasticsearch6.2服务器升配后的bug
    3.6 纹理压缩——包体瘦身术
    java基于Springboot+vue的超市购物商城网站 elementui
    linux内核获取本机网卡的统计信息
    原生mysql与mybatis执行update语句的差异
    leetcode每天5题-Day37
    【前后端分离系列】 Spring Boot + Vue 实现 EasyPOI 导入导出
    爬虫逆向实战(33)-某联社数据(webpack)
  • 原文地址:https://blog.csdn.net/qq_61422622/article/details/132889269