[译] 修改 Git 错误的高明方法

在软件开发的世界,有无穷无尽的方法可以把事情搞得一团糟:错删东西,代码混乱,提交信息写错了字,这些都仅仅是冰山一角。css

幸运的是,当咱们使用版本控制时,Git 提供给咱们了一个很完美的安全网。固然啦,不是咱俩须要它,由于咱们历来不犯错的,对吧?嗯嗯固然固然。可是为了他人的利益,咱们仍是一块儿来看看那些能够拯救咱们的 Git “撤回”工具。html

修改最后提交

搞砸一次提交很是容易。经典的场景包括:提交信息里写了错字。其余的?还有忘记将修改添加到临时区(staging area)。还有不少时候,咱们突然意识到代码中有错误 —— 可是固然是在点击了提交的确认键以后。前端

幸运的是,Git 让修改最后一次提交这件事出乎意料的简单。假如咱们刚刚确认了下面这个命令:android

git commit -m "Massage full of typohs"
复制代码

而且(好像这个拼写错误还没那么糟糕)假如咱们还忘记了添加某个已经修改的文件到临时区。咱们可使用以下两行命令修正这两个错误:ios

git add forgotten-changes.js
​​git commit --amend -m "A sensible message"
复制代码

神奇之处就在于 --amend​ 标识:当咱们跟着 commit 命令使用它的时候,Git 将会修改最后一次提交 —— 添加临时区的修改,并替换为新的说明信息。git

可是有一点须要提示:只能在没有推送到远端仓库的提交上使用 --amend。缘由是 Git 会用修改了的版本取代原来的,有错误的提交。这以后,看上去就像是原来的提交历来没有过。是的,这种方式用来处理错误很好,可是必须是当咱们尚未将过这个错误发布到远端仓库的时候。github

撤销本地修改

每一个人都有相似的经历:用了一早晨的时间寻找解决办法,可是最后只好认可这几个小时就是在浪费时间。必须从头开始了,而且要撤销大部分(或者全部)的代码。后端

可是这实际上是使用 Git 的初衷之一 —— 它能让你不用惧怕破坏了什么,而能够随意的尝试不一样的方法。安全

让咱们来看一个例子:bash

git status
​​  modified: about.html
​​  deleted:  imprint.html
​​  modified: index.html
复制代码

如今咱们假设,这些修改就是在前文说的浪费时间的场景。咱们须要撤销 about.html 的修改而且恢复已经删除的 imprint.html。咱们如今想要的就是,丢弃这些文件当前的更改 —— 可是保留 index.html 中的超赞的已经写好的代码。这时,git checkout​ 命令就可以有所帮助。可是,咱们须要像这样指明是哪些文件:

git checkout HEAD about.html imprint.html
复制代码

这行命令将 about.html 和 imprint.html 恢复到了最后提交的状态。哎,咱们能够不用熬夜来撤销它们了!

咱们能够更进一步,能够在一个修改过的文件里仅丢弃特定几行代码,而不是恢复整个文件!我必须认可,在命令行完成这项任务比较复杂,但使用 像 Tower 这样的 Git 桌面客户端 则是一个很好的方法:

在代码真的糟透了的时候,咱们就想掏出一把大枪:

git reset --hard HEAD
复制代码

此次咱们不是仅仅使用 checkout​ 恢复指定的文件,而是重置了全部修改过的副本。换句话说,reset 将全部项目文件恢复到了最后一次提交的状态。和 --amend 相似,使用 checkout​ 和 reset​ 的时候须要牢记:使用这些命令丢弃的本地修改没法恢复!它们还历来没有被提交到仓库中,因此不能被恢复也是合理的。请确认你真的想要删除它们,由于删除了就无法找回了!

撤销并还原更早的提交

不少状况下,咱们一段时间后才意识到代码的错误,而它已经被提交到仓库里好久了。

咱们如何才能删除掉这个错误的提交呢?答案是在大多数场景下,咱们其实不该该这样作。就算是“撤销”内容的时候,一般状况下 Git 并无真的删除数据。它经过添加新的数据来修正内容。用这个例子,咱们来看看它是如何工做的:

git revert 2b504bee
复制代码

经过对这个提交执行 git revert,咱们并无删除任何东西。相反的是:

Git 自动建立了一个新的提交来撤销错误提交所形成的修改。因此,若是咱们一开始有三个提交,而后试图修正中间的那个,那么咱们就会有四个提交了,新增的那个用来修改 revert 的目标提交。

恢复项目以前的版本

另外一个情境是咱们但愿恢复到项目以前的版本。咱们不是仅仅撤销提交历史中的一个特定的版本,而是想让时间倒流,直接退回到这个版本。 ​​
在下面的场景中,咱们声明“C2”以后的全部提交都是不须要的。咱们想要回到“C2”此次提交的状态,它以后的提交通通删除:

根据咱们已经讲述过的内容,我想你已经(至少部分)熟悉了所需的命令:

git reset --hard 2b504bee
复制代码

这个命令通知了 git reset 咱们想要返回的提交的 SHA-1 哈希值。C3 和 C4 提交将会从项目历史中消失。 ​​ 若是你在使用 Git 客户端,例如 Tower,提交项目的右键菜单中的 git revertgit reset 二者均可以使用:

删除提交,恢复删除的分支,处理冲突等等

固然,软件项目中还有不少其余会把事情搞砸的方式。可是幸运的是,Git 提供了不少工具来撤销错误。

若是你想要学习本篇文章提到的场景中的更多的内容,或者其余题目,例如如何在分支之间移动提交,删除旧提交,恢复删除的分支,或者优雅的处理冲突,看一下项目 "Git 急救包",它是我和其余一些 Tower 团队的人建立的。这是一份彻底免费的教程,包括了 17 个视频以及一份很方便的备忘单,你能够下载并保存到你的设备上。

同时,祝你撤销得愉快!

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索