DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud渠道和华为内部数个中后台体系,服务于设计师和前端工程师。
官方网站:devui.design
Ng组件库:ng-devui(欢迎Star)
官方沟通群H d =:增加 DevUI小~ A Y b o帮手(微信号:devui-official)进群

前言

GitS z } % W A是现在世界上最优秀最盛行的分布式版别控制体系,也是程序员们日常运用最频繁的工具之一(简直每天都需求运用它来~ { h @ ; R H i G对源代码i 1 I 7 D进行版别管理)。

运用Git的过程,不免由于手快或许其他什么原因,需求对做过的事情进行“反悔”或许屡次“反悔”N l 8 &。不用担心,Git强 # U S 6 B 壮到简直任何操作都是能够“反悔”的,让咱们一同来看= s @ * g N [ 4 g看吧。

1.在未暂存前,吊销本% s k O J地修正

在介绍Git“反悔”操作之前,先简略提及下Git的一些U W & [ q基础知识。

Git项目有3个区域:作业区、暂存区和Git库房(分红本地库房和长途库房)。如下图:

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

本地s x A E编写的代码,不履行任何git指令s – y + 5 H,处于作业区。

履行git add指令时,会将作业区的文件标记{ & $ g } 5 H为已暂存,保存在暂存区。

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

在没有暂存之前(没有X F $ X履行git add指令),咱们能够经过以下指令检查本地修正:

git diff

显示的格局如下图所示:B t _ ]

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

假如咱们不想要这些代码本地代码(比如一些临时的测试代码),能够经过以@ 0 = M d A u e下指令一次性吊销一切本地修正:

git checkout -- . 

留意:该指令不行二次“反悔”,本地操作一旦吊销,将无法经过Git找回。

吊销之后再次履行git diff指令将没有任何输出,代表没有文件在暂存区。

咱们也能够指定详细的文件* – &路径,吊销该文件的修正:

gi_ 8 ; 8 _ { g M 3t checkour : y $ ? { Jt -- [filename]

2.在暂存之后,吊销暂存区的修正

本地写完代码,提交到本地库房之前,需求先将修正的文件增加到暂存区,履行以下/ P Y ! } = U C指令将本地一切已修正的文件增加到暂存区(当然也能够指定详细的文件):

git add .

此刻咱们履行git diff指令,将不会有任何输出(由于文件已被增加到暂存区),想要检查暂存区的修正,能够履行以下指令:

git diff$ & X w P --staged

看到的作用和之前为暂存前,经过git diff看到的一模一样。

假如这时咱们想要一次性吊销暂f O $ * n存区的全部修正,能够履行以下指令(当然也能够吊销暂存区指定文件的修正):

git reset .

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

留意:

该指令能够二次“反悔”,经过git add .指$ b @ d M y v p令能够将文件再一次增加到暂存区。

这儿的“吊销暂存区的修正”是指吊销git add .这个指x . K ~ 4 u P令,回到履行git add .之前的状况,即已修正未暂存状况。

此刻,假如履行git diff --stag} ) %ed指令,将没有任何输出,履行git diff命名将看到已修正未暂存状况的输出。

1和2的两个指令能够兼并成一个:

git reset -M $ b t f 9-hard
<=>
git reset .
git checkout -- 

即:假如已暂存,但未提交本地库房之前,想把一切文件直接扔掉(而不是从暂存区删去),能够直接履行以上指令。

3.提交到本地库房之后(但未推送到长途库房),吊销本次v w 5 f : g / 8 j提交

履行以下指令,能够将暂存区的一切– l w J文件保存] [ 6 d到本地Git库房,并生成文件快照(} U w便于之前的回退等操作):

git commit -m "modify some fil; W N f , R 9 k pes"

此刻提交前史里面会有一条记载f4 W j 9 ^ { V 38651ff(Commit ID):

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

假如咱们不想要这次修正的内容,有以下2种办P X r法:

办法一

回到当前提交的父目标a18c6fa(即上一次提交,经过git log检查),就等于吊销了本次提交:

gi[  %t checkout a18c6fa

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

履行git log指令,发现现已回到之前的提交:

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

办法二

重置之前的提交

git reset --hard HEAD~1

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

作用和办法一一样:

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

留意:该指令是能够二次“反悔”的,详细过程如下:

1.找到被重置的提交 git reflog,发现是 f8651ff
2.运用reset回到该提交T = H git resW ^ $ pet --hard f8651ff

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

4.修正提交

考虑以下场景:

原本打算修正两个文件,结果只提交了一个文件,但又不想生成两个提交记载(Commit ID),详细履行的指令如下:

git add src/app/app.component.html
git commit -m "add tes@ x D 7 F J N Ut block"
git log

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

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

能够经过以下指令“反悔”(增加遗漏文件,又不重新生成新的Commil f M 2 5 ! wt ID):x Y S P e / K 2 0

ge d a z .it add src/app/app.component.css
git commit --amend

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

还有一种场景或许更加常见,没有遗漏的文件,仅仅提交信息里有一个单词写错了,能够运用以下指令进行修补:

git commit --amend -m "add test container"

留意:–amend修补参数会将改变之前的Commit ID,但不会生成新的Commit ID。

5.吊销提交前史中的某一次指定的提交

第3小结提到回退最近一次提交的办法(运用git reset指令),该办法只能针对连续的提交,假如只想吊销提交前史中的某一次提交E K n N F x $ ` ^(比如:),该怎么办呢?

比如:Commit ID为711bb0b的提交,该次提交将<a>标签. * / J m的target特点由”_blank”改成了”_self”。

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

能够运用以下指令吊销该次提交(将提交的内容“反操作”),并生成一个新的提交在最前面:

git revert 711bb0b

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

revert之后,会在提交前史的最前面生成一个新的Commit ID! . E R 5 c(1f49a42),该次提交将<a>标签的tD + 7arget特e H | #点由”_se} 5 o [ ~ B Y #lf”改回了”_blank”。

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

6.兼并呈现冲突时Y 8 : I g N ` v,吊销兼并操作

两个分支改了同一个文件的同一个当地,兼并时将呈现冲突:

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

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

假如不想解决冲突,想吊销这个兼并,能够运用以下指令:

git merge --abort

abort之后,将恢复兼并之前的状况。

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

git rm --cached src/test.pptx

8.分支重命名

git br -m [old_br] [new_br]

9.吊销变基操作

将 rebas{ $ Ve_tec 9 d N 5 Sst 分支的修正变基到master上:

git co rebase_test
git rebase master

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

吊销的过程如下:

1.运用H [ B K ~ p o n 5 git reflog 指令找到变基前的提交 09b0adcx . Z 7 n ~
2.运用 git reset --hard 09b0adcC $ q ^ . J b 重置到该提交

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

10.以脚本方法改写提交

考虑以下场景,在一次很早的提交中,将一个贮存暗码的文件passwords.txt提交到了长途库房,这时假如仅仅从长途d ; W c V [ y库房中删去该文件,别人Y B 8 Z *依然能够经过提交前史找到这个文件。

因而咱o v J f `们需求从每一D m 6 t N k D个快照中移除该暗码文件,用以下指令就能够做到:

gi$ $ s T ~ h Ut filter-branch --] Q ^ T L 4tree-filter 'rm -f passwords.txt' HEAD

该指令履行完会将提交前史中一切提交的passwords.txt文件彻底删去,永远无法经过Git找回。

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

git rebase( , U 1 ( ? -i

该指令非常强壮,DevUI团队的少东之前专门写过一篇来介绍该指令,欢迎咱们移步阅读:

关于GiP f ` o $ #t rebase你有必要要知道的几件事

假如1 c , a = ` m发现文中有过错或许遗漏的当地,欢迎咱们指正!

参加咱们

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

文/DevUI Kagol

往期文章引荐

《运用tomcat建立https服务》

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

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