• git代码管理(4)——代码版本管理


    一、版本管理介绍

    通过之前的学习,我们基本学会了Git是怎么管理代码仓库的。之后在日常使用中我们对代码的修改添加删除,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

    二、文件修改测试

    下面我将newfile.txt文件修改了3次,每次修改完成要“git add” 然后 “git commit” 来提交每次的修改,进行记录

     

    三、版本历史查看

    1. git log 命令查看:

    ** 显示了我们每次commit提交记录,并且每次有commit id,有提交的时间及描述

    ** 你看到的一大串类似1094adb...的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了

    ** Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本

     

    2. git log --pretty=oneline 命令查看简洁版:

    四、版本回退

    1. 回退命令

    回退命令:git reset

    上一个版本:HEAD^

    上上一个版本:HEAD^^

    往上100个版本:写100个 ^ 数不过来,所以写成HEAD~100

    $ git reset --hard HEAD^
    HEAD is now at c6ddc13 two add
    
    $ cat newfile.txt
    test
    one
    two
    
    $ git log
    commit c6ddc13fb9e1d764d95d3cd5e92d02d0108c187c (HEAD -> master)
    Author: Asteven-zn <964038167@qq.com>
    Date:   Thu Apr 15 16:20:37 2021 +0800
    
        two add
    
    commit 72c6c812cc683ebff94b7d207071c19878692be3
    Author: Asteven-zn <964038167@qq.com>
    Date:   Thu Apr 15 16:19:01 2021 +0800
    
        one add
    
    commit 31e61e7bb130005eec23e8e04232f5289e19cea4 (origin/master)
    Author: Asteven-zn <964038167@qq.com>
    Date:   Thu Apr 15 15:07:02 2021 +0800
    
        repotest push file
    

    2. 找回某个版本

    通过上面的回退命令,我们已经回到了以前的版本,也可以回到回退前的版本或者某个版本,这个时候就要用到commit id了

    2.1 git reflog命令:记录每一次每一个操作,找回要切换的对应版本commit id

    2.2 通过上面命令,通过commit时的描述“three add”,找到了第三步commit id “0355e6b”

    2.3 于是就可以指定回到未来的某个版本

      

    四、git管理修改

    1. Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。

    2. 你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。

    3. 每次修改,需要用 git add 到暂存区,让后在commit提交到版本库,如果修改没有用git add 把文件存到暂存区,那即使执行了 git commit 命令,那修改也不会提交到版本库

    修改后的文件和版本库中的文件做对比,可以用如下命令:

    $ git diff HEAD -- filename
    

    五、撤销修改

    假设我们对工作区的文件进行了修改,但是修改后发现事错误的,可以用 git checkout 撤销修改。

    ** git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。

    撤销分了以下情况:

    1. 自修改后还没有被放到暂存区,现在撤销修改就回到和版本库一模一样的状态

    git checkout -- filename

    2. 已经添加到暂存区后,又作了修改,现在撤销修改就回到添加到暂存区后的状态。

    git checkout -- filename
    

    3. 已经添加到暂存区,在commit之前,可以把暂存区的修改撤销掉(unstage),重新放回工作区,再撤销工作区的修改

    git reset HEAD filename
    ## 要用git status查看一下,现在暂存区是干净的,工作区有修改,所以要执行撤销工作区的修改
    git checkout -- filename

    git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。 

    4. 假设不但改错了东西,还从暂存区提交到了版本库

    ** 可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。

    $ git reset --head HEAD^

    ** 一旦你把stupid boss提交推送到远程版本库,你就真的惨了……

    六、删除文件

    在Git中,删除也是一个修改操作

    1. 在工作区通过本地文件管理器删除文件

    $ rm test.txt

    ## 这只是删除了工作区的文件,此时工作区和版本库不一致了

    2. git status 命令查看哪些文件被删除了

    $ 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")
    

    3. 版本库删除文件

    $ git rm test.txt
    rm 'test.txt'
    
    $ git commit -m "remove test.txt"
    [master d46f35e] remove test.txt
     1 file changed, 1 deletion(-)
     delete mode 100644 test.txt 

    4. 恢复删除的文件

    另一种情况是删错了,因为删除也是修改,并且没有git add到版本库,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

    $ git checkout -- test.txt
    

    其实 git checkout 是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。 

    ** 从来没有被添加到版本库就被删除的文件,是无法恢复的!

  • 相关阅读:
    Codechef EDGEST 树套树 树状数组 线段树 LCA 卡常
    BZOJ4319 cerc2008 Suffix reconstruction 字符串 SA
    Codechef STMINCUT S-T Mincut (CodeChef May Challenge 2018) kruskal
    Codeforces 316G3 Good Substrings 字符串 SAM
    Codechef CHSIGN Change the Signs(May Challenge 2018) 动态规划
    BZOJ1396 识别子串 字符串 SAM 线段树
    CodeForces 516C Drazil and Park 线段树
    CodeForces 516B Drazil and Tiles 其他
    CodeForces 516A Drazil and Factorial 动态规划
    SPOJ LCS2
  • 原文地址:https://www.cnblogs.com/cloudhere/p/14663538.html
Copyright © 2020-2023  润新知