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 是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。 

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

原文地址:https://www.cnblogs.com/cloudhere/p/14663538.html