问题
1. 工作区撤销
- 如果你在工作区进行了很多的修改,突然被告知所有/部分文件的修改都是没用/不能提交的…如何将工作区的东西全部/部分文件丢弃回到上一个状态呢?
2. 结合工作区的撤销和暂存区对文件实现部分撤销
- 如果你在工作区对一个文件进行了大量的修改,突然被告知只有部分的修改是有效的,你要如何保留文件的部分修改,丢弃其他所有呢?
3. 暂存区撤销
Git中
git commit
不加-a
参数的时候,只会将暂存区中的东西提交到本地仓库!
- 如果撤销暂存区中所有变更/部分文件变更,将其变更丢弃回工作区呢?
- 如何撤销文件的部分变更呢(只是要丢弃要少部分)?
4. 本地仓库撤销
現在你的变更已经提交到本地仓库,正准备已十万火急速度将其提交到线上,一展威风的时候…被人告知,不用提交了,你做的东西都是没有用的或者需求变了,要重新做一些调整(⊙o⊙)…
- 如果是全部不要了…如何将本地仓库快速撤销至上一状态呢?
- 如果部分还是有用的…如何将本地仓库刚才的提交快速的撤销,并将方才的变更保留至暂存区呢?
5. 远程仓库撤销
项目上线了,突然…麻痹的,由于
最近一个提价
导致了生产线上出现了致命级问题,要将最后一个
提交回退!
- 如果只需要撤销远程上的某一个提交点?如何撤销呢?
方案:
1. 工作区撤销
- 工作区撤销命令:
git checkout [options] ./<files>
- 该操作的对象是已经被追踪的文件,对于未被追踪的文件直接使用
rm file1
即可
- 1-1.将工作区的东西全部或指定文件丢弃回到上一个状态
$ git checkout ./<file1 file2 ...>
2. 工作区部分撤销
- 2-1. 使用
git add -p
+git checkout file
对文件实现部分撤销git checkout <file>
只针对工作区已追踪文件进行撤销
- 2-2. 使用
git checkout -p
参数实现部分撤销正如
git add -p
交互式暂存一样,git checkout -p
也可以进行交互式撤销
3. 暂存区撤销 && 本地仓库撤销
暂存区与本地仓库的撤销命令都是通过:
git reset [options] commitID(默认HEAD) [./<files>]
- 3-1. 撤销暂存区中所有/部分文件变更至工作区
-
3-2. 撤销指定文件的部分暂存变更【撤销1、3变更暂存将其保留在工作区,保留2、4变更在暂存区】
-
3-3. 撤销回到指定状态,但将文件保留至工作区/暂存区
- 3-4. 撤销本地仓库回到指定状态且文件不做保留
5. 远程仓库撤销
- 一般来说:生产线上出现的问题都不单单仅是回滚一个提交点的就能解决的!
- 其次:如果回滚的节点不是最后一次的提交,即有可能会牵连出一系列的问题【例如:B提交中代码依赖了A提交,如果回滚了A没有回滚B,那么势必就会引发一些其他的问题】,当然回滚最后一个提交也有可能引发上述问题
- 所以:一般协同开发的时候,回滚都不会仅仅只回滚一个节点,而是按照提交顺序
倒序
回滚多个【所以此处我们也建议你尽可能一个提交节点只做一个小事或尽可能保证提交节点与节点之间的逻辑能解耦】 - 但是:之前已经说过了,推送到了远程的节点一般都是禁止往后退的…因此:我们只能通过新生成一个与指定节点完全相反的提交节点来达到回滚的目的【
以进为退
】
# 生成一个与指定commitID完全相反的提交节点
$ git revert commitID
实际操作中:通过这种上述方式的回滚操作是比较麻烦且容易出问题的,因此:通过直接切换部署目录软链来进行整体状态回滚的操作应该是居多和最保险的