Git教程

本教程将帮助您了解Git的工作原理,以及如何使用Git在Github上提交您的提交。

备注

本教程是关于在bash/cmd中使用Git的,我们强烈推荐它,因为它更干净。GitHub是完全不同的东西,它是Web界面或应用程序。

如何安装Git

第一步是安装Git。假设您使用的是基于Debian的发行版,则可以执行以下操作:

$ sudo apt-get install git

要在Mac OS系统上安装Git,可以使用 homebrew 包管理器如下所示:

$ brew install git

或者,Git预装了 XCode (或其命令行工具)。您可以按如下方式直接安装命令行工具:

$ xcode-select --install

Coala入门

首先,您必须派生您要贡献的存储库。这基本上为您提供了存储库的克隆到您自己的存储库。您可以通过打开 this to fork the coala repositorythis to fork the coala-bears repository 然后点击右上角的“叉子”。

在本地机器上抓取Coala

现在,您应该将存储库克隆到本地计算机上,这样您就可以在本地访问所有代码,并开始修复问题!为此,您可以使用以下内容来克隆Coala或Coala-Bear存储库:

$ git clone -o upstream https://github.com/coala/coala

$ git clone -o upstream https://github.com/coala/coala-bears

备注

-o upstream 将原始Coala或Coala-Bear存储库的远程名称设置为 upstream .

上游 只是为了简单起见我们用了一个名字。你可以随心所欲地给它命名。

如果您不熟悉什么是遥控器,请不要担心。下一节将解释有关远程的更多信息。

现在您已经将所有代码放在本地机器上了!

开始工作

首先,我们来谈谈遥控器。为了与外部世界通信,git使用所谓的远程。这些存储库不同于本地磁盘上的存储库,您可以将您的更改推入(以便其他人可以看到它们)或从中拉出(以便您可以获取其他更改)。现在,您应该将您的叉子遥控器添加到本地计算机,这样您就可以 pullpush 你们的承诺。只需使用以下命令即可完成此操作:

$ git remote add myfork <your_fork_link>

备注

我的叉子 只是为了简单起见我们用了一个名字。你可以随心所欲地给它命名。

在开始工作之前,您应该知道的下一件事是如何检查您对项目和当前分支所做的更改。检查当前分支的能力也非常重要,您将在下一节中看到。检查此信息的命令为:

$ git status

在我们进入下一节之前,您需要了解一个非常重要的分支,称为MASTER。Master是Git在您克隆存储库时为您签出的默认分支。这是我们在科拉的政策,决不能在你的叉子的主分支上发展。这就是我们创建新分支的原因,它将我们引向下一个部分。

创建新分支机构

要开始处理问题,您首先需要创建一个新的分支,您将在其中工作。当您在分支的主分支上时,不要更改文件。如果您从您的fork的主分支提交一个拉请求,维护人员会认为您没有阅读本指南。Coala开发人员甚至可能拒绝您的工作(即使它是一个很好的补丁),因为您显示您没有检查我们的文档。您永远不应该在主分支上进行开发的原因是,您的分支的主分支应该始终与主存储库的主分支同步,如果它有新的提交,这将更具挑战性。这就是我们创建自己的分支机构的原因:

$ git checkout -b branchname

备注

checkout 将切换到新创建的分支。

-b 如果分支尚不存在,将创建新分支。

分支机构的一些示例命名约定:+IssueXXX+patchXXX+gh-XXX+问题名称的缩写形式(其中XXX是您的问题编号。)

出于本指南的目的,我们还建议将您的第一个分支命名为“My-First-Good-Pull-Request”。

检查您的工作

在问题被修复并且您已经对其进行了测试之后(测试是非常重要的!千万不要提交未经测试的更改),您应该检查您的进度。类型:

$ git status

它将让您了解当前修改了哪些文件,以及您在哪个分支上进行开发。

备注

小贴士:如果有什么东西你找不到,你可以随时使用:

$ git grep "syntax"

这将搜索整个存储库,并向您显示包含语法的文件。

参见

有关测试的更多信息,请查看 this link.

添加文件并提交

首先,确保你在正确的分支上,而不是在大师的基础上发展!如果您一直遵循本指南,并且这是您的第一个Pull请求,那么您应该在“My-First-Good-Pull-Request”分支上进行开发。您可以通过以下方式检查您的分支机构:

$ git status

现在,您可以将文件/文件夹添加到当前提交:

$ git add <file/folder_name>

执行此操作,直到添加了提交所需的所有文件。然后键入:

$ git commit

这将引导您进入文本编辑器。现在您需要编写提交消息。我们对编写提交消息非常严格,因为它们有助于维护Coala 清洁的稳定的 。提交消息通常由三个主要部分组成。他们之间应该有一条换行符。

  • 标题

    标头应该包含您已对其进行更改的文件的名称,后跟“:”、空格,然后是解释所做更改的简短标题。

    例子: .gitignore: Add a new Constants variable

  • 身体

    正文应该有一个简短的段落,简要描述所做的改变,以及为什么迫切需要这种改变的原因。最大长度为72个字符。

  • 正在修复的问题

    此部分通常有“FIXS<PROCESS_LINK>”,因此该问题在GitHub上被引用。

参见

有关编写提交消息的更多信息,请查看以下内容 link .

现在您的邮件已写入,您必须保存该文件。按Esc键退出插入模式,并保存文件(在Vim中,通过按Shift+Z两次即可完成)。

运行Coala

现在,您可以检查提交消息和代码格式是否符合社区指南。如果出了什么问题,科拉会告诉你的。如果Coala报告错误,持续集成(CI)将失败,这意味着我们无法继续合并您的修复/拉入请求。

$ coala

正在推送提交

在推送提交之前,通过运行以下命令确保您不会再次在主服务器上进行开发:

$ git status

现在,您需要将提交推到分叉。你要做的就是:

$ git push myfork

它很可能会向GitHub询问您的登录凭据。键入它们,您的提交将被推送到在线。

创建拉式请求

如果您已经做到了这一点,并且您还在使用您的“主”分支,那么我们肯定能够告诉您,您没有阅读过本文档。顽皮,顽皮,但如果您已经提交,仍然有一种方法可以修复您的更改。您可以运行以下命令,它将把您带到一个包含您提交的所有更改的新分支(注意:在“创建分支”一节中可以找到一些示例命名约定)。然后,要将fork的主分支设置回原始状态,请检查我们的 Common Git Issues section

$ git checkout -b <branchname>

现在,您希望将提交放到实际的主分支中。使您的更改可供项目的所有未来用户使用。为此,您必须创建一个Pull请求。要做到这一点,你必须在GitHub上,在你的分叉页面上。您应该将分支更改为您已处理并提交提交的分支。现在,您可以通过单击 New Pull Request Pull Request(拉取请求)选项卡中的按钮。

祝贺你! 您刚刚创建了第一个拉式请求!你真给力!

备注

如果您看到任何错误,如 1 commit ahead of the master branch 在发送拉取请求之前,您需要将本地fork与远程存储库同步。

有关同步的更多信息,请参阅 here .

跟进

现在,创建拉式请求后,有两种可能性:

  • 您的PR将被接受,并且您的提交将合并到主分支中-遗憾的是,这种情况很少在第一个Pull请求中发生

  • 您的公关将被拒绝。请购单被拒绝的情况有2种:

    • 测试失败

    • 审查者希望更改某些内容(这也会导致gitmate失败)

你的公关不太可能在第一次尝试就被接受--但别担心,这只是它的运作方式。它帮助我们维护Coala 清洁的稳定的 .

现在,如果您需要修改代码,只需使用以下命令再次编辑、添加并提交即可

$ git commit -a --amend

这将编辑您的最后一条提交消息。如果我们的审阅者认为您的提交消息没有问题,您只需像这样再次发送它即可。如果没有,请编辑并发送。现在您已经成功编辑了上次提交!

如果您需要调整基数,或者想要编辑您分支机构中较旧的提交,我们有一个令人惊叹的 tutorial that you can watch 了解它是如何工作的。

重新设置基数

随着人们在Coala上工作,将添加新的提交。这将导致您的本地分支与远程存储库不同步。要将更改与远程存储库同步,请在所需分支中运行以下命令:

备注

这假设遥控器 upstream 是位于https://github.com/coala/coala的原始Coala存储库(或其他,如Coala/Coala-Bear等), 不是你的叉子 .

如果您已按照本指南中概述的步骤进行操作并克隆了原始Coala存储库, upstream 应该参考一下。您可以毫无后顾之忧地继续进行下面的部分。

如果您对此不确定,请运行 git remote -v 检查哪个远程指向原始存储库并使用它,而不是 upstream 在下一节中。

$ git fetch upstream
$ git rebase upstream/master

这将从远程存储库获取提交,并将其合并到您当前正在工作的分支中,并将重新建立基础的分支之前的所有本地提交移动到该分支上历史记录的顶部。

备注

按照这些说明操作后,当您尝试推送到遥控器时,可能会出现快进错误。如果是这种情况,那么您将不得不强制推送,因为您正在尝试重写git提交历史。为此,请将 --force PUSH命令中的参数:

$ git push myfork --force

警告: 切勿强行推入主分支机构或任何不属于您的分支机构。

要验证是否已正确更改了基数,请转到分支机构的网页。如果上面说你的分支机构 n commits behind coala:master (或您贡献的任何回购),那么您还没有正确地调整基准。否则,你就可以走了!

挤压你的承诺

您可能有多个提交,并且您希望将它们压缩到一个提交中。您可以使用交互式Rebase工具将您的一系列提交压缩为一次提交。要压制您的提交,请运行以下命令:

$ git rebase -i master

备注

Master是提交的SHA1散列,您要在此之前挤压所有提交,并确保在MASTER分支上执行重定基操作。

编辑器将使用当前分支中的所有提交启动(忽略合并提交),这些提交位于给定的提交之后。将第一个保持为“Pick”,在第二个和随后的提交中使用“squash”。保存后,另一个编辑器将被激活,显示您想要压缩的所有提交消息。清理所有消息,并为单次提交添加要显示的新消息。

常见的Git问题

有时,您可以使用 git add -A 并将您不想要的文件添加到推送中(通常在重新建立基础之后),然后将其推送到遥控器。这里简要介绍了如何即使在推送到Remote之后也能从提交中删除(或恢复更改)特定文件。

在本地存储库中,要将文件恢复到上次提交之前的状态,请运行以下命令:

$ git checkout HEAD^ /path/to/file

现在,在恢复文件之后,通过运行以下命令更新上次提交:

$ git commit -a --amend

要将这些更改应用到远程,您需要强制更新分支:

$ git push -f myfork

备注

上面概述的过程仅通过一次提交来帮助回滚更改。上面提到的‘myfork’是您的派生存储库,您可以在其中推送提交。

这个 git checkout <revision sha> path/to/file 命令为您恢复文件中的更改提供了更大的灵活性,甚至比上次提交更早。通过将 HEAD^ 按特定项目的修订版号 HEAD 提交,您可以参考所需的文件修订版。

可能听起来有点吓人,但别担心,我们已经为您提供了一个示例。首先,您可以通过运行以下命令检查提交的修订号,文件在其中进行了修订:

$ git log /path/to/file

修订版本号可能如下所示 3cdc61015724f9965575ba954c8cd4232c8b42e4 现在,要将文件恢复到该修订版本,请运行以下命令:

$ git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /path/to/file.txt

现在,在文件恢复到所需的修订版本后,提交更改并(强制)推送到远程。

在重新布基时,您可能会遇到重新布基中途的冲突。有关如何解决MID-REBASE冲突的信息,请查看此 tutorial .

http://ohshitgit.com/ contains helpful Git snippets for recovering from various common Git issues. It is a great resource to check out when something has gone wrong.

如果在任何阶段您感到困惑或有问题,请不要关闭您的拉取请求。相反,请在GITER上联系我们,以便我们可以帮助您解决问题。

有用的Git命令

本节将简要说明您最有可能使用的其他一些Git命令,它们确实会让您的工作变得更容易。

$ git config

这个 git config 命令允许您从命令行配置Git安装(或单个存储库)。该命令可以定义从用户信息到首选项再到存储库行为的所有内容。

$ git log

这个 git log 命令显示提交的快照。它允许您列出项目历史记录、过滤,并搜索特定的更改。虽然git status允许您检查工作目录和临时区域,但git日志只对提交的历史记录进行操作。

$ git push --force myfork

虽然我们通常使用 git push myfork 要将提交推送到派生,在进一步编辑和处理提交之后,您需要使用 --force 参数以自动更新您的拉式请求。

$ git reset --hard

重置临时区域和工作目录以匹配最近的提交。除了取消转储更改之外, --hard flag告诉Git也覆盖工作目录中的所有更改。换句话说:这会删除所有未提交的更改,因此在使用它之前,请确保您确实想要丢弃您的本地开发。

$ git clean

这个 git clean 命令从您的工作目录中删除未跟踪的文件。这实际上是一个更方便的命令,因为查看哪些文件在git状态下未被跟踪并手动删除它们是微不足道的。与普通的rm命令一样, git clean 不可撤消,因此在运行它之前,请确保确实要删除未跟踪的文件。

$ git checkout <branch>

这个 git checkout 命令用于切换到存储库中的另一个分支。这里的<Branch>是您要切换到的分支的名称。

$ git rebase

重新建立基础是将分支移动到新的基础提交的过程。从内容的角度来看,重新建立基础实际上只是将分支从一个提交移动到另一个提交。但在内部,Git通过创建新的提交并将它们应用到指定的基数来实现这一点-它实际上是在重写您的项目历史。理解这一点非常重要,尽管分支看起来是一样的,但它是由全新的提交组成的。

$ git rebase -i

运行 git rebase 使用-i标志开始交互式的rebase会话。交互式重新基址不是盲目地将所有提交移动到新的基址,而是让您有机会在此过程中更改单个提交。这允许您通过删除、拆分和更改现有的一系列提交来清理历史记录。就像是 git commit --amend 服用类固醇。用法为 $ git rebase -i <base> 。将当前分支重新建立到<base>,但使用交互式重新建立基础会话。这将打开一个编辑器,您可以在其中为每个要重新建立基础的提交输入命令(如下所述)。这些命令确定单个提交将如何传输到新库。您还可以重新排序提交列表,以更改提交本身的顺序。

如果您想了解更多信息/命令,请使用您最喜欢的搜索引擎进行查找。Git在世界各地被广泛使用,有很多很好的教程和与Git相关的问答帖子。