持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
Git 如何跟踪你的文件
使用 Git 时,有许多移动部件,有时我们会处理几个不同的文件。
为了让 Git 跟踪所有这些文件,它创建了一种称为安全哈希算法 (SHA) 的东西,它是一系列加密哈希函数,并将其分配给每个提交。这样可以更轻松地识别重复文件并为它们提供与原始文件相同的标识符,从而节省存储空间。
使用 SHA,我们可以引用 Git 中的任何内容,例如查看提交并恢复到它,或者只是标记它。
Git 树的终端图
除了初始提交之外的每个提交都有一个父提交,当你启动一个项目时,你的 HEAD 指向主分支或主分支上的最新提交。
这一切都是使用分配给提交的 SHA 编号来维护的。创建分支时,它会创建文件的单独副本。当你切换分支时,HEAD 会将其指向你切换到的分支上的最新提交。
被删除的分支被称为处于分离的 HEAD 或无头状态。如果我们有唯一的散列,我们可以访问它们,但是没有指向它们的 HEAD ——所以如果我们没有它们的散列,就无法访问它们。
我们还可以通过将它们作为单独的分支检出来保持对它们的访问。
使用 Git 时,我们经常为单独的任务创建单独的分支,例如处理新功能或错误修复。git branch你使用该命令创建分支。
git branch [branch name]
当我们从一个分支切换到另一个分支时,Git 不再有权访问前一个分支中的任何提交。因此,如果我们想恢复到另一个分支中的提交,我们必须切换到该分支或将当前分支重新定位到我们想要使用的另一个分支上。
稍后我将讨论变基,但首先,我想谈谈合并和合并冲突。
什么是 Git 合并,它是如何工作的?
当你在项目中为你正在处理的事情创建一个分支时,你通常不希望如果你搞砸了,你的其余工作会受到影响。因此,当你完成该任务时,你需要将其添加到你的主项目中。
最常见的方法是将分支合并到项目的主分支或主分支中。
有 3 种类型的合并:快进合并、三路合并和我上面简要提到的变基。
顾名思义,快进合并是一种快速简便的合并分支并继续处理项目的方法。它不需要任何额外的工作,并且你很少会遇到与它的合并冲突。
这是因为它所做的只是将其 HEAD 从主分支的当前提交移动到正在合并的分支的最新提交。这就像及时推进你的项目。
快进合并
快进合并在行动
另一方面,三向合并需要更多的工作,因为你要处理三个提交。
当你尝试合并到的分支位于你尝试合并的分支之前时,就会发生三向合并。例如,你创建一个分支来修复错误,同时,一位同事正在处理主分支。在你完成对 bug 的压缩之前,一个新的提交已经添加到主分支。
Git 将无法顺利地将你的分支集成到主分支中,因为主分支现在位于你的分支指向的提交之前。
所以它必须为它创建一个单独的提交,并将你的提交、主分支上的新提交以及它们都指向的提交(因为它们都有相同的祖先提交)合并到一个提交中,以便合并它们作为一个新的提交。
提示为 3-way 合并创建第三次提交
3路合并成功
最后一种方法是变基,将整个特性分支转移到主分支上。
合并没有的 rebase 的一个缺点是项目历史记录的丢失。当你将一个分支合并到另一个分支时,你仍然可以访问该分支,直到你其删除。但是,当你重新设置分支时,你将无法访问该分支的所有历史记录。这取决于你、(你的团队)和你的项目,这可能是好是坏。
重新定位概念
!屏幕截图 2021-10-25-at-12.59.33-PM
提示选择用于变基的提交
Feature-branch-3 狐狸
随着整个项目中发生的所有合并和变基,你一定会遇到合并冲突。
当你对不同分支上文件的相同位置进行更改时,会发生合并冲突。例如,你对正在处理的功能分支的第 10 行进行了更改,而另一个人也对主分支上的同一行进行了更改。
此时 Git 不知道要进行哪个更改,因此它会引发合并冲突并拒绝合并或变基,直到你手动解决冲突。
当发生合并冲突时,Git 会暂停合并并等待你解决冲突并继续合并。你可以运行git status命令来查看哪些文件已合并,哪些未合并。
你可以使用 Git 的冲突解决标记来解决冲突,当你打开冲突所在的文件时,这些标记如下所示:
上面的版本===是你当前签出的版本,这就是为什么它有 HEAD 指向它的原因。下面的版本是你要合并的分支。
为了解决冲突,你必须决定要离开哪个版本以及要删除哪个版本,或者你必须自己手动合并内容。选择后,你可以继续合并。