注意事项 佩雷夫 :几天前,博客中为我们最喜欢的GitLab项目的工程师提供了一个很小但非常有用的注释,其中的说明可以帮助您节省时间和精力,以防在使用Git时出现各种问题。 对于经验丰富的用户来说,它们不太可能是新手,但肯定会有一些对他们有用的人。 在本材料的最后,我们从自己身上获得了一点好处。 祝你星期五愉快!我们都会犯错,尤其是在使用Git之类的复杂系统时。 但是请记住:Git发生了!
如果您只是刚开始使用Git,请在命令行上学习
使用它的
基础知识 。 在这里,我将讨论如何解决Git中最常见的六个错误。
1.糟糕...我在上次提交的消息中误认了
经过几个小时的编码,很容易在提交消息中犯错误。 幸运的是,这很容易解决:
git commit --amend
使用此命令,将打开一个文本编辑器,并允许您将消息更改为上一次提交。 没有人会知道您用三个“ ds”写了“ added”。
2.糟糕...我忘记了将文件添加到上一次提交
Git中另一个流行的错误是过于仓促的提交。 您是否忘记了添加文件,忘记了保存文件,还是应该做一些小的改动以使提交有意义? 您的朋友将会再次
--amend
。
添加丢失的文件并运行以下正确命令:
git add missed-file.txt git commit --amend
现在,您可以更正消息,或简单地将其保存为原始格式(添加文件)。
3.糟糕...我添加了一个不应在此存储库中的文件
但是,如果您遇到相反的情况怎么办? 如果您添加了不想提交的文件怎么办? 带有欺骗性的ENV文件,构建目录或照片,以及被误保存在错误目录中的猫...一切解决。
如果您只完成了文件的
阶段而尚未提交,则所有操作都可以通过简单地
重置所需文件(位于阶段)来完成:
git reset /assets/img/misty-and-pepper.jpg
如果您仍然提交更改,则需要执行额外的准备步骤:
git reset --soft HEAD~1 git reset /assets/img/misty-and-pepper.jpg rm /assets/img/misty-and-pepper.jpg git commit
提交将被回滚,图片将被删除,然后进行新的提交。
注意事项 佩雷夫 :如原始文章的注释中所述,也可以使用已经提到的--amend
解决此问题。 显然,在本段中,作者想展示还有什么方法可以更改提交历史记录以修复错误。4.糟糕...我已将更改提交给主
因此,您正在开发一个新功能,因此匆匆忙忙,却忘记为其创建新分支。 您已经提交了一堆文件,所有这些提交都在主数据库中。 幸运的是,GitLab
可以直接在master中
阻止 push'y。 因此,我们可以使用以下三个命令将所有必要的更改回滚到新分支:
注意 :请务必先提交或隐藏零,否则所有更改将全部丢失! git branch future-brunch git reset HEAD~ --hard git checkout future-brunch
将在master中创建一个新分支-将还原到更改之前的状态,然后使用所有更改
对新分支进行
检出 。
5.糟糕...我在分支名称中弄错了
最细心的人可能会在前面的示例中注意到分支名称中的错误。 快到下午三点了,我还没吃晚饭,所以我的饥饿感把新的分支称为“分支”。 好东西!

以与使用
mv命令重命名文件时相同的方式重命名此分支,即将其放置在具有正确名称的新位置:
git branch -m future-brunch feature-branch
如果您已经按下该分支,则需要执行几个附加步骤。 我们将从
远程删除旧分支,然后推送新分支:
git push origin --delete future-brunch git push origin feature-branch
注意事项 佩雷夫 :您仍然可以使用以下方法从远程删除分支: git push origin :future-brunch
6.糟糕...我又做了一次!
万一出错时的最后一条命令。 当您使用Stack Overflow积累并推出了许多解决方案后,存储库中的所有内容都变得比开始时还要糟糕。 我们所有人曾经都面临着类似的...
git reflog
显示您执行的所有操作的列表。 然后,您可以使用Git的神奇时光旅行功能,即 回到过去的任何时刻。 我必须指出,这是您的最后希望-在简单的情况下,您不应求助于此。 因此,要获取列表,请执行以下操作:
git reflog
我们的每个步骤都在Git的监视下进行。 在上述项目上运行团队,结果如下:
3ff8691 (HEAD -> feature-branch) HEAD@{0}: Branch: renamed refs/heads/future-brunch to refs/heads/feature-branch 3ff8691 (HEAD -> feature-branch) HEAD@{2}: checkout: moving from master to future-brunch 2b7e508 (master) HEAD@{3}: reset: moving to HEAD~ 3ff8691 (HEAD -> feature-branch) HEAD@{4}: commit: Adds the client logo 2b7e508 (master) HEAD@{5}: reset: moving to HEAD~1 37a632d HEAD@{6}: commit: Adds the client logo to the project 2b7e508 (master) HEAD@{7}: reset: moving to HEAD 2b7e508 (master) HEAD@{8}: commit (amend): Added contributing info to the site dfa27a2 HEAD@{9}: reset: moving to HEAD dfa27a2 HEAD@{10}: commit (amend): Added contributing info to the site 700d0b5 HEAD@{11}: commit: Addded contributing info to the site efba795 HEAD@{12}: commit (initial): Initial commit
注意最左边的列-这是索引。 如果要返回历史记录的任何点,请运行以下命令,将
{index}
替换为适当的值(例如
dfa27a2
):
git reset HEAD@{index}
因此,现在您有六种方法可以摆脱最常见的Gitfall
(双关语:陷阱将其翻译为“陷阱,错误”- 大约翻译 ) 。
翻译者的奖金
首先,对以上所有内容(第5段除外)提出宝贵意见。 请记住,这些操作会更改提交的历史记录,因此,只有在未将更改发送到
远程 (push'nut)的情况下,才应执行这些操作。 否则,旧的错误提交将已经在
远程分支上,您将不得不执行
git pull
(
合并将完成,然后尝试“清除”历史记录将导致更糟的后果),或者
git push --force
,在处理时会丢失数据几个人的分支...

现在-我们经验中的一些有用的补充:
- 如果(偶然地或不是偶然地)更改了分支并且需要返回到前一个分支,最快的方法是使用
git checkout -
。 - 如果您不小心将一个文件添加到提交中,但该文件不应添加到该位置,但尚未提交,请使用
git reset HEAD path/to/file
。 第3段描述了类似的情况,但实际上范围更广,因为 指的是提交中的任何不必要的更改(不只是额外文件的情况)。 - 最好不要提交太多,在将文件添加到提交时使用
-p
选项( git add -p
)。 这使您可以查看提交中的每个更改。 但是值得记住的是,它不会将未跟踪的文件添加到提交中-需要在没有此参数的情况下添加它们。 - 在2014年的文章“ Git教程:10个常见的Git问题以及如何解决它们 ”中可以找到许多好的建议(包括更复杂的建议)。 特别要注意
git revert
和git rebase -i
。
译者的PS
另请参阅我们的博客: