在团队环境中开始使用Git

来源:互联网 发布:青岛网络干部学院错误 编辑:程序博客网 时间:2024/04/28 06:29

“分布式”的概念意味着存在许多独立版本的单个项目,每个都有自己的历史。因此,Git是一个工具,可以帮助您与地理分布的团队合作

我们讨论了如何使用Git在上一个教程中管理文件,但目的是熟悉git(add,commit,push)的概念。现在你知道Git在本地是如何工作的,你就可以开始使用更高级的功能了。

克隆

该过程的第一步是从远程资源获取代码(假设已安装Git)。remote指代存储库或项目的远程版本。我们首先使用命令克隆资源git clone

git clone https://github.com/sdaityari/my_git_project.git

可以从侧边栏中的GitHub存储库的主页获取克隆URL。成功克隆存储库后,将创建一个目录(默认情况下,它与项目名称相同)。另一个有趣的事实是,origin远程现在指向我克隆存储库的资源(在这种情况下,https://github.com/sdaityari/my_git_project.git)。

即使Git遵循分布式模型,通常维护一个包含稳定的,更新的代码的中央存储库。

您在克隆时应使用哪个协议?

请注意,https在本示例中,该存储库是通过协议克隆的其他流行的选择,你有sshgit

克隆git协议需要你使用看起来像的原点git://github.com/[username]/[repository]这不提供任何安全性,除了Git本身。它通常很快,但最大的缺点是无法push更改,因为它只提供只读访问。

如果使用https协议,您的连接将被加密。GitHub允许匿名拉https取公共存储库,但是推送任何代码,您的用户名和密码将被验证。GitHub建议使用https over ssh

ssh协议使用公共密钥认证这需要您与远程服务器建立连接ssh要设置使用的身份验证ssh,您需要生成您的公钥/私钥对。在Linux中,在终端中运行以下命令以生成密钥对。但是如果你使用GitHub桌面客户端,这个过程是由软件自动完成的,你会收到一封电子邮件,SSH密钥被添加到你的GitHub帐户。

ssh-keygen -t rsa -C "[email_address]"

注意:在这些代码示例中,我通常会在方括号中包含部分。这些括号中的部分将被替换为括号内的内容,但删除括号。

您可以选择提供每次尝试连接时都需要的密码。在我们的例子中,我们留空。您还可以指定可以保存密钥的文件。我们保留默认id_rsa

生成密钥对

公钥和私钥分别存储在id_rsa.pubid_rsa文件中。在GitHub的情况下,您需要将您的公钥的内容粘贴到您的配置文件中的“SSH”下。

要检查该过程是否已成功完成,您可以在github.com上与git用户建立连接。

ssh git@github.com

通过ssh连接到github

正如你可以看到,到GitHub的连接是成功的,但它被终止,因为GitHub不允许shell访问。这意味着您可以使用ssh协议拉或更改更改。

一个有趣的事实是,a remote包含协议。这意味着通过httpsssh协议与资源的连接需要作为单独的远程存储器存储。

分支

Git的最好的特性之一是分支。把分支当作你在代码中前进的路径。这些分支可以由树的分支可视化。我们的树类比失败的唯一的地方是Git也允许你合并分支。

如果你以前在其他版本控制系统中使用过分支,你需要清楚你的想法,因为这些概念有点不同。例如,如果你比较Subversion和Git,它们的合并机制是不同的

假设您正在进行聊天应用程序。在某一时刻,你决定你想要人们的快照出现在他们的名字旁边,但这个想法还没有被你的老板批准。您创建一个分支并处理您的想法,而旧功能在单独的分支中保持完整。如果你想展示你的旧工作,你可以切换到你的旧分支。如果您的想法获得批准,您可以将新分支与旧分支合并以进行更改。

要检查正在处理的分支和当前分支的列表,请运行以下命令。它显示存储库中的分支列表,对当前工作分支使用星号。

git branch

创建分支

Git提供了一个master分支,你默认工作。当创建分支时,您必须正确命名它们,就像函数或提交消息一样。要创建分支,请运行以下命令。

git branch [branch_name]

这将基于最后一次提交创建一个新分支,但仍保留在同一分支上。要切换到其他分支,请运行以下命令

git checkout [branch_name]

要创建一个新分支并立即切换到它,请使用:

git checkout -b [branch_name]

这将基于当前分支的最后一次提交创建一个新分支。如果要基于旧提交创建分支,则应该使用命令附加标识提交的散列。

git checkout -b [branch_name] [commit_hash]

分支模型

之前的一篇文章中,我谈到了在开源项目中所必须遵循的准则。每个新功能都必须建立在新的分支上,并且应该从该新分支提交拉取请求或补丁。master分支只能用于与项目的原始源进行同步。

组织使用许多不同的模型来管理他们的项目。这篇关于git分支的文章讨论了一个适合大多数组织的通用模型。

通过分支可视化进展

现在你知道如何创建分支,你必须想知道我们如何能够通过一个命令来掌握这个想法。Git的GUI客户端只需单击即可完成此操作,但您可以在终端中执行相同的操作。在我们的例子中,我们增加了一些提交给分公司- masternew_featureanother_feature

git log --graph --all

检查分支

使用git log显示项目的历史。--graph显示提交的方向,而--all显示所有分支。您可能希望添加--oneline以单行显示提交(当然没有其详细信息)。

合并分支

让我们来看看本教程最重要的部分:在Git中合并分支的能力。我们讨论的一个分支模型是所有的功能都是在单独的分支中开发的,并且具有期望结果的那些被合并master要做到这一点,你需要checkoutmaster分支合并feature与它的分支。

git checkout mastergit merge [branch_name]

合并冲突

然而,在我们的例子中,我们看到一个冲突已经提出。为什么会这样呢?在两个分支中的同一文件中进行了更改,Git无法确定要保留哪些更改,从而在过程中引起冲突。我们将在本教程的后面看到如何解决冲突。

与Git协作

Git的初学者帖子,我们结束了一个git push同步我们的代码在GitHub。因此,您必须知道,为了从本地机器有效地发送代码到另一个remote,您使用git push命令。进行推送的不同方式如下。

git pushgit push [remote]git push [remote] [branch]git push [remote] [local_branch]:[remote_branch]

第一个命令将代码发送到origin远程的当前分支当指定远程名称时,来自当前活动分支的代码将通过远程计算机上的相同名称推送到分支。或者,您可以通过遥控器上的不同名称从本地分支推送到分支。

如果你喜欢最后一个命令push,有一个技巧,删除一个分支在远程。如果你提供一个空[local_branch],它将删除remote_branch在服务器上。它看起来像这样:

git push [remote] :[remote_branch]

push遥控器上并不总是接受虽然。采取以下情况:

拒绝推

“非快进”分支指的是远程分支的提示处的提交与本地系统上的任何提交不匹配的事实。这意味着远程分支已经更改,因为我上次同步它。

在这种情况下,我需要从远程分支,更新我的本地分支,然后推我的更改。一般来说,在推送之前总是拉动是好的习惯。语法与push对等体完全相同。

git pull --rebase [remote] [branch]

或者,有些人做一个git fetch跟随git merge而不是一个git pull基本上,拉取一个fetch然后合并--rebase还应该使用A ,因为它首先将更改拉到您的分支,然后将您的工作放在它。这是可取的,因为所有可能的冲突都是基于您所做的更改而提出的,因此您可以决定要保留什么和不保留什么。

作为另一种可能性,不给每个贡献者push访问其存储库的组织通过电子邮件工作。在这种情况下,您可以diff通过比较提交或分支之间的差异来创建文件。git diff命令显示差异,更改存储在文件中,然后邮寄到组织。这些差异文件通常被称为“补丁”。

git diff [branch1] [branch2] > [file_name]

生成分支之间的diff

生成的diff文件的部分在这篇文章中详细解释如果您有一个diff文件,并且您想要应用补丁,您只需使用以下命令。

git apply [file_name]

解决冲突

解决冲突在任何Git工作流中都很重要。很自然地,许多人在同一个文件上工作,并且服务器自上次提取更改以来有该文件的较新版本。当您尝试合并对同一文件进行更改的两个分支时,也会出现冲突。有时Git试图应用某些算法来查看它是否可以解决冲突本身,但它经常引发一个红色标志,以确保没有数据丢失。

当我们试图合并我们的分支时,我们注意到发生冲突。让我们看看我们如何能够解决它。A git status显示你是什么导致冲突。

文件导致冲突

然后,我们可以使用文本编辑器(如VIM)打开标识的文件,以查看有什么错误。文件的内容如下所示:

文件内容导致冲突

仔细看看文件。注意Git插入的三行。

<<<<<<<< HEAD......========......>>>>>>>> another_feature

这意味着很简单。<<<<<<<< HEAD之间的代码行是========您当前分支的一部分,而在========之间>>>>>>>> another_feature的代码存在于您尝试合并的分支中。你需要做的是删除这三条标记线,并编辑它们之间的内容到你想要的东西。在我们的例子中,让我们保留所有的信息,所以结束文件将看起来像这样。

虽然我们保留所有内容在两个块内,您可以删除所有内容,保留一些内容,或完全在他们的地方写一些其他解决冲突。

修复冲突

这种冲突在我们的情况下很简单。在更复杂的项目中,可能有很多导致冲突的实例,冲突文件中包含上面显示的许多行实例。解决相当复杂的冲突的过程保持不变:通过a检查受影响的文件git status,打开每个文件,并搜索的出现HEAD

当从遥控器拉动时也可能发生冲突。在这种情况下,最后一行将读取,>>>>>>>> [commit_hash]而不是>>>>>>>> [branch_name][commit_hash]提交的识别哈希。

结论

Git在开发者社区很受欢迎,但批评者经常将其与瑞士军刀进行比较。的确,Git提供了很多功能。但是一旦你了解基本知识,他们就非常直观地使用。让我们希望本教程可以帮助您以一种允许您在团队环境中贡献的方式开始使用Git。

0 0
原创粉丝点击