Git发生了! 6个常见的Git错误以及如何修复



注意事项 佩雷夫 :几天前,博客中为我们最喜​​欢的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 revertgit rebase -i

译者的PS


另请参阅我们的博客:

Source: https://habr.com/ru/post/zh-CN419733/


All Articles