跳转至

版本管理

1.查看仓库当前状态

  • 如果你修改了添加到暂存区的文件,可以使用git status命令,查看仓库当前的状态
$ git status

On branch master # 表示你当前在 master 分支上工作
Changes not staged for commit: # 下面列出当前工作目录中,已修改、但尚未暂存(stage)的文件
  # 告诉你如何将文件添加到暂存区,以便下次提交(commit)
  (use "git add <file>..." to update what will be committed)
  # 告诉你如何撤销对文件的修改,使其回到最近一次提交的状态
  (use "git restore <file>..." to discard changes in working directory)
        modified:   test.txt  
        # 表示 test.txt 文件已被修改,但这些修改还没有被暂存(add)

# 表示没有暂存的文件可以提交
no changes added to commit (use "git add" and/or "git commit -a")
# 告诉你可以使用 git add 来暂存文件,或者使用 git commit -a 来提交所有已暂存和未暂存的修改

2.查看具体修改了什么内容

1.虽然Git告诉我们test.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的

  • 使用git diff这个命令来查看
$ git diff

# 下面信息表示 Git 正在比较 test.txt 文件的两个版本。a/ 表示旧版本,b/ 表示新版本
diff --git a/test.txt b/test.txt
# 显示了文件的索引哈希值,从 10b1e36 变更为 63c32f9。100644 是文件的权限模式,表示这是一个普通文件
index 10b1e36..63c32f9 100644
# 下面两行分别表示旧版本和新版本的文件路径
--- a/test.txt
+++ b/test.txt
# 这一行是 diff 的 "hunk" 头,它告诉你接下来的差异是在文件的哪个部分
# @@ 后面的数字表示旧文件中,差异行的起始和结束行号,以及新文件中,差异行的起始和结束行号
# 在这个例子中,差异发生在第1行到第3行
@@ -1,3 +1,3 @@
 aaaa # 这一行在两个版本中都存在,没有变化
 aaaa
-aaa  # 这一行以 - 开头,表示这一行在旧版本中存在,但在新版本中被删除了
+aaaaaaaaaaa # 这一行以 + 开头,表示这一行在新版本中被添加了,而在旧版本中不存在

2.当知道对test.txt作了什么修改后,再把它提交到仓库就放心多了

# 1.将文件添加到暂存区
git add test.txt  # 没有任何返回,说明添加成功

# 2.看一看仓库状态
git status

On branch master
Changes to be committed: # 这一行下面开始,列出当前已暂存(add),准备提交(commit)的文件
  (use "git restore --staged <file>..." to unstage)
        modified:   test.txt 
        # 表示 test.txt 文件已被修改,并且修改已经被暂存,准备在下次提交时包含在内

# 3.提交修改
git commit -m "add somethings"

[master 912f330] add somethings
 1 file changed, 1 insertion(+), 1 deletion(-)

# 4.提交后,再看看仓库的当前状态
git status

On branch master
nothing to commit, working tree clean # 当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的

3.查看历史提交记录

1.在实际工作中,我们脑子里不可能记得一个几千行的文件每次都改了什么内容

  • 所以在Git中,我们可以使用git log命令,查看文件提交的历史记录
$ git log

commit 65458a48e3605c91e785984f627cafab0c8aa302 (HEAD -> master) 
# 这是最新提交,提交的哈希值是 65458a48e3605c91e785984f627cafab0c8aa302 【版本号】
# (HEAD -> master) 表示当前的 HEAD 指针指向 master 分支
# 即 当前提交是 master 分支的最新提交(最新提交都在上面)
Author: wangshangjian <wangshangjian@webmail.hzau.edu.cn>
Date:   Sat Sep 14 21:00:43 2024 +0800

    add two somethings # 提交时的描述信息,描述了这次提交的内容

commit 912f330c6e70f7699b6caa7bf48afc04e0912da5
Author: wangshangjian <wangshangjian@webmail.hzau.edu.cn>
Date:   Sat Sep 14 20:58:29 2024 +0800

    add somethings

commit 3dc02bc88f232b4856779e49fdde90a601f6a191
Author: wangshangjian <wangshangjian@webmail.hzau.edu.cn>
Date:   Sat Sep 14 20:36:42 2024 +0800

    wrote a readme file

2.如果嫌输出信息太多,可以加上--pretty=oneline参数

$ git log --pretty=oneline

65458a48e3605c91e785984f627cafab0c8aa302 (HEAD -> master) add somethings
912f330c6e70f7699b6caa7bf48afc04e0912da5 add somethings
3dc02bc88f232b4856779e49fdde90a601f6a191 wrote a readme file

3.实际上,每提交一个新版本,Git就会把它们自动串成一条时间线

  • 如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线

4.版本回退

1.版本回退的前提,是Git必须知道当前版本是哪个版本

  • 在Git中,用HEAD表示当前版本
  • 上一个版本就是HEAD^
  • 上上一个版本就是HEAD^^
  • 当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

2.现在,我们要把当前版本,回退到上一个版本,就可以使用git reset命令

$ git reset --hard HEAD^

HEAD is now at 912f330 add somethings  # 回退成功

# --hard参数, 会回退到上个版本的已提交状态(commit)
# --soft参数, 会回退到上个版本的未提交状态
# --mixed参数,会回退到上个版本已添加但未提交的状态(add但未commit)
#  一般使用--hard就足够了

3.看看当前的历史版本库

  • 可以看到,已经回退成功了
$ git log

commit 912f330c6e70f7699b6caa7bf48afc04e0912da5 (HEAD -> master)
Author: wangshangjian <wangshangjian@webmail.hzau.edu.cn>
Date:   Sat Sep 14 20:58:29 2024 +0800

    add somethings

commit 3dc02bc88f232b4856779e49fdde90a601f6a191
Author: wangshangjian <wangshangjian@webmail.hzau.edu.cn>
Date:   Sat Sep 14 20:36:42 2024 +0800

    wrote a readme file

4.如果想回到,回退前的版本(即回到未来),就使用commit id(前提是你还记得)

$ git reset --hard 65458a # 版本号写前几位就行了

HEAD is now at 65458a4 add two somethings  # 回退成功!

5.如果记不住了commit id肿么办?Git提供了一个命令git reflog,用来记录你的每一次命令 - 可以用它获得commit id

$ git reflog
65458a4 (HEAD -> master) HEAD@{0}: reset: moving to 65458a
912f330 HEAD@{1}: reset: moving to HEAD^
65458a4 (HEAD -> master) HEAD@{2}: commit: add two somethings
912f330 HEAD@{3}: commit: add somethings
3dc02bc HEAD@{4}: commit (initial): wrote a readme file
本文阅读量  次
本站总访问量  次
Authors: wangshangjian