版本控制

  1. HEAD 指向的版本就是当前版本,因此,Git 允许我们在版本的历史之间穿梭,使用命令 git reset --hard commit_idgit reset --hard HEAD^等指针控制

    Git 必须知道当前版本是哪个版本,在 Git 中,用 HEAD 表示当前版本,也就是最新的提交1094adb...(注意我的提交 ID 和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是 HEAD^^,当然往上 100 个版本写 100 个^比较容易数不过来,所以写成 HEAD~100

    当然,也可以用版本号标识版本, 版本号没必要写全,前几位就可以了,Git 会自动去(当然也不能只写前一两位,因为 Git 可能会找到多个版本号,就无法确定是哪一个了)

  2. git log : 查看提交的历史记录,以便确定回退到哪个版本

    和 SVN 不一样,Git 的 commit id 不是 1,2,3……递增的数字,而是一个 SHA1 计算出来的一个非常大的数字,用十六进制表示.因为 Git 是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,避免冲突。

    每提交一个新版本,实际上 Git 就会把它们自动串成一条时间线。如果使用可视化工具查看 Git 历史,就可以更清楚地看到提交历史的时间线:

    1. 每个版本输出一行简洁的信息 git log 默认是查看当前分支,显示从最近到最远的提交日志。

    2. 每个版本输出一行简洁的信息

      如果嫌输出信息太多,看得眼花缭乱的,加上--oneline--pretty=oneline --abbrev-commit 的缩写

    3. 指定输出最近的几个 commit -<number>-n <number>

    4. --all 查看所有分支的 commit 记录。

    5. branch_name 指定查看某个分支,直接加分支名 例如: git log --oneline dev 查看 dev 分支的 commit 历史。

    6. --graph Draw a text-based graphical representation of the commit history on the left hand side of the output.

    7. gitk

      通过 git 自带的图形化工具查看版本历史。 使用: 在仓库路径的终端下,输入 gitk

  3. git reflog 查看 git 命令历史,以便确定要回到之前的那个版本。 当你回退到旧版本后,需要知道新版本的 commit_id 才能回退到新版本。

    大致有两种方式查看新版本 commit_id

    1. 如果你提交新版本的命令行结果还在,即: git commit xx -m "xx" 的结果会返回 新版本 commit_id 在你回退到旧版本之前,git log 也有 commit_id, 不过,回退之后就没了。
    2. git reflog 查看 git 命令历史,有移动指针记录以及在每行开头有每次的当前版本的版本号(commit_id)

管理修改

为什么 Git 比其他版本控制系统设计得优秀,因为 Git 跟踪并管理的是修改,而非文件。 什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。

第一次修改 ->git add -> 第二次修改 -> git add -> git commit 第一次修改 -> 第二次修改 -> git add-> git add -> git commit

每次修改,如果不用 git add 到暂存区,那就不会加入到 commit 中

小结:

场景 1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git restore <filename>

场景 2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令 git restore --staged <file>,就回到了场景 1,第二步按场景 1 操作。

场景 3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

重命名文件

方法一:(推荐) git mv filename_old filename_new

方法二:(不推荐,但是要是不小心误操作了,我们要知道如何处理) 若不小心进行了: mv filename_old filename_new, 然后想将变更提交至 stage 时,有以下几种操作: 1. 使用 git add-A 选项 git add -A filename_old filename_new 在前面我们讲了 git add -A 如果不加 <pathspec> 则会将所有变更(新增文件,修改,删除)都会提交至 stage。而当我们指定 <pathspec> 时,就只将对该文件(们)的所有变更(新增文件,修改,删除)提交至 stage。 2. 一步步来

1
2
git add filename_new
git rm filename_new

先了解一下,git reset --hard 命令,方便上面功能的测试。 作用: 彻底回退到某个版本,本地的源码(working directory、stage)也会变为上一个版本的内容,此命令慎用!

删除文件

当你要删除文件的时候,可以采用命令:rm test.txt

这个时候(也就是说这个时候只执行了 rm test.txt)有两种情况

第一种情况: 的确要把 test.txt 删掉,那么可以执行 git rm test.txt 删除暂存区的修改git commit -m "remove test.txt" 提交到仓库,然后文件就被彻底删除了

第二种情况: 删错文件了,不应该删 test.txt,注意这时只执行了 rm test.txt,还没有提交,所以可以执行 git restore test.txt 将文件恢复。

并不是说执行完 git commit -m "remove test.txt" 后还能用 restore 恢复,commit 之后版本库里的文件也没了,自然没办法用 restore 恢复,而是要用其他的办法