使用Git,10件你可能须要“反悔”的事

2021年09月16日 阅读数:2
这篇文章主要向大家介绍使用Git,10件你可能须要“反悔”的事,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云 DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师。
官方网站: devui.design
Ng组件库: ng-devui(欢迎Star)
官方交流群:添加 DevUI小助手(微信号:devui-official)进群

前言

Git是目前世界上最优秀最流行的分布式版本控制系统,也是程序员们平常使用最频繁的工具之一(几乎天天都须要使用它来对源代码进行版本管理)。css

使用Git的过程,不免因为手快或者别的什么缘由,须要对作过的事情进行“反悔”或者屡次“反悔”。不用担忧,Git强大到几乎任何操做都是能够“反悔”的,让咱们一块儿来看看吧。html

1.在未暂存前,撤销本地修改

在介绍Git“反悔”操做以前,先简单说起下Git的一些基础知识。前端

Git项目有3个区域:工做区、暂存区和Git仓库(分红本地仓库和远程仓库)。以下图:git

本地编写的代码,不执行任何git命令,处于工做区。程序员

执行git add命令时,会将工做区的文件标记为已暂存,保存在暂存区。github

执行git commit命令时,会将标记为已暂存的文件保存都本地Git仓库,并生成一个快照。segmentfault

在没有暂存以前(没有执行git add命令),咱们能够经过如下命令查看本地修改:tomcat

git diff

显示的格式以下图所示:微信

若是咱们不想要这些代码本地代码(好比一些临时的测试代码),能够经过如下命令一次性撤销全部本地修改:前端工程师

git checkout -- . 
注意:该命令不可二次“反悔”,本地操做一旦撤销,将没法经过Git找回。

撤销以后再次执行git diff命令将没有任何输出,表明没有文件在暂存区。

咱们也能够指定具体的文件路径,撤销该文件的修改:

git checkout -- [filename]

2.在暂存以后,撤销暂存区的修改

本地写完代码,提交到本地仓库以前,须要先将修改的文件添加到暂存区,执行如下命令将本地全部已修改的文件添加到暂存区(固然也能够指定具体的文件):

git add .

此时咱们执行git diff命令,将不会有任何输出(由于文件已被添加到暂存区),想要查看暂存区的修改,能够执行如下命令:

git diff --staged

看到的效果和以前为暂存前,经过git diff看到的如出一辙。

若是这时咱们想要一次性撤销暂存区的所有修改,能够执行如下命令(固然也能够撤销暂存区指定文件的修改):

git reset .

注意:

该命令能够二次“反悔”,经过git add .命令能够将文件再一次添加到暂存区。

这里的“撤销暂存区的修改”是指撤销git add .这个命令,回到执行git add .以前的状态,即已修改未暂存状态。

此时,若是执行git diff --staged命令,将没有任何输出,执行git diff命名将看到已修改未暂存状态的输出。

1和2的两个命令能够合并成一个:

git reset --hard


<=>


git reset .
git checkout -- 

即:若是已暂存,但未提交本地仓库以前,想把全部文件直接抛弃(而不是从暂存区删除),能够直接执行以上命令。

3.提交到本地仓库以后(但未推送到远程仓库),撤销本次提交

执行如下命令,能够将暂存区的全部文件保存到本地Git仓库,并生成文件快照(便于以前的回退等操做):

git commit -m "modify some files"

此时提交历史里面会有一条记录f8651ff(Commit ID):

若是咱们不想要此次修改的内容,有如下2种方法:

方法一

回到当前提交的父对象a18c6fa(即上一次提交,经过git log查看),就等于撤销了本次提交:

git checkout a18c6fa

执行git log命令,发现已经回到以前的提交:

方法二

重置以前的提交

git reset --hard HEAD~1

效果和方法一同样:

注意:该命令是能够二次“反悔”的,具体步骤以下:

1.找到被重置的提交 git reflog,发现是 f8651ff
2.使用reset回到该提交 git reset --hard f8651ff

4.修改提交

考虑如下场景:

本来打算修改两个文件,结果只提交了一个文件,但又不想生成两个提交记录(Commit ID),具体执行的命令以下:

git add src/app/app.component.html
git commit -m "add test block"
git log

这样其实只提交了app.component.html一个文件,不是咱们想要的。

能够经过如下命令“反悔”(添加遗漏文件,又不从新生成新的Commit ID):

git add src/app/app.component.css
git commit --amend

还有一种场景可能更加常见,没有遗漏的文件,只是提交信息里有一个单词写错了,可使用如下命令进行修补:

git commit --amend -m "add test container"
注意:--amend修补参数会将改变以前的Commit ID,但不会生成新的Commit ID。

5.撤销提交历史中的某一次指定的提交

第3小结提到回退最近一次提交的方法(使用git reset命令),该方法只能针对连续的提交,若是只想撤销提交历史中的某一次提交(好比:),该怎么办呢?

好比:Commit ID为711bb0b的提交,该次提交将标签的target属性由"_blank"改为了"_self"。

可使用如下命令撤销该次提交(将提交的内容“反操做”),并生成一个新的提交在最前面:

git revert 711bb0b

revert以后,会在提交历史的最前面生成一个新的Commit ID(1f49a42),该次提交将标签的target属性由"_self"改回了"_blank"。

6.合并出现冲突时,撤销合并操做

两个分支改了同一个文件的同一个地方,合并时将出现冲突:

若是不想解决冲突,想撤销这个合并,可使用如下命令:

git merge --abort

abort以后,将恢复合并以前的状态。

7.暂存区的文件加多了,想移除,又不想删掉本地的文件

git rm --cached src/test.pptx

8.分支重命名

git br -m [old_br] [new_br]

9.撤销变基操做

将 rebase_test 分支的修改变基到master上:

git co rebase_test
git rebase master

撤销的步骤以下:

1.使用 git reflog 命令找到变基前的提交 09b0adc
2.使用 git reset --hard 09b0adc 重置到该提交

10.以脚本方式改写提交

考虑如下场景,在一次很早的提交中,将一个储存密码的文件passwords.txt提交到了远程仓库,这时若是只是从远程仓库中删除该文件,别人依然能够经过提交历史找到这个文件。

所以咱们须要从每个快照中移除该密码文件,用如下命令就能够作到:

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD

该命令执行完会将提交历史中全部提交的passwords.txt文件完全删除,永远无法经过Git找回。

除了以上“反悔”操做,还有一个很强大的命令,也能够以某种形式对过去作过的事情进行“反悔”,那就是交互式变基:

git rebase -i

该命令很是强大,DevUI团队的少东以前专门写过一篇来介绍该命令,欢迎你们移步阅读:

关于Git rebase你必需要知道的几件事

若是发现文中有错误或者遗漏的地方,欢迎你们指正!

加入咱们

咱们是DevUI团队,欢迎来这里和咱们一块儿打造优雅高效的人机设计/研发体系。招聘邮箱:muyang2@huawei.com。

文/DevUI Kagol

往期文章推荐

《使用tomcat搭建https服务》

《Web界面深色模式和主题化开发》

《手把手教你搭建一个灰度发布环境》