当前位置: 首页 > news >正文

学习 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)

相关文章:

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

欢迎来到我关于 Git 的综合指南&#xff0c;Git 是一种分布式版本控制系统&#xff0c;已经在软件开发中彻底改变了协作和代码管理方式。 无论你是经验丰富的开发者还是刚开始编程之旅的新手&#xff0c;理解 Git 对于正确掌控代码、高效管理项目和与他人合作至关重要。 在本…...

pip和conda 设置安装源

pip和conda 设置安装源 conda查看 channels添加 channels移除 channelschannels 配置文件 pip查看 index-url添加 index-url移除 index-urlindex-url 配置文件 常用源 conda 查看 channels conda config --show channels添加 channels conda config --add channels https:/…...

数据分析之Logistic回归分析中的【多元有序逻辑回归】

1、定义 多元有序逻辑回归用于分析有序分类因变量与一个或多个自变量之间的关系。有序逻辑回归适用于因变量具有自然排序但没有固定间距的类别&#xff0c;例如疾病严重程度&#xff08;轻度、中度、重度&#xff09;或调查问卷中的满意度评分&#xff08;非常不满意、不满意、…...

路由器拨号失败解决方法

目录 一、遇到问题 二、测试 三、解决方法 &#xff08;一&#xff09;路由器先单插wan口设置 &#xff08;二&#xff09;mac地址替换 &#xff08;三&#xff09;更改路由器DNS 一、遇到问题 1 .在光猫使用桥接模式&#xff0c;由路由器进行拨号的时候&#xff0c;出现…...

Oracle 中 where 和 on 的区别

1.Oracle 中 where 和 on 的区别 on&#xff1a;会先根据on后面的条件进行筛选&#xff0c;条件为真时返回该行&#xff0c;由于on的优先级高于left join&#xff0c;所以left join关键字会把左表中没有匹配的所有行也都返回&#xff0c;然后生成临时表返回,执行优先级高于…...

NLP学习路线总结

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是人工智能和语言学领域的一部分&#xff0c;它旨在让计算机能够理解、解释和生成人类语言。NLP学习路线可以大致分为以下几个步骤&#xff1a; 1. 基础知识准备 - 计算机科学知识&#xff1a…...

AI绘图cuda与stable diffusion安装部署始末与避坑

stable diffusion的安装说起来很讽刺&#xff0c;最难的不是stable diffusion&#xff0c;而是下载安装cuda。下来我就来分享一下我的安装过程&#xff0c;失败了好几次&#xff0c;几近放弃。 一、安装cuda 我们都知道cuda是显卡CPU工作的驱动&#xff08;或者安装官网的解释…...

OpenCv —— cv::VideoCapture设置摄像头图像格式为“MJPEG“

背景 今天恰巧同事有台USB摄像头,她想要在Windows系统下通过OpenCV读取该摄像头宽高为1080x768、帧率为60的视频,用来做图像算法处理。但无奈通过网上OpenCV教程 读取的视频对应尺寸的帧率仅为10帧左右,根本无法满足使用要求。于是作者通过本篇文章介绍如何解决,欢迎交流指…...

Qt事件学习案例

视频链接 https://www.bilibili.com/video/BV18B4y1K7Cs?p7&spm_id_frompageDriver&vd_sourcefa4ef8f26ae084f9b5f70a5f87e9e41bQt5跟着视频做即可&#xff0c;Qt6部分代码需要改动,改动的地方注释有写 素材 百度云 链接&#xff1a;https://pan.baidu.com/s/158j…...

无锡国家集成电路设计中心某公司的单锂小电机直流电机H桥驱动电路

H桥驱动 L9110S是一款直流电机驱动电路&#xff0c;适合单节锂电池应用。输出电流0.4A。价格约3毛。 推荐原因&#xff1a; 某些人应该知道这个地方&#xff0c;大多数人应该不知道这个地方&#xff0c;所以推荐一下。 这个地方去过几次&#xff0c;某公司与某方走的“近”&…...

数据分析 -- numpy

文章目录 numpy库简介简介特点 numpy操作数组创建数组属性数组变更数据计算 numpy库简介 简介 开源的Python库&#xff0c;它提供了高性能的多维数值&#xff08;numpy.ndarray&#xff09;计算能力&#xff1b;由“Numerical Python”缩写而来&#xff0c;并且它是Pandas库的…...

开源项目生存现况:xz投毒事件引发的思考与GNU tar维护挑战

&#xff08;首发地址&#xff1a;学习日记 https://www.learndiary.com/2024/04/xz-tar/&#xff09; 嗨&#xff0c;大家好&#xff01;我是来自淘宝网“学习日记小店”的 learndiary&#xff0c;专注于 Linux 服务领域。今天我要和大家谈谈近期备受瞩目的 XZ 供应链投毒事件…...

前端开发语言有哪些

随着互联网的迅猛发展&#xff0c;前端开发已经成为了一个炙手可热的职业。对于初学者来说&#xff0c;了解前端开发所使用的语言是非常重要的。那么&#xff0c;前端开发语言有哪些呢&#xff1f;本文将为您一一介绍。 一、HTML HTML&#xff08;HyperText Markup Language&…...

速盾:cdn加速https额外收费吗?

CDN&#xff08;内容分发网络&#xff09;是一种通过在全球各地部署服务器来提供高速互联网内容传输的技术&#xff0c;它可以加速网站的访问速度&#xff0c;提高用户体验。而HTTPS&#xff08;超文本传输安全协议&#xff09;是一种通过加密技术保护网站数据传输安全的协议。…...

【蓝桥杯嵌入式】13届程序题刷题记录及反思

一、题目分析 考察内容&#xff1a; led按键&#xff08;短按&#xff09;PWM输出&#xff08;PA1&#xff09;串口接收lcd显示 根据PWM输出占空比调节&#xff0c;高频与低频切换 串口接收&#xff08;指令解析&#xff09;【中断接收】 2个显示界面 led灯闪烁定时器 二…...

C++类 单例模式

例子 请看如下的类和调用&#xff1a; 在您提供的代码片段中&#xff0c;CPathPlanMan 类使用了一个单例模式&#xff0c;这意味着这个类只需要一个实例&#xff0c;并且提供了全局访问点来获取这个实例。这通常用于控制对一个类实例的访问&#xff0c;尤其是在创建实例代价昂…...

prompt 工程案例

目录 prompt 工程是什么&#xff1f; 案例 vllm 推理加速框架 prompt 工程是什么&#xff1f; prompt&#xff1a;提示词&#xff0c;也就是我们使用网页版输入给大模型的内容就叫 prompt&#xff0c;那什么是 prompt 工程呢&#xff1f; 简单理解其实就是利用编写的 prom…...

燃气管网安全运行监测系统功能介绍

燃气管网&#xff0c;作为城市基础设施的重要组成部分&#xff0c;其安全运行直接关系到居民的生命财产安全和城市的稳定发展。然而&#xff0c;随着城市规模的不断扩大和燃气使用量的增加&#xff0c;燃气管网的安全运行面临着越来越大的挑战。为了应对这些挑战&#xff0c;燃…...

正则表达式(2)

文章目录 专栏导读1、贪婪与非贪婪2、转义匹配 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对大学生、初级数据分析工程师精…...

xv6源码分析 001

xv6源码分析 001 我们先看看xv6这个项目的基本结构&#xff08;只看代码部分&#xff09; 主要就是两个目录kernel 和 user。 user是一些用户程序&#xff0c;也就是我们平时在shell上面执行的命令&#xff0c;每执行一个命令就会创建一个新的用户进程来执行这个命令 在user目…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...