学习 Git 基础知识 - 日常开发任务手册

欢迎来到我关于 Git 的综合指南,Git 是一种分布式版本控制系统,已经在软件开发中彻底改变了协作和代码管理方式。

无论你是经验丰富的开发者还是刚开始编程之旅的新手,理解 Git 对于正确掌控代码、高效管理项目和与他人合作至关重要。

在本教程中,我将带领你了解 Git 的基础知识,涵盖从基本工作流程到高级分支策略和重新基础技术的所有内容。

通过本指南,你将对 Git 的核心概念有扎实的理解,并且具备自信和良好的技能,能够在你的开发工作流程中有效地使用它。

(本文内容参考:java567.com)

先决条件:

你只需要带着一颗好奇和渴望学习的心态来参与。本指南是针对初学者精心设计的,因此不需要对版本控制系统或编程有任何先前的知识。无论你是完全的新手还是有一些编程经验,你都会发现本教程易于理解和跟随。

什么是Git?

Git 是一种分布式版本控制系统,能够帮助你和你的团队有效地进行协作,同时保持项目历史记录的安全。它就像是为你的代码建立了一个时间机器!

Git与其他版本控制系统的不同之处是什么?

概念上的差异:

让 Git 与其他工具有所区别的重要因素是它对数据的理解方式。Git 不是将文件的更改保存起来,而是将项目的数据视为一系列快照,也就是说,每当你进行更改并保存(提交)时,Git 就会在那一刻对所有文件进行快照。如果一个文件没有发生更改,Git 只会保留到前一个相同文件的链接。

本地操作:

使用 Git,你大部分操作都不需要连接服务器。因为你在电脑上拥有整个项目的历史记录,所以操作非常快速。你可以浏览项目历史记录或查看版本之间的变化,而不需要等待服务器。

数据完整性:

Git 确保没有任何东西会丢失或损坏。每个文件和目录都经过了校验和,Git 会知道是否发生了任何更改。

Git 使用 SHA-1 哈希,对于文件的每个版本都有一个唯一的代码。如果对内容进行了任何更改,甚至只是一个字符,都会导致不同的 SHA-1 哈希。

追加模型:

在 Git 中,几乎所有的操作都会向项目添加数据,这样做很难意外丢失信息。一旦提交了更改,它们就会被安全地存储。使用 Git 进行实验更加安全。

三种状态和基本Git工作流程

了解 Git 的三种状态 - 修改、暂存和提交 - 对于有效的版本控制至关重要:

  • 修改:对工作树中的文件进行的更改,但尚未提交。
  • 暂存:在暂存区中标记为下次提交的修改,以便包含在下次提交中。
  • 提交:永久存储在本地 Git 目录中的更改。

基本的 Git 工作流程:

  1. 在工作树中修改文件。
  2. 将要包含在下次提交中的更改暂存起来。
  3. 提交更改,将快照永久保存到 Git 目录中。

首次设置Git

首次设置Git涉及定制你的Git环境以满足你的偏好。但首先,你需要从Git - Downloads下载Git,或者使用Chocolatey软件包。然后,只需按照安装说明操作,你就可以开始了。

Git配置

我们使用git config工具来定制我们的Git环境。该工具允许我们检索和设置配置变量,这些变量决定了Git的操作方式。这些变量可以存储在三个不同的位置:

  1. 系统级配置:
    存储在/etc/gitconfig文件中,这些设置适用于系统上的所有用户和所有存储库。我们可以使用git config的–system选项与该文件进行交互。
  2. 用户特定配置:
    存储在/.gitconfig或/.config/git/config中,这些值是特定于你作为用户的。我们可以使用git config的–global选项与该文件进行交互,影响你在系统上操作的所有存储库。
  3. 存储库特定配置:
    存储在特定存储库内的.git/config文件中,这些设置会覆盖全局配置,并且仅适用于该存储库。

每个配置级别都会覆盖上一个级别的值。例如,.git/config中的值将覆盖~/.gitconfig中的值。

要查看所有配置设置及其来源/原始信息:

$ git config --list --show-origin
如何在Git中配置你的身份:

在Git中,身份用于正确归属提交。让我们设置你的用户名和电子邮件地址。

$ git config --global user.name "Your Name"
$ git config --global user.email "your.email@example.com"

如果需要为特定项目覆盖此设置,可以在设置值时省略–global选项,它们将仅适用于该特定存储库。

如何配置你的默认文本编辑器

在配置了你的身份之后,设置Git中的默认文本编辑器非常重要。当Git需要你输入消息时,例如写提交消息或解决合并冲突时,将使用此文本编辑器。

默认情况下,Git使用你系统的默认文本编辑器。但是,如果你更喜欢使用不同的文本编辑器,例如Emacs,你可以这样设置:

$ git config --global core.editor "emacs"

在Windows系统中,设置不同的文本编辑器需要指定其可执行文件的完整路径。例如,如果你想使用Notepad++,你可以使用如下命令:

$ git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

确保提供你文本编辑器的可执行文件的正确路径。

顺便说一下,这些 - “-multiInst -notabbar -nosession -noPlugin” - 是在Git启动Notepad++时用于自定义其行为的选项。

如何在Git中更改默认分支名称(可选):

默认情况下,使用git init初始化新存储库时,Git会创建一个名为master的分支。但是从Git版本2.28开始,你可以选择为初始分支设置不同的名称。

$ git config --global init.defaultBranch main

将默认分支名称全局更改为’main’

如何在Git中检查配置/设置:

你可以使用以下命令查看你的Git配置:

$ git config --list
$ git config user.name  # 要检查特定设置(例如,用户名):

git config --list命令会列出Git当前可以找到的所有配置设置。

如何在Git中获取帮助

有三种等效的方法可以获取任何Git命令的详细帮助:

  1. Git帮助命令:$ git help
  2. 使用–help选项:$ git --help
  3. 手册页(manpages):$ man git-

将替换为你需要帮助的任何命令。例如,要获取config命令的帮助,你可以输入:

$ git help config
或者
$ man git-config

这些命令也可以在离线时使用,非常方便。

如果你需要快速、简洁地了解Git命令的可用选项,可以使用-h选项:

$ git add -h    # 这将显示add命令的可用选项

如何获取Git存储库

要开始使用Git,你通常需要获取一个Git存储库。基本上有两种主要的获取方式:

1. 如何在现有目录中初始化存储库

打开终端或命令提示符。使用cd命令将目录更改为你项目的位置:cd /path/to/your/project。

一旦进入你的项目目录,通过运行以下命令初始化一个Git存储库:

$ git init

该命令会创建一个名为.git的新子目录,Git在其中存储所有必要的文件,用于你的Git存储库。在这一点上,你的项目文件还没有被跟踪。

现在,假设你有某些文件希望Git开始跟踪:

$ git add *.py        # 添加所有Python文件
$ git add README.md   # 添加README文件
$ git commit -m 'Initial commit'

git add将文件添加到暂存区,表示你希望将它们包含在下一次提交中,然后提交更改。-m标志允许你向提交添加描述性消息。

2. 如何克隆现有存储库

获取Git存储库的第二种方法是克隆一个现有的存储库。当你想要在已经存在于其他地方的项目上工作时(例如,你想要贡献的项目),这将非常有用。

注意:当你克隆一个存储库时,Git会检索服务器上几乎所有数据的完整副本。这包括项目历史记录中每个文件的每个版本。这意味着你将在本地机器上拥有存储库的完整副本。

要克隆一个存储库,使用git clone命令后跟存储库的URL。例如,要克隆grok-1存储库,你可以使用:

$ git clone https://github.com/xai-org/grok-1.git

这将创建一个名为grok-1的目录,初始化其中一个.git目录,并拉取该存储库的所有数据。

顺便说一句,.git只是一个约定,表示该URL指向一个Git存储库。你可以使用它,也可以不使用,都无所谓。

如果你想要克隆到具有不同名称的目录中,可以指定它。要将grok-1存储库克隆到名为"chatgpt"而不是"grok-1"的目录中,可以这样做:

$ git clone https://github.com/xai-org/grok-1.git chatgpt

Git提供了各种传输协议供你在克隆存储库时使用。上面的示例使用https://协议,但你也可能看到git://或user@server:path/to/repo.git,它们使用SSH传输协议。

如何记录对存储库的更改

现在你已经设置了一个Git存储库,你经常需要对你的存储库进行更改,并记录这些更改。这个过程涉及跟踪文件,暂存更改和提交快照。让我们探讨其中涉及的步骤:

在这里插入图片描述

1. 如何检查Git中文件的状态:

在使用Git存储库时,了解文件的状态非常重要。

Git将文件分为两种类型:已跟踪和未跟踪。已跟踪的文件是Git识别的文件,可能因为它们是上一个快照(提交)的一部分,或者已被暂存。未跟踪的文件是其他所有文件 - Git当前不在监视的文件。要检查存储库的状态:

$ git status

该命令提供有关当前分支、其同步状态以及你的文件状态的全面信息。

git status还提供了你可以采取的操作建议。例如,当文件被修改但未暂存时,git status建议使用git add 将其暂存。它还建议使用git checkout – 来丢弃工作目录中的更改。这些建议通过提供快速访问相关Git命令来简化你的工作流程。

此外,git status还提供了一种简短的状态模式(git status -s),使用符号(例如,M(修改)、A(添加)和??(未跟踪))来表示文件的状态。

2. 如何在Git中跟踪新文件

当你在项目中创建新文件时,Git最初将其视为未跟踪的。要开始跟踪新文件,你需要使用git add命令将其添加到暂存区。

例如,让我们为我们的项目创建一个名为index.html的新文件并将其添加到暂存区:

$ touch index.html
$ git add index.html

添加后,再次运行git status将显示index.html文件现在已被跟踪并准备提交。

3. 如何在Git中暂存修改过的文件

如果你修改了现有的已跟踪文件,你需要使用git add暂存更改。假设我们修改了一个名为styles.css的现有文件

$ vim styles.css

进行更改后,暂存文件:

$ git add styles.css

现在,当你检查状态时,你将看到已修改的文件和新文件都已准备好提交。

4. 如何在Git中忽略文件

通常,在项目中有一些不希望Git跟踪的文件或目录。这些可能包括日志文件、构建产物或敏感信息,例如本地环境设置(如*.env或config.json)。你可以使用.gitignore文件指定要忽略的这些文件。

创建一个.gitignore文件:

$ nano .gitignore

列出你想要忽略的文件或目录的模式:

$ echo '*.log' >> .gitignore
$ echo 'build/' >> .gitignore

在这里,我们告诉Git忽略所有扩展名为.log的文件和build/目录。

注意:在添加到.gitignore文件之前由Git跟踪的文件将保持跟踪状态。要删除它们,你需要手动使用Git命令取消跟踪。

以下是一些可以用来更有效地使用Git的模式。

  • 精确目标单个文件或文件扩展名:例如,test.txt仅忽略该特定文件,而*.log忽略所有以.log结尾的文件。
  • 通配符用于更广泛的匹配:星号()通配符匹配任意数量的字符。例如,.doc忽略所有以.doc扩展名的文件,不管它们的名称是什么。

5. 如何在Git中查看更改:

如果你想在提交之前查看你对文件所做的确切更改,你可以使用git diff命令。

要查看未暂存的更改:

$ git diff 

要查看暂存的更改:

$ git diff --cached README.md

git diff提供了实际修改的详细视图。使用git diff 来聚焦于特定文件内的更改。

6. 如何提交更改:

当你准备提交你的更改时,使用git commit命令。这将为你打开文本编辑器,让你提供提交消息。或者,你可以使用-m标志直接添加提交消息:

一旦你暂存了你想要包含在提交中的更改,你可以使用git commit提交它们

$ git commit -m "Your commit message here"

7. 如何在Git中删除文件:

如果需要从Git的跟踪中删除一个文件,你可以使用git rm。它会将文件从存储库和工作目录中删除。假设你想要删除一个名为temp.txt的文件:

$ git rm temp.txt

如果你只想从存储库中删除它但保留在工作目录中,可以使用–cached选项:

$ git rm --cached temp.txt

8. 如何在Git中移动(或重命名)文件:

Git不明确跟踪文件的移动。但是你可以使用git mv来重命名或移动你存储库中的文件。例如,将old_file.txt重命名为new_file.txt:

$ git mv old_file.txt new_file.txt

这个命令将暂存重命名,并将在下一次提交中反映出来。

它等价于手动移动文件,然后使用git rm删除旧文件,然后使用git add添加新文件。git mv基本上将这些步骤合并为一个单独的命令。

这些命令构成了进行更改、暂存和提交到Git存储库的基本工作流程。

如何在Git中查看提交历史

在创建多个提交或克隆存储库后,git log命令允许你查看提交历史。

默认情况下,它以逆时间顺序列出提交,显示每个提交的SHA-1校验和、作者的名称和电子邮件、日期和提交消息。现在让我们看看如何增强这个输出:

如何在Git中查看提交的差异:

要查看每个提交引入的差异,你可以使用-p或–patch选项:

$ git log -p -2    # -2用于查看最近两次提交中引入的差异

如何在Git中显示统计信息:

–stat选项为每个提交提供了汇总统计信息,包括修改的文件、添加/删除的行数和摘要。

$ git log --stat

如何自定义Git Log输出格式:

–pretty选项允许你改变日志输出格式。针对不同格式,提供了各种选项:

  • oneline:简洁,单行摘要每个提交。
  • short:默认格式,包含作者、日期和消息。
  • full:详细格式,包含提交哈希、作者、日期、消息和差异。
  • fuller:更详细的格式,包括完整文件路径。
  • format:使用格式说明符自定义输出。
$ git log --pretty=oneline

–pretty=format的有用格式说明符:

  • %h:缩写的提交哈希
  • %an:作者名称
  • %ae:作者电子邮件
  • %ad:作者日期
  • %s:主题(提交消息)
$ git log --pretty=format:"%h %an %ad %s"

ASCII图形:

使用–graph,你还可以可视化分支和合并历史。

$ git log --pretty=format:"%h %s" --graph

如何限制Git Log输出:

除了格式化选项之外,git log还提供了各种限制选项,以精细调整显示的提交历史。

  • -:仅显示最后的n次提交。
  • –since,–until:限制到指定日期之后/之前的提交。
  • –author:仅显示特定作者的提交。
  • –grep:通过提交消息中的关键字过滤提交。
  • -S:显示修改了

示例用法:查看自某个日期以来作者Abbey的最后3次提交,带有补丁详情:

$ git log --author="Abbey" --since="2024-01-01" -p -3

如何在Git中撤销操作

在Git中撤销更改是一个常见的需求,有几种选项可用于此目的。

如何在Git中撤销提交

如果你提交得太早或需要对最后一次提交进行额外的更改,可以使用以下命令:

$ git commit --amend

这将打开提交消息编辑器,允许你修改消息。如果自上次提交以来没有进行任何更改,则仅允许你编辑提交消息。

注意:只有在提交仍然是本地的并且尚未推送到远程时才能修改提交,以避免给协作者带来问题。

使用git reset取消暂存文件

要取消意外包含的文件的暂存状态,可以使用git reset HEAD 命令。例如:

$ git reset HEAD CONTRIBUTING.md 

文件将取消暂存,使你可以在不提交意外更改的情况下进行进一步的更改。

使用git checkout取消修改的文件

假设你对文件进行了一些修改,后来意识到你不想保留这些修改。使用git checkout – 来丢弃对文件的更改,并将其恢复到以前的状态。

$ git checkout -- CONTRIBUTING.md

这将用最后暂存或提交的版本替换修改后的文件。

使用git restore撤销操作

让我们探索由Git版本2.23.0引入的替代方法,即git restore,它是许多撤消操作的替代方法。

使用git restore取消暂存的文件

如果你意外地暂存了不打算提交的文件,可以使用git restore --staged 来取消暂存。

$ git restore --staged CONTRIBUTING.md   

文件将取消暂存,类似于git reset HEAD ,这样你就可以在不提交意外更改的情况下进行进一步的更改。

使用git restore取消修改的文件

要丢弃工作目录中对文件所做的更改,请使用git restore :

$ git restore CONTRIBUTING.md

类似于git checkout – ,此命令丢弃对指定文件所做的更改,将其恢复到上次提交的状态。

重要提示:使用git reset、git checkout --、git restore等命令时要小心,因为它们可能会永久丢弃本地更改。只有当你确定不需要更改且没有未保存的本地更改时,才使用这些命令。

替代方法:存档和分支是将更改暂时设置为一边而不完全丢弃它们的替代方法。如果对丢弃更改不确定,这些方法更安全。

如何在Git中使用远程仓库

远程仓库是你的项目在互联网或网络上托管的版本。与他人合作涉及管理这些远程仓库,包括添加、删除和检查它们。让我们学习如何有效地管理它们。

如何在Git中显示你的远程仓库

首先,让我们查看我们的项目配置了哪些远程服务器:

$ git remote

这个命令列出了我们指定的所有远程句柄的简称。例如,如果我们克隆了一个仓库,通常会看到origin,这是Git为我们从中克隆的服务器分配的默认名称。

添加 -v 选项会提供额外的细节,比如与每个远程关联的URL。

$ git remote -v

这将显示每个远程的获取和推送URL,让我们了解项目托管在哪里以及我们如何与之交互。

如何在Git中添加远程仓库

要显式添加一个新的远程仓库,使用 git remote add :

$ git remote add example https://github.com/example/example.git

在这里,我们添加了一个名为example的远程,使用了指定的URL。这允许我们在命令中使用example作为这个远程仓库的引用名称。

如何在Git中从远程仓库获取和拉取

要从远程仓库获取数据,我们使用git fetch命令后跟远程名称:

$ git fetch origin // 这里我们没有指定特定的分支。

它会将来自origin远程仓库的任何新更改下载到我们的本地仓库,使我们能够与最新的开发保持同步。

另外,如果我们想在单个步骤中从远程分支中获取并合并更改到我们当前的分支,我们可以使用git pull命令:

$ git pull origin master

在这里,我们明确地从origin远程仓库的master分支拉取更改到我们当前的分支中。

如何在Git中将更改推送到远程仓库

要与他人分享我们的工作,我们使用以下命令将更改推送到远程仓库:

$ git push origin main

在这个例子中,我们将我们的本地更改推送到origin远程仓库的主分支。

如何在Git中检查远程仓库

最后,我们可以检查一个远程仓库以收集关于它的更多信息:

$ git remote show origin

这个命令显示了详细信息,如获取和推送的URL、被跟踪的分支以及与origin远程仓库关联的本地分支配置。

如何在Git中重命名远程仓库

假设我们想要将远程的简称从example重命名为new-example:

$ git remote rename example new-example

如何在Git中删除远程仓库

如果由于某种原因我们不再需要一个远程仓库,并且想要将其从我们的项目中删除:

$ git remote remove new-example
或者
$ git remote rm new-example

删除后,远程跟踪分支和关联的配置设置也将被删除。

在Git中使用标签

在Git中,标签是一项基本功能,允许开发人员将存储库历史中的特定点标记为重要的。通常,标签用于表示发布点,例如v1.0、v2.0等。

如何列出Git中的现有标签

假设你正在处理一个具有多个发布版本的项目。要列出现有的标签:

$ git tag

此外,你可以使用 -l 或 --list 选项搜索匹配特定模式的标签。例如:

$ git tag -l "v2.0*"

这个命令将列出像v2.0、v2.0-beta等符合指定模式的标签。

如何在Git中创建标签

Git支持两种类型的标签:轻量标签和注释标签。

轻量标签

当你想要标记一个特定的提交而不添加任何额外信息时,请使用轻量标签。例如:

$ git tag v1.1-lw

要查看与此标签关联的提交信息,请使用:

$ git show v1.1-lw

轻量标签仅显示提交校验和。

注释标签

另一方面,注释标签包含额外的信息,如标记者信息、日期和标记消息。

创建注释标签涉及使用带有git tag命令的 -a 选项,以及一个标记消息。例如:

$ git tag -a v2.0 -m "Release version 2.0"

要查看有关此标签的详细信息,包括它指向的提交和标记消息,请使用:

$ git show v2.0

如何在Git中为旧提交打标签

有时,你可能会忘记给特定的提交打标签。不用担心,你可以稍后指定提交校验和来打标签。

例如:假设你忘记给ID为abcdefg的提交打标签。你可以这样给它打标签:

$ git tag -a v1.2 abcdefg

此命令将指定的提交标记为v1.2。

如何将标签推送到Git中的远程仓库

要将特定标签推送到远程服务器,你可以使用:

$ git push origin <tagname>

如果你有多个标签并想一次推送它们所有,你可以使用 --tags 选项:

$ git push origin --tags
如何在Git中删除标签

要在本地删除标签(从本地仓库中删除):

$ git tag -d <tagname>

例如,要删除名为v1.4-lw的轻量标签:

$ git tag -d v1.4-lw

另外,你可以以两种方式从远程服务器中删除标签:

  1. 使用带有refspec的git push命令:
$ git push origin :refs/tags/v1.1-lw

这个命令将什么也不推送(:)到远程标签v1.1-lw,从而有效地删除它。

  1. 使用git push的 --delete 选项:
$ git push origin --delete v1.1-lw

这个命令直接从远程服务器中删除标签v1.1-lw。

如何在Git中检出标签

要查看特定标签处文件的状态,你可以检出那个标签:

$ git checkout v2.0

这个命令将你的仓库置于“分离的 HEAD”状态,在这个状态下你可以查看文件但不能直接进行更改。

如果你需要在该标签处工作文件,最好创建一个新的分支:

$ git checkout -b v2.0-branch v2.0

现在你可以进行更改和提交,而不会改变原始标签。

Git别名

Git别名是你可以创建的简化和简化Git工作流程的快捷方式或自定义命令。

要创建Git别名,你使用git config命令并使用–global标志使别名在所有Git仓库中可用。

常见命令的基本别名

你可以为经常使用的Git命令创建别名,以使它们更容易记忆和输入。例如:

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit

现在,你可以使用更短的别名git co、git br和git ci分别代替完整的命令。

你还可以为你经常执行的操作或改进命令可读性创建自定义别名。例如:

$ git config --global alias.unstage 'reset HEAD --'

现在,你可以使用git unstage 代替git reset HEAD – 来取消暂存一个文件。

如何在Git中合并多个命令

别名也可以用于将多个Git命令组合成一个单独的别名。例如,让我们创建一个别名来暂存所有更改,然后使用一个命令提交它们:

$ git config --global alias.commitall '!git add -A && git commit'

现在,运行git commitall将暂存所有更改(git add -A)然后提交它们,节省了时间和击键。

Git 分支

Git 中的分支为管理项目的代码库提供了一种强大的方式,允许进行并行开发和实验,而不影响主要代码库。

Git 分支允许你偏离主要的开发线,独立地开发功能或修复问题,然后将你的更改合并回来。与许多其他版本控制系统不同,Git 的分支模型轻量且高效,使分支操作几乎是瞬间完成的。

Git 中的分支是什么?

分支是指向提交的轻量级、可移动的指针。默认分支名通常是 “master”,但它并不特殊 - 它就像任何其他分支一样。

创建和切换分支允许你同时处理不同的功能。

如何在 Git 中创建新分支:

当你想要开始开发一个新功能或尝试一个想法时,你可以在 Git 中创建一个新分支。这个新分支作为一个独立的开发线,允许你进行更改而不影响主分支。

$ git branch new_feature

这个命令创建了一个名为 ‘new-feature’ 的新分支,指向与当前分支相同的提交。分支可以共存,并且 Git 保持一个特殊的指针称为 HEAD,指示当前的分支。

理解分支

首先,让我们了解 Git 中的分支基础知识。当你初始化一个 Git 仓库时,你会从一个默认的分支开始,通常命名为 ‘master’ 或 ‘main’。分支本质上是指向提交的指针,使你能够独立地处理不同的功能或修复。

要查看仓库中的所有分支,使用命令:

$ git branch

这将显示一个分支列表,带有一个星号 (*) 表示当前检出的分支。要获取关于每个分支的最后一次提交等额外信息,可以使用:

$ git branch -v

如何在 Git 中切换到另一个分支:

要切换到一个现有的不同分支,使用 git checkout。

$ git checkout new_feature

这个命令将 ‘HEAD’ 指针切换到 ‘new-feature’ 分支,使其成为当前活动分支。

要在一次操作中创建并切换到一个新分支:

$ git checkout -b <newbranchname>

在 Git 2.23 版本之后,你可以使用 git switch 而不是 git checkout。

  • 切换到现有分支:git switch existing-branch。
  • 创建并切换到新分支:git switch -c new-branch。

如何在 Git 中可视化分支:

创建并切换分支后,你可以使用以下命令可视化分支结构:

$ git log --oneline --decorate --graph --all

这个命令会显示提交历史和分支指针的简洁且图形化的表示,让你看到分支随着时间的推移是如何分叉和合并的。

如何管理 Git 中的分支

如何管理已合并的分支

随着项目的发展,一旦分支的更改确定完成,你将把它们合并回主分支。要识别已合并的分支,执行:

$ git branch --merged

这个命令列出了已成功合并到当前分支的分支。这些分支通常可以安全删除,使用:

$ git branch -d branch_name

但是,对于包含未合并工作的分支,使用:

$ git branch --no-merged

删除这样的分支需要 ‘-D’ 标志:

$ git branch -D branch_name

这确保你不会意外丢失任何未合并的更改。

如何重命名分支

要重命名一个本地分支:

$ git branch --move old_branch_name new_branch_name

这个命令会在本地更新分支名称。为了在远程仓库中反映这个改变,推送重命名后的分支:

$ git push --set-upstream origin new_branch_name

使用以下命令验证更改:

$ git branch --all

确保在远程删除旧分支:

$ git push origin --delete old_branch_name

这确保了本地和远程仓库之间的一致性。

如何更改默认分支名称

重命名默认分支,通常是 ‘master’,需要谨慎和协调,因为它会影响项目集成和合作者。

$ git branch --move master main

重命名后,将更新后的分支推送到远程仓库:

$ git push --set-upstream origin main

确保记得更新依赖项、测试、脚本和仓库主机等所有引用和配置。完成后,删除远程上的旧 master 分支:

$ git push origin --delete master

这与我们在配置部分中讨论的 $ git config --global init.defaultBranch main 不同,有以下几点不同:

  • $ git branch --move master main:这个命令将现有分支名为 “master” 的分支重命名为 “main”,在当前仓库内进行的一种本地操作。它只影响该仓库。
  • $ git config --global init.defaultBranch main:这个命令在全局范围内设置新仓库的默认分支名称。它不会重命名现有分支,而是确保以后创建的新仓库将使用 “main” 而不是 “master” 作为默认分支名称。

附加资源:考虑查看官方 Git 资源,了解其信息丰富的可视化和图表,这些图表可以为你提供更多关于远程分支和分支管理概念的清晰度。

分支工作流程

让我们更详细地了解分支,并看一下在大型项目中常用的分支工作流程。

长期运行的分支:

在 Git 中,长期运行的分支是指在较长时间内保持开放状态的分支。

专题分支:

专题/功能分支是为特定功能或工作片段创建的短期分支。与长期运行的分支不同,专题分支在使用完毕后通常会被删除。

例如:假设一个团队维护两个长期运行的分支:master 和 develop。

  • master 分支仅包含稳定的代码,可能是已发布或将要发布的代码。
  • develop 分支充当正在进行开发的暂存区。虽然它可能不总是稳定的,但它作为新功能的测试场所。

开发人员将特性分支中的更改合并到 develop 分支进行测试。一旦特性经过彻底测试且稳定,它们就会合并到 master 分支中。

注意到变更如何在不同稳定性级别之间进展,从最不稳定的(专题分支)到更稳定的(例如 develop 分支),因为它们经过测试和完善,最终合并到最稳定的主分支。

这样保持了稳定代码和开发代码之间的清晰分隔,确保只有经过彻底测试的功能才能进入稳定发布。

分支最佳实践

  1. 创建描述性的分支名称:使用能够反映目的或正在开发功能的有意义的分支名称。
  2. 删除未使用的分支:一旦分支完成了它的任务,并且其中的更改已经合并到主分支中,考虑删除它,以保持仓库的清洁和可管理性。

Git 中的变基

在 Git 中,当你使用分支时,有两种主要的方法可以将一个分支的更改集成到另一个分支中:合并和变基。

与合并不同,合并可能会产生一个混乱的历史,带有多个合并提交,而变基产生一个线性的历史,使得更容易理解随时间进行的更改顺序。

基本变基示例:

假设你正在一个项目中使用两个分支:“feature” 和 “master”。你在 “feature” 分支上进行了一些提交,现在想要使用变基将这些更改集成到 “master” 分支中。

首先,切换到你的 “feature” 分支:

$ git checkout feature

然后,将你的 feature 分支变基到 master 分支上:

$ git rebase master

这个命令将你在 “feature” 分支上所做的所有提交/更改,应用到 “master” 分支上的最新提交之上,并逐个重放提交。

不仅可以变基到 master 分支,你也可以将一个专题分支变基到另一个专题分支上。例如:

假设你正在一个项目中使用两个功能分支:“frontend” 和 “backend”。你在 “frontend” 分支上做了一些提交,现在想要将这些更改集成到 “backend” 分支中。

这次让我们采用一个不同的方法 -
使用 git rebase 的 --onto 选项将 “frontend” 分支变基到 “backend” 分支上:

$ git rebase --onto backend frontend

完成变基后,切换回 “backend” 分支并执行快进合并:

$ git checkout backend
$ git merge frontend

现在,你的项目历史呈线性,反映了从 “frontend” 分支到 “backend” 分支中的更改顺序集成。

变基 vs 合并:哪个更好?

变基用例:
  • 适用于需要在主分支中进行清洁集成的专题分支。
  • 适用于重视干净提交历史的开源贡献项目。
合并用例:
  • 适用于合作环境中,项目开发过程的透明度至关重要。
  • 适用于需要保持准确历史记录的项目。

结论

本手册作为一个全面指南,帮助理解和利用 Git,这是一个广泛用于软件开发的强大版本控制系统。

从基本工作流程到设置仓库、打标签和分支远程仓库,我们已经学习了一套全面的功能,将有助于简化开发过程。

(本文内容参考:java567.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/519369.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode:1026. 节点与其祖先之间的最大差值(DFS Java)

目录 1026. 节点与其祖先之间的最大差值 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 1026. 节点与其祖先之间的最大差值 题目描述&#xff1a; 给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff…

2024 年最新使用 Wechaty 开源框架搭建部署微信机器人(微信群智能客服案例)

读取联系人信息 获取当前机器人账号全部联系人信息 bot.on(ready, async () > {console.log("机器人准备完毕&#xff01;&#xff01;&#xff01;")let contactList await bot.Contact.findAll()for (let index 0; index < contactList.length; index) {…

Redis各个方面入门详解

目录 一、Redis介绍 二、分布式缓存常见的技术选型方案 三、Redis 和 Memcached 的区别和共同点 四、缓存数据的处理流程 五、Redis作为缓存的好处 六、Redis 常见数据结构以及使用场景 七、Redis单线程模型 八、Redis 给缓存数据设置过期时间 九、Redis判断数据过期的…

云服务器ECS租用价格表报价——阿里云

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

Django环境搭建及测试

Django环境搭建及测试 一、安装 Python二、安装 Django三、终端命令创建 Django 项目四、运行 Django 项目五、访问 Django 网站 一、安装 Python 首先确保你的电脑上安装了 Python。 Python官网点击直达 官网下载后双击即可安装 第一个相当于快速安装&#xff0c;第二个则是…

Linux之shell脚本编辑工具awk

华子目录 概念工作流程工作图流程&#xff08;按行处理&#xff09; awk程序执行方式1.通过命令行执行awk程序实例 2.awk命令调用脚本执行实例 3.直接使用awk脚本文件调用实例 awk命令的基本语法格式BEGIN模式与END模式实例awk的输出 记录和域&#xff08;记录表示数据行&#…

了解强化学习算法 PPO

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 介绍&#xff1a; PPO 算法&#xff0c;即 Proximal Policy Optimization&#xff08;近端策略优化&#xff09;&#xff0c;是一种强化学习算法。它的主要目的是改进策略梯度方法&#xff0c;使得训练…

真--个人收款系统方案

此文主要说明方案&#xff0c;无代码部分 前言: 有个个人项目需要接入vip系统&#xff0c;我们发现微信、支付宝的官方API主要服务商户&#xff0c;而市面上的“个人收款系统”也往往不符合我们的需求。不过&#xff0c;每次支付时通知栏的信息给了我灵感。走投无路&#xff0…

Transformer模型-Normalization归一化的简明介绍

背景 一般而言&#xff0c;Normalization归一化是将特征转换为可比较尺度的过程。有许多方法可以对特征进行归一化 例如&#xff1a;最小-最大特征缩放 最小-最大特征缩放将值转换到[0,1]的范围内。这也被称为基于单位的归一化。可以使用以下方程进行计算&#xff1a; 该方程…

Qt+OpenGL-part5

2-1QT UI调用OpenGL控件功能_哔哩哔哩_bilibili 注意析构问题。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>namespace Ui { class MainWindow; }class MainWindow : public QMainWindow {Q_OBJECTpublic:explicit MainWindow(QWidget *parent …

simulink,stm32f103,新建工程实现led闪烁

1. 打开stm32cubeMX&#xff0c;选择单片机型号 2. SYS&#xff0c;选Seral Wire&#xff0c;TIM5 3. GPIO&#xff0c;配置LED驱动管脚为OutPut 3.时钟树选择内部RC&#xff0c;笔者这么做的原因是&#xff0c;在选择外部时钟作为时钟源时候&#xff0c;发现程序总会卡死在Sy…

SQL注入---文件上传+Webshell

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.Web工作原理 Web工作原理详解 HTTP/HTTPS协议会作为浏览器中输入信息的载体&#xff0c;向目标服务器发送请求&#xff0c;目标服务器收到请求后再返回对饮的信息&#xff0c;其中浏览器中…

LangChain-08 Query SQL DB 通过GPT自动查询SQL

我们需要下载一个 LangChain 官方提供的本地小数据库。 安装依赖 SQL: https://raw.githubusercontent.com/lerocha/chinook-database/master/ChinookDatabase/DataSources/Chinook_Sqlite.sql Shell: pip install --upgrade --quiet langchain-core langchain-community la…

MySQL学习记录1(学习笔记)

MySQL学习 一、记录知识点 一、记录知识点 1.默认使用的引擎就是InnoDB。不过&#xff0c;也可以通过指定存储引擎的类型来选择别的引擎&#xff0c;比如在create table语句中使用enginememory, 来指定使用内存引擎创建表。 2.不同的存储引擎共用一个Server层&#xff0c;也就…

第20次修改了可删除可持久保存的前端html备忘录:重新布局

第20次修改了可删除可持久保存的前端html备忘录&#xff1a;重新布局 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

苍穹外卖——项目搭建

一、项目介绍以及环境搭建 1.苍穹外卖项目介绍 1.1项目介绍 本项目&#xff08;苍穹外卖&#xff09;是专门为餐饮企业&#xff08;餐厅、饭店&#xff09;定制的一款软件产品&#xff0c;包括 系统管理后台 和 小程序端应用 两部分。其中系统管理后台主要提供给餐饮企业内部员…

4 万字全面掌握数据库、数据仓库、数据集市、数据湖、数据中台

如今&#xff0c;随着诸如互联网以及物联网等技术的不断发展&#xff0c;越来越多的数据被生产出来-据统计&#xff0c;每天大约有超过2.5亿亿字节的各种各样数据产生。这些数据需要被存储起来并且能够被方便的分析和利用。 随着大数据技术的不断更新和迭代&#xff0c;数据管…

【瑞萨RA6M3】1. 基于 vscode 搭建开发环境

基于 vscode 搭建开发环境 1. 准备2. 安装2.1. 安装瑞萨软件包2.2. 安装编译器2.3. 安装 cmake2.4. 安装 openocd2.5. 安装 ninja2.6. 安装 make 3. 生成初始代码4. 修改 cmake 脚本5. 调试准备6. 仿真 1. 准备 需要瑞萨仓库中的两个软件&#xff1a; MDK_Device_Packs.zipse…

Dockerd的使用

端口映射 存储卷 类似于mount&#xff0c;把真机的某个目录映射都容器里面 -v 选项可以有多个 利用存储卷修改配置文件 容器间网络模式 共享网络为 --networkcontainer&#xff1a;容器名 微服务架构 一种由容器为载体&#xff0c;使用多个小型服务组合来构建复杂的架构为…

Jupyter Notebook安装使用(一)

1. 简介 Jupyter Notebook 是一个非常强大的工具&#xff0c;它允许用户创建和共享包含实时代码、方程式、可视化和叙事文本的文档。这种工具特别适合数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等多种应用领域。 2. 安装Jupyter Notebook 2.1. 使用 Anaconda…