git 版本控制与修改删除
版本控制
HEAD 指向的版本就是当前版本,因此,Git 允许我们在版本的历史之间穿梭,使用命令
git reset --hard commit_id
或git reset --hard HEAD^
等指针控制Git 必须知道当前版本是哪个版本,在 Git 中,用
HEAD
表示当前版本,也就是最新的提交1094adb...
(注意我的提交 ID 和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上 100 个版本写 100 个^比较容易数不过来,所以写成HEAD~100
。当然,也可以用版本号标识版本, 版本号没必要写全,前几位就可以了,Git 会自动去(当然也不能只写前一两位,因为 Git 可能会找到多个版本号,就无法确定是哪一个了)
git log
: 查看提交的历史记录,以便确定回退到哪个版本和 SVN 不一样,Git 的 commit id 不是 1,2,3……递增的数字,而是一个 SHA1 计算出来的一个非常大的数字,用十六进制表示.因为 Git 是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,避免冲突。
每提交一个新版本,实际上 Git 就会把它们自动串成一条时间线。如果使用可视化工具查看 Git 历史,就可以更清楚地看到提交历史的时间线:
每个版本输出一行简洁的信息
git log
默认是查看当前分支,显示从最近到最远的提交日志。每个版本输出一行简洁的信息
如果嫌输出信息太多,看得眼花缭乱的,加上
--oneline
为--pretty=oneline --abbrev-commit
的缩写指定输出最近的几个 commit
-<number>
或-n <number>
--all
查看所有分支的 commit 记录。branch_name
指定查看某个分支,直接加分支名 例如:git log --oneline dev
查看 dev 分支的 commit 历史。--graph
Draw a text-based graphical representation of the commit history on the left hand side of the output.gitk
通过 git 自带的图形化工具查看版本历史。 使用: 在仓库路径的终端下,输入
gitk
git reflog
查看 git 命令历史,以便确定要回到之前的那个版本。 当你回退到旧版本后,需要知道新版本的 commit_id 才能回退到新版本。大致有两种方式查看新版本
commit_id
- 如果你提交新版本的命令行结果还在,即:
git commit xx -m "xx"
的结果会返回 新版本commit_id
在你回退到旧版本之前,git log
也有commit_id
, 不过,回退之后就没了。 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 | git add 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 恢复,而是要用其他的办法