zoukankan      html  css  js  c++  java
  • 001. git基础

    1. 持续集成教程

    1.1 持续集成的基础概念

    • 持续集成:
      持续集成(Continuous integration),简称: CI
      持续集成是频繁的(一天多次)将代码集成到主干部分,它的好处有两个.
      1.发现错误,每完成一次更新,就会集成到主干中,以便于发现错误,定位错误,且比较容易.
      2.防止分支大幅度偏离主干. 如果不是经常集成,主干又在不断更新,会导致后续集成难度变大,甚至难以集成.
      3.持续集成,可以让产品快速迭代,同时保持高质量.

    • 持续交付:

      ​ 持续交付(Continuous delivery)指的是,频繁的将软件的新版本交给质量团队或者用户,以供评审,如果评审通过,代码就进入生产阶段.

      持续交付可以看作是持续集成的下一步,他强调的是: 不管怎么更新,软件是随时随地的交付的

    • 持续部署:

      ​ 持续部署(continuous deployment) 是持续交付的下一步,指的是代码通过评审后,自动部署到生产环境.

      ​ 持续部署的目标是: 代码在任何时候都是可部署的,可以进入生产阶段. 持续部署的前提是能自动化完成测试,构建,部署等步骤.

      注意: 持续交付不等于持续集成,区别如下图:

    1.2 持续集成的一般流程

    持续集成的设计: 从代码提交到生产,他的过程分为以下步骤:
    
    第一步: 开发者向代码仓库提交代码,所有后面的步骤,都始于本地代码的 第一次提交(commit)
    
    第二步: 代码仓库对 commit操作配置好了钩子(hook),只要提交代码或者合并主干,就会启动自动化测试和构建
    	   通过第一轮测试,代码就可以合并进主干,就算作可以交付了
    
    第三步: 第二轮测试, 交付代码后,会先进行构建(bulid),然后才会进入第二轮测试,所谓构建,指的是将代码转换为
    	   可以运行的实际代码,比如安装依赖,配置各种资源(样式表,js脚本,图片)等等.
    
    **"常见的构建工具: Jenkins Travis,codeship等"**
    
    第四步: 第三轮测试. 如果第二轮已经涵盖了所有测试内容,那么第三轮测试就可以省略,当然,这时构建步骤也要移到第一轮测试的前面.
            第三轮测试是全面测试,单元测试和集成测试都会走一遍,有条件的话也要做端对端测试,所有测试以自动化为主,少数无法自动化测试的需要人工测试.
            通过第三轮测试,当前代码就是一个可以直接部署的版本 (artifact). 将这个版本的所有文件打包存档,发布到生产服务器.
            生产将服务器打包文件,解包成本地的一个目录,再将运行的路径符号连接指向这个目录,然后重新启动应用,这里面的部署工具有: Ansible,Chef,Puppet等.
    
    
    版本回滚: 一旦当前版本发生问题,就要回滚到上一个版本的构建结果,最简单的就是修改以下符号链接,指向上一个版本的目录. 
    

    1.3 认识DevOps

    1.3.1 DevOps是啥?

    DevOps 是 Development和Operations的组合. 突出重视软件开发人员和运维人员的沟通合作,通过自动化流程
    来使得软件构建,测试,发布更加快捷,频繁,可靠
    
    强调: Devops 是一个框架,一种方法论,并不是一套工具,他包括一系列的基本原则和实践.
    

    1.3.2 为什么需要DevOps呢?

    1. 产品的迭代需要
       在显示工作中,我们用户新建立一个项目的时候,他并不知道他需要什么,只能进行简单的描述幻想.但是一旦程序设计人员设计出一个初稿产品后,他会告诉我们,他们不需要什么,这样我们产品需要反复迭代,而且过程可能会很曲折,面临这个我么提,我们有什么办法能过解决快速交付,灵活响应用户需求变化呢?
       答案就是:  Devops,因为DevOps是面向业务目标,助力业务成功的最佳实践.
       
    2. 技术革新
    	现在IT技术架构随系统不断更新迭代,从最初期服务都在一个系统中到现在的微服务架构集群,从手工到自动化部署,从单机时代到集群云平台时代.产品和技术都在不断更新.
    

    1.3.3 DevOps涉及的技术

    devops是一个框架和方法,不是一个具体工具.

    1. 敏捷管理工具
      Trello
      Teambition
      worktile
      tower
      
    2. 产品与质量管理
      confluence
      禅道
      
    3. 代码仓库管理
      git
      gitlab
      github
      
    4. 自动化构建脚本
       Gradle
       maven
       SBT
       ANT
       
     5. 虚拟化与容器化
       VMware
       virtualBox
       Vagrant
       Docker
       
     6. 持续集成(ci) 持续部署(cd)
       jenkins
       Hudson
       Travis CI
       Circle CI
       
     7. 监控工具
       Zabbix
       
     8. 日志管理
       ELK
    

    2. 版本控制系统

    2.1 为什么需要版本控制系统

    将文件变化进行管理控制,能够自动生成备份,能够对比文件修改内容,能够及时回退.

    常见版本控制系统: SVN(集中式版本控制系统) GIT(分布式版本控制系统)

    2.2 Git 分布式版本控制系统

    2.3 Git 简介

    Git是一个开源的分布式版本控制系统,用于敏捷搞笑处理任何或大或小的项目.
    Git与常用的版本控制工具(CVS,Subversion)不同,它采用了分布式版本库的方式,不必服务器端软件支持.另外他是Linux教父 托瓦兹 写的. 重点是: 这是托瓦兹使用 "C语言" "两周时间" 编写的版本控制系统. 如今Git已经成为了常用的版本控制系统之一

    了解托瓦兹: https://baike.baidu.com/item/林纳斯·本纳第克特·托瓦兹/1034429?fr=aladdin

    2.4 Git与SVN的区别

    1. GIT是分布式的,SVN不是的,这是最核心的区别
    2. GIT把内容按照元数据方式存储的,SVN是按照文件形式的. 所有资源控制系统都是把文件元信息淫才在一个类似 .svn .cvs的文件夹里的.
    3. Git分支和SVN分支不同:  SVN的分支表现形式就是一个目录
    4. GIT没有一个全局版本号,SVN有的, 这是GIT的缺点之一.
    5. GIT的内容完整性要优于SNV: GIT的内容存储使用的是 SHA-1 哈希算法,能够确保代码的完整性
    

    2.5 Git安装

    # 推荐安装epel仓库
     rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
    #git版本查看
    [root@node1 ~]# git --version
    git version 1.8.3.1
    
    
    git安装准备注意: 
    #selinux 关闭 
    setenforce 0
    getenforce
    
    
    #系统时间设置准确
    yum install -y ntpdate
    ntpdate ntp1.aliyun.com
    
    #防火墙关闭
    systemctl stop firewalld       #关闭防火墙  
    systemctl disable firewalld    #开机不启动防火墙
    
    
    #yum安装方式:
    yum install -y git
    

    2.6 Git配置

    # 1. 用户配置[常用]
    git config --global  用户配置
    
    示例配置步骤:
    git config --global user.name chenleilei
    git config --global user.email 370460370@qq.com
    以上两句命令执行完毕后,当前文件夹就会多出一个 .gitconfig 文件
    
    查看里面的内容:
    [root@node1 ~]# cat .gitconfig
    [user]
            name = chenleilei
            email = 370460370@qq.com
    
    除了这个方式,还有命令可以查看到配置项:
    [root@node1 ~]# git config --list
    user.name=chenleilei
    user.email=370460370@qq.com
    
    一般我们部署git需要做的:
    [root@node1 ~]# git config --global user.name chenleilei        #创建个人信息
    [root@node1 ~]# git config --global user.email 370460370@qq.com #创建个人信息,创建完成后会在家目录生成 .gitconfig 文件
    
    
    # 2. 系统配置
    git config --system [命令]     系统配置指令
    
    
    # 3. 全局仓库配置
    git config --local   仓库层面配置
    git config --global -l #查看配置
    # 3.1 修改全局配置
    [root@node1 ~]# git config --global --edit
    [user]
            name = chenleilei
            email = 370460370@qq.com
            
    --edit 可以简写为 -e
    

    2.7 Git初始化

    如何对一个新目录进行git初始化,形成git仓库

    [root@node1 ~]# mkdir -p /root/git_test/
    [root@node1 ~]# cd /root/git_test/
    [root@node1 git_test]# git init
    Initialized empty Git repository in /root/git_test/.git/
    
    我们看看隐藏文件夹有什么:
    [root@node1 .git]# ll
    total 32
    drwxr-xr-x 2 root root 4096 Oct 23 00:04 branches
    -rw-r--r-- 1 root root   92 Oct 23 00:04 config
    -rw-r--r-- 1 root root   73 Oct 23 00:04 description
    -rw-r--r-- 1 root root   23 Oct 23 00:04 HEAD
    drwxr-xr-x 2 root root 4096 Oct 23 00:04 hooks     #钩子脚本
    drwxr-xr-x 2 root root 4096 Oct 23 00:04 info
    drwxr-xr-x 4 root root 4096 Oct 23 00:04 objects   #git实际管理的数据
    drwxr-xr-x 4 root root 4096 Oct 23 00:04 refs
    
    
    总结: 拿到git后我们需要做的步骤:
    1. 创建git目录 mkdir  /leilei
    	            cd  /leilei
    2. 初始化git目录 git init 
    
    3. 配置完成后会生成一个 .git 的目录 通过 ll -a 查看
    
    4. 检查 .git 目录
    [root@node1 leilei]# cd .git/
    [root@node1 .git]# tree
    .
    ├── branches
    ├── config
    ├── description
    ├── HEAD
    ├── hooks     #---- 存储钩子脚本
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── prepare-commit-msg.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   └── update.sample
    ├── info
    │   └── exclude
    ├── objects   #真实数据存在这个文件夹中.
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        └── tags
        
    #第一次暂存文件后, 会生成一个index的文件作为暂存区.
    

    2.8 git仓库的概念

    git仓库分为4个区域:远程仓库  # 公共的远程仓库如: github gitlab本地仓库  # .git文件夹,就是本地仓库暂存区域  # 这个目录在第一次暂存文件就就会创建.git/index   工作目录  # 工作目录就是创建的目录当文件在本地仓库后,文件增删改查都会被记录git的四种状态:Untracked  :   未修改状态,未跟踪,就在工作目录中,没有被git管理(只出现在工作区)Unmodified :   未修改状态,文件在本地仓库中.被跟踪 [出现在本地区域,出现在暂存区,工作区,本地仓库都有一份,数据也一致]Modified   :   如果在本地仓库中修改过,状态就会被改为 Modified状态. [受git管理的文件被修改了就是Modified状态]Staged     :   一个未被跟踪的文件,添加到暂存区后它的状态就是 Staged 状态
    

    2.9 git的4个区域/状态

    远程仓库     #[remote] 暂存区  本地仓库     #[Repository] add提交后会到仓库.暂存区       #[index/staged] 临时存放改动过的文件或目录 commit提交后会同步到本地仓库		   # 暂存区可以做 删除 修改 查看状态工作目录     #[workspace] 存放项目代码的地方, 工作目录就是我们通过 git init 初始化的目录百度的资料:新建文件--->Untracked使用add命令将新建的文件加入到暂存区--->Staged使用commit命令将暂存区的文件提交到本地仓库--->Unmodified如果对Unmodified状态的文件进行修改---> modified如果对Unmodified状态的文件进行remove操作--->Untrackedgit命令快速使用: git add [文件名]     文件提交到暂存区git rm --cached [文件名]      文件从暂存区移除rm -f [文件名]       从本地删除文件git status查看到文件可以用:git commit -m "remove a" git删除文件a删除还有更快捷的方式,不用从暂存区删除然后删除本地文件:git rm -f [文件名]该命令是直接将暂存区和本地文件一起删除.https://www.cnblogs.com/qdhxhz/p/9757390.html
    

    1. 首先初始化一个代码目录[git init]2. 提交代码会首先放到暂存区[git add ] 暂存区就相当于 .git/ 目录下的文件.    该命令会让一个文件从未修改状态变为修改状态  从图中来看它会从Untracked状态转变为Staged状态.   git add * 可以将当前本地工作目录所有文件提交到"暂存区"   3. 暂存区[index]修改后会同步到本地仓库 [git commit -m "commit a"],提交后才会真正的被仓库管理,还可以使用:git rm --cached [文件名] 清除暂存区文件,移动回工作目录,并且暂存区也会清除 c 文件通过示例来看:[root@master leilei]# git rm --cached crm 'c'[root@master leilei]# git status......#   (use "git rm --cached <file>..." to unstage)##	new file:   a#	new file:   b## Untracked files:#   (use "git add <file>..." to include in what will be committed)##	c#可以看出 C 文件已经从暂存区移除.变成未跟踪状态,相当于回到工作目,录回到了初始状态.除了清除缓存区文件还可以对缓存区文件进行修改: git mv [文件名] [新文件名]4. 本地仓库如果需要从暂存区删除,从本地也删除文件,可以直接使用 git rm -f [文件名]
    

    案例让你能明白 暂存区 本地工作目录的区别

    1. 本地创建文件: [root@k8s-master git_test]# touch  1 2 3[root@k8s-master git_test]# ls1  2  3[root@k8s-master git_test]# git status           #没有提交的时查看状态,显示未跟踪状态。# On branch master# Untracked files:#   (use "git add <file>..." to include in what will be committed)##	1#	2#	3nothing added to commit but untracked files present (use "git add" to track)[root@k8s-master git_test]# git add 1 2 3                    ---提交到暂存区[root@k8s-master git_test]# git status                       ---查看状态# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##	new file:   1#	new file:   2#	new file:   32. 本地工作目录对比 [root@k8s-master git_test]# git add 1             # 首先提交一次,这样本地工作目录与暂存区文件都一样[root@k8s-master git_test]# git diff 1            # 进行一次对比,此时没有任何输出,因为他对比的就是本地工作目录和暂存区 都是一样的,所以没有输出[root@k8s-master git_test]# echo 1 >1             # 为了让它有区别,需要本地文件新增内容,让他与暂存区文件不一致 然后在做对比[root@k8s-master git_test]# git diff 1            # 此时他会对比 本地文件和已经提交到暂存区的文件进行对比diff --git a/1 b/1                                # git diff 用于对比本地工作目录和暂存区的区别。追加内容后,本地文件被修改了,暂存区没有index e69de29..d00491f 100644                     # 所以这里会提示有新的改动。--- a/1+++ b/1@@ -0,0 +1 @@+1               #<------新增内容[重点: 也就是说,通过 git diff 是让工作目录的文件和暂存区的文件进行对比]3. 提交一次修改到暂存区[root@k8s-master git_test]# git add 1             # 将修改的内容提交到暂存区,此时工作目录和暂存区文件内容保持一致[root@k8s-master git_test]# git diff 1            # 本地文件 与 暂存区 进行对比,没有输出。因为他们保持一致了,但是还没提交到仓库                                                  # 但是需要注意,此时并没有提交到本地仓库,如果通过本地仓库与暂存区对比则会提示不同检查 "暂存区" 和 "本地仓库"[root@k8s-master git_test]# git diff --cached 1     # 这个是查看暂存区与本地仓库的对比,能看到有新文件被创建,并且有新内容写入diff --git a/1 b/1new file mode 100644index 0000000..d00491f--- /dev/null+++ b/1@@ -0,0 +1 @@+14. 提交到本地仓库[root@k8s-master git_test]# git commit -m "modify 1"   #这是提交一次修改到本地仓库喝工作目录,git commit会让本地仓库,暂存区,本地工作目录保持一致[master b511624] modify 1 1 files changed, 1 insertion(+) create mode 100644 1  5. 查看暂存区与本地仓库对比:[root@k8s-master git_test]# git diff --cached 1  此时已经经过提交的 暂存区内容与本地仓库内容保持一致,所以没有任何输出。 如果需要有输出,则可以通过 echo 123 >1 然后通过 git add 1  再去做对比才会有不同结果 注意: git add .   是将文件提交到暂存区[提交到暂存区是还没有做修改,需要通过git commit -m "*" 提交到了本地仓库才算真正修改了] git commit -m "*" 是将暂存区文件提交到本地仓库   这里是git较为核心的知识点,误解了意思后面操作起来就很麻烦
    

    2.9 git命令[增删改查]

    git add a  ## 把一个文件从本地工作目录提交到暂存区(./git/index目录中)git status  ##查看git仓库状态, 这是进入初始化好的git仓库后,第一次的时候就要检查这个仓库的状态,这是必备命令.[root@node1 git_test]# git status# On branch master## Initial commit#nothing to commit (create/copy files and use "git add" to track)# 你可以对这个仓库进行 创建,复制文件,或者使用 git add跟踪文件.创建文件后继续检查:[root@node1 git_test]# git status# On branch master## Initial commit## Untracked files:   ---# 新创建的文件,没有被git管理,所以在Untracked files中#   (use "git add <file>..." to include in what will be committed)##	a#	b#	cnothing added to commit but untracked files present (use "git add" to track)# 提交文件到暂存区:[root@node1 git_test]# git add a      ##提交新文件到暂存区[root@node1 git_test]# git status# On branch master## Initial commit## Changes to be committed:#   (use "git rm --cached <file>..." to unstage)##	new file:   a      ##这里会提示新的文件## Untracked files:#   (use "git add <file>..." to include in what will be committed)##	b                 ##这里还是会显示未提交过的文件,未跟踪状态#	c这上面的操作就是将一个文件从工作目录提交给暂存区命令为:  git add a提交多个文件到暂存区:git add .   ##当前目录的所有文件# 文件移出暂存区到本地目录: git rm --cached [文件名]  #移回提交到暂存区的文件到本地工作目录.		如: [root@node1 git_test]# git rm --cached c			rm 'c'移动到暂存区后再次查看状态:[root@node1 git_test]# git status# On branch master## Initial commit## Changes to be committed:#   (use "git rm --cached <file>..." to unstage)##	new file:   a#	new file:   b## Untracked files:#   (use "git add <file>..." to include in what will be committed)##	c     #-----可以看到 c这个文件又重新变回了  Untracked 状态,存留在本地目录了   当你使用git status命令得到的结果是:[root@master leilei]# git status# On branch masternothing to commit, working directory clean说明你的 暂存区 本地仓库 本地工作目录 保存的文件都是一致的.且都有一份# 删除 暂存区和工作目录中的文件. 1. 如果文件在暂存区 那么先要从暂存区移除 git rm --cached [文件名] 2. 然后删除文件 rm -f c 这样,这个文件就会被彻底删除. # 同时删除工作目录和暂存区文件:  git rm -f c结果:[root@master leilei]# git status# On branch master## Initial commit## Changes to be committed:#   (use "git rm --cached <file>..." to unstage)##	new file:   1.txt#	new file:   a#	new file:   b  #提交文件到本地git仓库:[root@node1 git_test]# git commit -m "commit a"[master (root-commit) a79daaf] commit a 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a create mode 100644 b 注意,只有把文件提交到本地git远程仓库,这个文件才会这正被git管理.  #改名git中的改名相当于删除了原有文件,创建了一个新文件.改名后,需要删除暂存区文件git rm --cached agit也提供了一个改名命令 git mv [文件名] [新文件名] git还可以使用 git commit -m "rename 1.txt to 2.txt"
    

    整理知识:

    本地工作目录 ----> 暂存区 ----> 本地仓库 ---> 远程仓库
    git add ----> git commit ---->本地仓库 #这样操作后,3个区域都保存了提交的文件,数据也一致

    本地仓库删除了,暂存区删除了, git commit后,就会直接删除文件了. 不过还可以通过commit找回.

    1. 创建一个git目录2. 通过 git init 初始化目录 [本地仓库]3. 创建文件 4. git add 添加到暂存区[cached]5. git commit 提交到本地git仓库[快照]6. 回退快照:   1. 将暂存区恢复到本地工作目录.   2. 将本地仓库恢复到暂存区   3. 暂存区恢复到本地工作目录.   4. 跳转到某一次快照
    

    3.0 git快照与回退:

       1. 将暂存区恢复到本地工作目录.   2. 将本地仓库恢复到暂存区   3. 暂存区恢复到本地工作目录.   4. 跳转到某一次快照注意:git checkout -- chenleilei  只能撤回上一次的修改   1. 创建实验文件 chenleilei   [root@master leilei]# touch  chenleilei   [root@master leilei]# echo 888 >chenleilei      #添加文件内容   [root@master leilei]# git add chenleilei        #提交到暂存区   [root@master leilei]# echo  000 >>chenleilei    #添加内容   [root@master leilei]# git diff chenleilei[root@master leilei]# git diff chenleilei     #对比文件,查看变化diff --git a/chenleilei b/chenleileiindex dc6a988..c349552 100644--- a/chenleilei+++ b/chenleilei@@ -1 +1,2 @@ 888+000          <<--- 添加了 000 这行#现在问题,我添加了这一行我觉得多了我想回退到 000 这行#做法:[root@master leilei]# git checkout -- chenleilei    #没有输出则证明正确.#检查是否回退:[root@master leilei]# cat chenleilei      #可以看到 000 这一行消失了888#以上说的是回退一行,那要是很多行呢?[root@master leilei]# echo  111 >> chenleilei [root@master leilei]# echo  222 >> chenleilei[root@master leilei]# git add .## 查看历史提交命令: git log  -p      # 可以看到历史修改的日志详情 git log  -1      # 可以看到历史修改的日志详情最近修改的第一条 git log  -p -2   # 查看历史修改的详情 和 最近修改的指定条数对指定快照进行恢复:[root@master leilei]# git log  -p                 # 可以看到历史修改的日志详情commit 143e15a52085296ca8ad0278b9cc2a8819bfac59   # md5值Author: chenleilei <370460370@qq.com>             # 修改人Date:   Fri Sep 25 18:14:55 2020 +0800            # 时间    +456      #修改的内容diff --git a/1 b/1index 1f6fbad..8d38505 100644--- a/1+++ b/1@@ -1,2 +1 @@-111-123+456commit 858fd9782a82c107d9665d987bf42a03046bac54Author: chenleilei <370460370@qq.com>Date:   Fri Sep 25 18:02:48 2020 +0800    1diff --git a/1 b/1index 58c9bdf..1f6fbad 100644--- a/1+++ b/1@@ -1 +1,2 @@ 111+123## git 快照与回退:1. 创建测试数据:-------------------------------创建测试数据-------------------------------[root@k8s-master git_test]# touch  test[root@k8s-master git_test]# echo 1 >test[root@k8s-master git_test]# git add test[root@k8s-master git_test]# git commit  -m "add 1"[master f277436] add 1 1 file changed, 1 insertion(+) create mode 100644 test[root@k8s-master git_test]# echo 2 >> test[root@k8s-master git_test]# git add test[root@k8s-master git_test]# git commit  -m "add 2"[master 1ce7de4] add 2 1 file changed, 1 insertion(+)[root@k8s-master git_test]# echo 3 >> test[root@k8s-master git_test]# git add test[root@k8s-master git_test]# git commit -m "add 3"[master bd6b9f3] add 3 1 file changed, 1 insertion(+)-------------------------------创建测试数据-------------------------------2. 查看历史日志[root@k8s-master git_test]# git log -3 testcommit bd6b9f302dad316b412d90321b3fc6185ad03c87Author: chenleilei <370460370@qq.com>Date:   Fri Sep 25 18:40:15 2020 +0800    add 3commit 1ce7de405418080991b3913f1b2fdd3d214e019cAuthor: chenleilei <370460370@qq.com>Date:   Fri Sep 25 18:39:55 2020 +0800    add 2commit f2774364e682e5e6d706a26baf42cb40cbea1609Author: chenleilei <370460370@qq.com>Date:   Fri Sep 25 18:39:34 2020 +0800    add 13. 检查现有数据:[root@k8s-master git_test]# cat test1234. 通过日志的 commit md5值 进行回退都第一次提交:[root@k8s-master git_test]# git reset --hard f2774364e682HEAD is now at f277436 add 1[root@k8s-master git_test]# cat test1
    

    3.1.2 回退的几种情况与回退:

    了解: git快照会保存仓库的状态,在出现故障的时候通过状态来恢复以前的状态.1. 第一种情况:    当在改动本地工作目录,暂存区和本地仓库没有改动,此时发现错了,需要改回.   解决: 通过暂存区来覆盖的方式恢复本地工作目录   暂存区 --> 本地工作目录2. 第二种情况:   在本地工作目录改好了,发现没问题就提交到了暂存区,当提交到暂存区后发现有问题,现在的状况是本地工作目录和暂存区数据都是错的,只有本地仓库是正确的.    解决方法: 本地仓库 覆盖 暂存区, 暂存区 覆盖 本地工作目录.   本地仓库 --> 暂存区 --> 本地工作目录    3. 第三种情况:   已经对本地仓库进行修改了,自己也不知道自己做了什么,中间也有过commit提交暂存区操作.现在觉得有问题,但是又无法改回去.   解决办法: 记住一次正确的,直接回退到正确的.
    

    3.1.3 回退实战:

    1. 暂存区 -- > 本地工作目录 的回退操作

    1. 第一种情况:    当在改动本地工作目录,暂存区和本地仓库没有改动,此时发现错了,需要改回.   解决: 通过暂存区来覆盖的方式恢复本地工作目录   暂存区 --> 本地工作目录-----------------------------git回退操作---------------------------------1. 配置git目录   mkdir  /777   cd  /7772. 初始化git目录 git init    git init   3. 配置完成后会生成一个 .git 的目录 通过 ll -a 查看[root@master 777]# ll -adrwxr-xr-x   3 root root  18 Dec  9 16:54 .dr-xr-xr-x. 18 root root 255 Dec  9 16:54 ..drwxr-xr-x   7 root root 119 Dec  9 16:54 .git4. 生成测试数据[root@master 777]# echo aaa >a[root@master 777]# echo bbb >>a[root@master 777]# echo ccc >>a[root@master 777]# git add a        #提交数据5. 提交后 在进行对比[root@master 777]# echo ddd >a[root@master 777]# git diff adiff --git a/a b/aindex 1802a74..1d60b70 100644--- a/a+++ b/a@@ -1,3 +1 @@-aaa-bbb-ccc+ddd      ## 提示 ddd 被添加进去了[root@master 777]# cat a     #直接查看内容更直观的看到 ddd 已经添加进了a这个文件中.aaabbbcccddd        <----- ddd已经被添加进了文件中.6. 回退[发现有错,不该添加ddd]--------------------------------------------------------------------------------[root@master 777]# git status# On branch master## Initial commit## Changes to be committed:#   (use "git rm --cached <file>..." to unstage)##	new file:   a## Changes not staged for commit:#   (use "git add <file>..." to update what will be committed)#   (use "git checkout -- <file>..." to discard changes in working directory)##	modified:   a--------------------------------------------------------------------------------发现帮助: use "git checkout -- <file>..." to discard changes in working directory你可以通过使用 git checkout [文件名] 来回退操作.6. 开始回退:[root@master 777]# git checkout a     #回退a这个文件.[root@master 777]# cat aaaabbbccc#这里发现我们添加的 ddd 已经不存在文件中了-----------------------------git回退操作---------------------------------
    

    2. 暂存区 -- > 本地工作目录 的回退操作

    本地工作目录设置为了 /777[root@master 777]# touch a[root@master 777]# echo  "aaa" >a[root@master 777]# echo  "bbb" >>a[root@master 777]# git add .[root@master 777]# git commit -m "commit a"[root@master 777]# git status# On branch masternothing to commit, working directory clean## 以上为制造演示数据,可不看[root@master 777]# cat a        #现在 a 文件中已经有了 两行数据aaabbb[root@master 777]# echo "ccc" >>a   #追加一行进去[root@master 777]# git status       #查看状态# On branch master# Changes not staged for commit:#   (use "git add <file>..." to update what will be committed)#   (use "git checkout -- <file>..." to discard changes in working directory##	modified:   a#no changes added to commit (use "git add" and/or "git commit -a")[root@master 777]# git add .           #添加到暂存区[root@master 777]# git diff --cached   #对比数据diff --git a/a b/aindex dbee026..1802a74 100644--- a/a+++ b/a@@ -1,2 +1,3 @@ aaa bbb+ccc                                # 可以看出 ccc 是新增数据.#通过 git status 来看:[root@master 777]# git status# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##	modified:   a# 使用仓库状态覆盖暂存区:[root@master 777]# git reset --hard HEADUnstaged changes after reset:M	a[root@master 777]# cat a aaabbbccc[root@master 777]#  git diff a     #检查改动diff --git a/a b/aindex dbee026..1802a74 100644--- a/a+++ b/a@@ -1,2 +1,3 @@ aaa bbb+ccc[root@master 777]# git diff --cached a  #进行撤回恢复.#检查没有输出说明 本地工作目录做了改动,暂存区和本地仓库没有做改动,此时又一次回到了我们第一次实验的环境,我们只需要使用  git checkout -- a撤回完成后通过 git diff a 再一次查看a文件的改动情况:[root@master 777]# git diff a     #这时候他已经没有输出了.说明和之前一样 没有做过改动 ccc应该也不在了.我们可以通过 cat a 来查看[root@master 777]# cat a    #可以看到 ccc 已经被撤回了.文件没有被改动了.aaabbb流程记录:1. 追加数据后使用了 git add . 添加了2. git diff --cached  来检查对比本地仓库添加了哪些数据3. git reset --hard HEAD   通过本地仓库文件覆盖暂存区文件,这句是最重要的回退命令,只能回退到上一次操作 git reset --hard HEAD4. cat a 检查是否回退.
    

    3. 修改了文件内容,且做过commit提交后的回退操作

    关键命令: git reset --hard [commit标识符]案例现场还原:[root@master 777]# cat aaaabbb[root@master 777]# echo  ccc >>a[root@master 777]# cat aaaabbbccc[root@master 777]# git add .     #提交了更改回退:查看git commit历史:[root@master 777]# git log acommit fa4e4b2480edef44c0f0062f02b3703a58c44395Author: chenleilei <370460370@qq.com>Date:   Mon Dec 9 17:23:34 2019 +0800    commit a...........commit 68fec000d8f4327dc4d6bbea675a731d7572defcAuthor: chenleilei <370460370@qq.com>Date:   Mon Dec 9 17:21:27 2019 +0800    commit a#---------------------------------------------可以看到很多commit的历史. 找到错误之前额历史实践 获取 commit 的串号唯一标识符,前几位即可回退到指定commit时间点:[root@master 777]# git reset --hard 68fec000d8HEAD is now at 68fec00 commit a[root@master 777]# cat aaaabbbcccddd#如果跳错了呢? 没关系可以通过 git reflog 来查看最近提交的id[root@master 777]# git reflog e1ebcce HEAD@{0}: reset: moving to e1ebcce13b5168fec00 HEAD@{1}: reset: moving to 68fec000d8fa4e4b2 HEAD@{2}: commit: commit a      ----#这就是我们最后一次 commit的ID,通过这个来查看68fec00 HEAD@{3}: commit: commit ae1ebcce HEAD@{4}: commit: commit a3b65d3a HEAD@{5}: commit: commit a202ba55 HEAD@{6}: commit: commit a#回退:[root@master 777]# git reset --hard fa4e4b2HEAD is now at fa4e4b2 commit a[root@master 777]# cat a      #回退成功aaabbb需要看更详细的时间点可以通过git reflog show --date=iso 来查看 git reflog show  --date=iso |head   可以用于倒序查看 最后一次修改保持在最前
    

    3.1 git diff 与git diff --cached

    git diff 会让本地工作目录和暂存区文件进行对比git diff --cached  会让暂存区和远程仓库进行对比实践:git diff 作用:[root@master leilei]# touch 666			##创建文件[root@master leilei]# git add 666		##添加到暂存区[root@master leilei]# git diff 666		##本地文件和暂存区文件进行对比[root@master leilei]# echo 123 >666     ## 修改666这个文件[root@master leilei]# git diff 666      ## 本地文件和暂存区对比diff --git a/666 b/666index e69de29..190a180 100644--- a/666+++ b/666@@ -0,0 +1 @@+123[root@master leilei]# git diff --cached 666   #使用--cached参数对比,只提示有新文件.diff --git a/666 b/666new file mode 100644index 0000000..e69de29提交文件:[root@master leilei]# git commit -m "modify 666"[master f4e2f59] modify 666 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 666使用git diff --cached进行对比: git diff --cached 作用: 暂存区和本地仓库进行对比[root@master leilei]# git diff --cached 666#这里可以看出,git diff 是让本地工作目录[工作区]和暂存区文件进行对比,提交后在对比就没有输出.所以说 git diff 只是让本地仓库和暂存区文件进行对比. #总结:未commit提交的数据可以用 git diff 进行对比已commit提交的数据则使用 git diff --cached 进行对比git diff HEAD  #查看工作区和版本库中的最新提交的不同git reset HEAD a  #回退 a 文件的数据.
    

    3.2 git commit 是什么?

    git commit 相当于为一个文件做了一次类似于虚拟机的快照查看commit历史: git log[root@master leilei]# git logcommit 0a668049b87412385acd6639c8aa76ef196ed192Author: chenleilei <370460370@qq.com>Date:   Mon Dec 9 14:01:40 2019 +0800    110commit f4e2f59f28a6d7ae7639902970e8fbc5eb1c567cAuthor: chenleilei <370460370@qq.com>Date:   Mon Dec 9 13:41:20 2019 +0800    modify 666
    

    3.3 git log日志查看提交历史

    git log  --oneline --decorate    #简要信息,可以看较多日志git log	 #信息较全,查看的日志单条很长.  还可以使用 git log -10  查看10条git log -p  #详细的日志信息,可以查看每次的提交内容git reflog show --date=iso  #查看历史修改和时间git reset --hard [日志中的md5值]   #通过日志回退
    

    微信赞赏

    支付宝赞赏

  • 相关阅读:
    BZOJ1119: [POI2009]SLO
    BZOJ1486: [HNOI2009]最小圈
    BZOJ1098: [POI2007]办公楼biu
    BZOJ2242: [SDOI2011]计算器
    PAT A1023
    SpringCloud之整合Feign
    SpringCloud之整合Feign
    小程序在wxml页面格式化类似的2019-02-16T10:54:47.831000时间
    小程序在wxml页面格式化类似的2019-02-16T10:54:47.831000时间
    Javascript基础之-var,let和const深入解析(二)
  • 原文地址:https://www.cnblogs.com/superlinux/p/15379652.html
Copyright © 2011-2022 走看看