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

Git 常用命令与开发流程总结

引言

在我之前面试过程中,经常会问到关于公司使用什么代码版本管理工具。 无非是考察咱们是否用过 Git和SVN。 现在公司选择的工具直接影响到项目的开发流程和协作效率。当前市面上,GitSVN(Subversion)是两种流行的版本控制系统。它们各有优势和适用的场景。 SVN我暂且不说了。一般游戏公司用的比较多 感兴趣的可以自己搜相关文章去了解哈。

本篇文章我将详细讲解我们使用Git版本控制过程中经常遇到的命令以及对应的解释说明。 毕竟很多我自己也没注意。本篇文章即对git 命令做一个总结。

git init:创建一个 Git 仓库

在日常开发中,第一步通常是创建一个 Git 仓库。在本地开发中,我们可以通过 git init 命令初始化一个新的 Git 仓库,开始对项目进行版本管理。这个仓库可以是全新的项目,也可以是一个已有项目的 Git 管理配置。(当然,有些开发者不需要自己创建仓库,而是直接从公司项目库中拉取分支,这部分我们会在后面详细说明。)

示例命令:

git init

运行该命令后,Git 会在当前目录下创建一个隐藏的 .git 文件夹,存储所有的 Git 配置信息和历史记录。这一步完成后,我们就成功创建了一个本地 Git 仓库。

git init 的应用场景

  • 全新项目:在从零开始开发项目时,可以使用 git init 初始化 Git 仓库,以便跟踪每次提交的变更。
  • 管理现有项目:如果项目已经存在,则可以在其根目录下执行 git init,开始管理这个项目的版本历史。

git config: 配置用户信息

在初始化 Git 仓库后,通常需要配置用户的基本信息(如用户名和邮箱),以确保每次提交都能准确标识代码作者。这一步也帮助团队协作中追踪不同贡献者的代码更改。

配置用户名和邮箱

在使用 Git 前,建议为当前环境配置用户名和邮箱,以确保提交的作者信息一致。

示例命令

git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
  • --global--global 参数表示设置为全局配置,这些信息适用于当前用户的所有 Git 仓库。

  • 本地仓库配置:若只在当前仓库中设置用户名和邮箱,可省略 --global 参数:

    git config user.name "Project Specific Name"
    git config user.email "project.email@example.com"
    
查看当前配置

要查看已配置的 Git 信息,可以使用以下命令:

git config --list

此命令将列出所有配置项,包括用户名、邮箱和其他 Git 选项。

git config 的其他常用配置
  1. 设置默认文本编辑器

    git config --global core.editor "vim"
    

    如果不指定编辑器,Git 默认调用系统编辑器。可以根据个人习惯设置为 vimnanocode(VS Code)等。

  2. 启用颜色显示

    git config --global color.ui auto
    

    启用颜色显示可以让 Git 命令输出更直观,例如 statusdiff 的结果会使用不同颜色来显示状态差异,更便于识别。

  3. 设置 Git 命令别名

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

    设置别名可以简化常用命令并提高效率。例如,用 git st 代替 git status,更简便易用。

  4. 配置默认合并策略

    git config --global merge.ff false
    

    该配置禁止使用快速合并(fast-forward),从而在合并时保留分支的历史记录,方便后续查阅。

  5. 设置推送默认分支

    git config --global push.default simple
    

    此配置确保只推送当前分支到远程仓库中的同名分支,减少错误推送其他分支的风险。

配置文件的位置
  • 全局配置文件:通常位于用户主目录下的 .gitconfig 文件,所有全局设置都记录在其中。
  • 项目配置文件:每个 Git 仓库也有一个独立的 .git/config 文件,用于记录该仓库的特定配置。

git clone:从远程仓库克隆项目

在团队开发中,开发人员通常不需要从头创建一个项目仓库,而是直接从公司项目库或远程仓库中拉取代码。这一步我们使用 git clone 命令来完成。git clone 可以将整个远程仓库复制到本地,并保留所有提交历史、分支和标签信息,方便开发者快速开始工作。

基本用法

git clone <repository-url>

例如,克隆 GitHub 上的一个项目仓库:

git clone https://github.com/username/project-name.git

执行该命令后,Git 会在当前目录下创建一个名为 project-name 的文件夹,并将远程仓库的内容下载到该文件夹中。

git clone 的常用参数
  1. 指定克隆到的目录

    git clone <repository-url> <directory>
    

    默认情况下,Git 会在当前目录下创建一个与仓库名称相同的文件夹。但如果需要自定义文件夹名称,可以在 URL 后面指定:

    git clone https://github.com/username/project-name.git my-local-folder
    

    上述命令会将仓库克隆到 my-local-folder 文件夹中。

  2. 指定分支克隆

    git clone -b <branch-name> <repository-url>
    

    默认情况下,git clone 会克隆默认分支(通常是 mainmaster 分支)。但可以使用 -b 参数来克隆特定分支:

    git clone -b develop https://github.com/username/project-name.git
    

    这会将远程仓库的 develop 分支克隆到本地。

  3. 浅克隆(仅获取最近的提交)

    git clone --depth <number> <repository-url>
    

    有时仓库的提交历史非常庞大,为了节省时间和空间,可以使用 --depth 参数进行浅克隆,只获取最近的提交。比如:

    git clone --depth 1 https://github.com/username/project-name.git
    

    这会只获取最新的 1 次提交,适合快速查看项目或测试代码。

  4. 单分支克隆

    git clone --single-branch -b <branch-name> <repository-url>
    

    如果只需要一个特定分支,可以同时使用 --single-branch-b 参数,这样只会下载该分支的内容,而不会包含其他分支信息:

    git clone --single-branch -b feature https://github.com/username/project-name.git
    

    这在需要某个特定功能分支时非常有用,可以减少下载的数据量。

  5. 使用 SSH 克隆

    如果在本地配置了 SSH 密钥,可以直接使用 SSH 方式克隆仓库,避免每次输入用户名和密码:

    git clone git@github.com:username/project-name.git
    

    这种方式更适合团队协作,尤其是频繁推送和拉取的情况。

其他常用选项
  • --mirror:完整地克隆远程仓库,包括所有的引用(refs),用于创建仓库的完整镜像。这种模式会把仓库的所有内容(包括所有分支、标签等)原样复制,不创建工作区。
  • --recursive:当项目中包含子模块(submodules)时,可以使用此参数同时克隆子模块内容,避免手动初始化子模块。
常见示例总结
  • 克隆默认分支到自定义目录:

    git clone https://github.com/username/project-name.git custom-folder
    
  • 克隆特定分支(如 develop 分支):

    git clone -b develop https://github.com/username/project-name.git
    
  • 仅获取最近 3 次提交:

    git clone --depth 3 https://github.com/username/project-name.git
    

通过 git clone 命令,开发者可以轻松将项目从远程仓库复制到本地,快速上手开发。


创建和管理分支

一般来说,当我们封装好了 master 主分支代码,或者从公司仓库克隆了代码后,就需要进入实际开发阶段。在日常开发中,我们通常会基于主分支创建新的分支,这样可以在不影响主分支的情况下,独立完成功能或修复工作,之后再将更改合并到主分支中。这一部分我们将介绍常用的分支管理命令。

1. 创建分支:git branch <branch-name>

在 Git 中,创建分支的命令是 git branch <branch-name>,此命令用于在当前分支的基础上创建一个新的分支。创建分支后,新分支会拥有当前分支的所有提交历史,但并不会自动切换到新分支。

示例命令:

git branch feature-xyz

上述命令会基于当前分支(通常是 mainmaster)创建一个名为 feature-xyz 的新分支。此分支可以用于特定功能的开发或 Bug 修复,确保开发工作不会影响到主分支。

2. 创建并切换到新分支:git checkout -b <branch-name>

要创建分支并自动切换到该分支,可以使用 git checkout -b 命令,这是一种快捷方式,非常适合在创建分支后直接进入开发状态。

示例命令:

git checkout -b feature-xyz

执行该命令后,Git 会创建 feature-xyz 分支并切换到该分支。这样我们就可以在新分支上直接进行开发,而不影响到其他分支。

3. 查看所有分支:git branch

在 Git 中,我们可以通过 git branch 命令查看本地所有分支的列表,当前分支会带有 * 标记,表示开发者目前所在的分支。

示例命令:

git branch

输出示例:

* masterfeature-xyzbugfix-123

这里 * master 表示当前处于 master 分支。

4. 删除分支:git branch -d <branch-name>

完成开发任务或 Bug 修复后,如果不再需要某个分支,可以使用 git branch -d 命令删除本地的分支。此命令会确保分支上的内容已经被合并,否则不会允许删除分支,以防丢失未合并的提交。

示例命令:

git branch -d feature-xyz

如果要强制删除未合并的分支,可以使用 -D 参数(不推荐,除非确定不再需要分支内容):

git branch -D feature-xyz
5. 推送分支到远程仓库:git push origin <branch-name>

在本地完成分支的开发后,通常需要将其推送到远程仓库,方便团队协作。使用 git push origin <branch-name> 命令即可将当前分支推送到远程。

示例命令:

git push origin feature-xyz

此命令会将 feature-xyz 分支推送到远程仓库。如果是第一次推送,可以加上 -u 参数,将当前分支和远程分支关联,简化后续操作:

git push -u origin feature-xyz

之后,只需运行 git push 即可更新远程分支。

6. 查看远程分支:git branch -a

使用 git branch -a 可以查看所有分支,包括本地和远程的所有分支。通常远程分支前面会带有 remotes/origin/ 前缀:

git branch -a

示例输出:

* masterfeature-xyzremotes/origin/masterremotes/origin/feature-xyz
7. 删除远程分支

若需要从远程仓库删除一个分支,可以使用以下命令:

git push origin --delete feature-xyz

此命令会从远程仓库中移除 feature-xyz 分支,但不会影响到其他人的本地分支。

以上是 Git 中常见的分支管理操作。分支管理可以有效帮助开发人员在不同功能间切换、隔离未完成的更改,确保项目主分支始终保持稳定。


提交管理

在开发中完成了功能或修复后,我们需要将更改提交到 Git 仓库中。提交管理包括将文件从工作区添加到暂存区、编写提交信息,以及查看和管理提交历史等。以下介绍了常用的提交管理命令及其用法、示例和撤销操作的处理方法。

1. 添加文件到暂存区:git add

git add 命令用于将工作区中的文件添加到暂存区,为后续的提交做准备。可以选择性地添加特定文件或目录,也可以一次性添加所有更改。

示例命令

  • 添加单个文件:

    git add filename.txt
    
  • 添加当前目录的所有文件和更改(包括新文件和修改):

    git add .
    
  • 添加所有文件,包括已删除的文件:

    git add -A
    
  • 交互式添加代码片段(选择性提交文件中的部分更改):

    git add -p
    
2. 提交更改:git commit

git commit 命令用于将暂存区的更改提交到本地仓库,生成新的提交记录,并附带一条提交信息描述更改内容。提交信息应该清晰、简洁,帮助团队理解更改内容。

示例命令

  • 使用简洁的提交信息提交:

    git commit -m "Add feature XYZ"
    
  • 如果提交后发现需要补充更改或修改提交信息,可以使用 --amend 参数来修改上一次提交:

    git commit --amend
    

    该命令会打开编辑器,允许更改提交信息或加入新的更改,不会生成新的提交记录,而是覆盖上一次提交。

3. 查看工作区状态:git status

git status 命令用于查看工作区和暂存区的状态,包括哪些文件已被修改、哪些文件在暂存区、哪些文件未被跟踪。提交前通过 git status 检查更改,有助于确保提交内容正确。

示例命令

git status

输出示例

On branch feature-xyz
Changes to be committed:(use "git restore --staged <file>..." to unstage)modified:   filename.txtnew file:   newfile.txtChanges not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified:   anotherfile.txt

4. 查看提交历史:git log

git log 用于查看提交历史,包含提交人、提交信息和提交时间等信息。在需要回溯更改或审查历史提交时,git log 是非常有用的命令。

示例命令

  • 查看所有提交历史:

    git log
    
  • 简化显示,按单行输出每个提交:

    git log --oneline
    
  • 以图形化方式显示提交历史(展示分支和合并情况):

    git log --graph --oneline --all
    

示例输出

* 9b0f5a2 Add feature XYZ
* 2f6e45d Fix bug in function ABC
* 7c8e4e1 Initial project setup
5. 查看差异:git diff

git diff 用于查看工作区或暂存区中的差异,帮助确认修改内容。

示例命令

  • 查看工作区的更改:

    git diff
    
  • 查看暂存区与工作区的差异(显示已暂存的修改):

    git diff --cached
    
  • 比较两个分支之间的差异:

    git diff branch1 branch2
    
  • 查看特定提交之间的差异:

    git diff <commit-hash1> <commit-hash2>
    

撤销操作

在提交后,可能会遇到需要撤销或修改提交内容的情况。以下是常用的撤销操作命令及示例。

6. 取消暂存:git restore --staged <file>

如果已将文件添加到暂存区,但不想包含在下一次提交中,可以使用 git restore --staged 命令取消暂存。

示例命令

git restore --staged filename.txt

此命令将文件移出暂存区,但保留工作区中的更改。

7. 撤销上一次提交:git commit --amend

若在提交后发现需要补充修改或更改提交信息,可以使用 git commit --amend 命令修改上一次提交,而不会生成新的提交。

示例命令

git commit --amend

执行此命令后,Git 会打开编辑器,可以修改提交信息或将新的更改加入到上次提交中。

8. 回退到特定提交:git reset

git reset 用于回退到指定的提交,根据参数不同,回退可以保留或删除更改。

  • 软回退(保留工作区和暂存区更改):

    git reset --soft <commit-hash>
    
  • 混合回退(保留工作区更改,但清除暂存区):

    git reset --mixed <commit-hash>
    
  • 硬回退(彻底丢弃所有更改):

    git reset --hard <commit-hash>
    

例如,回退到特定提交并保留工作区内容:

git reset --soft 9b0f5a2
9. 撤销特定提交:git revert

git revert 创建一个新的提交来撤销指定提交,不会更改提交历史,适用于已推送到远程仓库的情况。

示例命令

git revert 9b0f5a2

此命令会生成一个新的提交来撤销 9b0f5a2 的更改,而不会修改历史记录。

10. 丢弃工作区的更改:git restore <file>

如果工作区的文件修改不再需要,可以用 git restore 丢弃更改,恢复到最后一次提交的状态。

示例命令

  • 丢弃指定文件的更改:

    git restore filename.txt
    
  • 丢弃整个目录的修改:

    git restore .
    

通过以上提交管理和撤销操作的命令,开发者可以有效地管理提交记录,确保提交内容的正确性。合理使用这些命令,有助于保持 Git 提交历史的整洁与一致。


合并和撤销操作管理

在 Git 的使用过程中,合并和撤销操作是团队协作开发中的重要步骤。功能开发完成后,通常需要合并到主分支,而在出现错误时可能需要回退或撤销合并操作。Git 提供了多种命令来满足不同的合并和撤销需求,以下是主要的合并和撤销命令及其适用场景。


合并操作
1. 合并分支:git merge

git merge 命令用于将一个分支的所有提交合并到当前分支。通常在功能开发完成后,用于合并整个分支的更改,是最常用的合并方法。

示例命令

  • 首先切换到主分支:

    git checkout main
    
  • feature-branch 分支合并到 main

    git merge feature-branch
    

合并模式

  • 快速合并(Fast-Forward) :如果主分支上没有其他提交,Git 会直接移动分支指针,不生成新的合并提交。
  • 三方合并(Three-Way Merge) :如果主分支上有其他提交,则会生成一个合并提交,包含合并前的所有历史。
2. 选择性合并:git cherry-pick

git cherry-pick 命令用于将指定的单个或多个提交合并到当前分支,适合在功能未完全完成或部分更改已验证的情况下,选择性地合并到主分支。

示例命令

  • 切换到主分支:

    git checkout main
    
  • feature-branch 中的特定提交 abc1234 应用到 main

    git cherry-pick abc1234
    

多个提交的 cherry-pick

  • 使用提交区间来选择合并一系列提交:

    git cherry-pick abc1234^..xyz5678
    

撤销合并操作

在合并操作后,如果发现问题或不想保留某些更改,Git 提供了 git resetgit revert 命令来撤销合并。

3. 撤销提交历史:git reset

git reset 用于回退到指定的提交,适合在本地开发中重写提交历史。如果合并提交未推送到远程仓库,可以使用 reset 来回退合并。

适用场景git reset 会直接删除指定提交及其之后的历史,因此适合本地分支,回退后可以重新调整提交内容。

4. 撤销已提交的合并:git revert

git revert 不会直接更改提交历史,而是通过创建一个新的提交来抵消指定提交的内容。这非常适合在已推送到远程仓库的分支上撤销合并,确保历史记录完整。

示例命令

  • 撤销合并提交(例如 merge-commit-hash 是合并的提交哈希):

    git revert -m 1 <merge-commit-hash>
    

    这里的 -m 1 表示指定主分支(mainmaster)为合并基础,帮助 Git 识别要撤销的内容。

适用场景git revert 非常适合在远程分支上操作,不会改变历史记录,适合团队协作和远程分支的操作。


合并与撤销的选择
  • 完整合并分支git merge 是合并功能分支的最佳选择,能完整保留分支历史,适合已完成的功能或 Bug 修复。
  • 选择性合并提交git cherry-pick 适合在部分更改已验证的情况下,将特定提交合并到主分支。
  • 撤销本地合并操作git reset 用于撤销本地的合并,直接修改提交历史,适合未推送的提交。
  • 撤销远程合并操作git revert 用于在远程仓库中撤销合并提交,不更改历史记录,确保协作稳定。

同步远程仓库

在团队开发中,为了保持代码的同步性和一致性,常常需要将本地分支与远程仓库进行同步。同步远程仓库前,通常需要先更新本地分支,获取最新的远程分支信息,以确保合并或提交时不会出现冲突。同步的核心命令包括 git fetchgit pullgit push

1. 更新远程仓库信息:git fetch

git fetch 命令用于从远程仓库获取更新信息,但不会自动合并到当前分支。git fetch 更新了本地的远程分支信息,可以帮助我们了解远程仓库的最新状态,然后选择是否进行合并。

示例命令

git fetch origin

此命令会从远程仓库 origin 拉取更新,但不会影响当前分支。

常用参数

  • 指定分支:只拉取某个分支的更新信息:

    git fetch origin main
    
  • 拉取所有远程分支

    git fetch --all
    

适用场景:在提交或推送之前,通过 git fetch 先检查远程仓库是否有更新,然后再选择是否合并这些更新,有助于避免冲突。

2. 拉取并合并远程分支:git pull

git pullgit fetchgit merge 的组合。它先拉取远程更新,然后自动合并到当前分支。使用 git pull 可以快速同步远程分支的最新内容,但如果远程有冲突,可能需要手动解决。

示例命令

  • 基本拉取并合并当前分支的更新:

    git pull origin main
    

此命令会从远程仓库 origin 中的 main 分支拉取更新,并自动合并到本地的 main 分支。

  • --rebase 参数:拉取远程更改并使用 rebase 合并,避免产生合并提交,使提交历史更加线性整洁:

    git pull --rebase origin main
    

适用场景:当需要立即同步远程仓库的最新更新时,使用 git pull 可以一键完成拉取并合并的过程。不过在多人协作时,建议在拉取之前先使用 git fetch 查看变动,再决定是否需要手动合并,以避免自动合并产生的冲突。

3. 推送本地更改到远程仓库:git push

git push 用于将本地分支的更改推送到远程仓库,便于其他开发者获取。通常在提交、拉取并解决冲突后,使用 git push 将更改同步到远程仓库。第一次推送时,需指定远程分支名称,之后可以简化为 git push

示例命令

  • 将当前分支的更改推送到远程仓库的对应分支:

    git push origin main
    
  • -u 参数:指定默认远程跟踪分支,设置后可以直接使用 git push 推送,不再需要每次指定远程分支。

    git push -u origin main
    
  • 强制推送:当推送被拒绝时,可以使用 --force 强制推送本地内容覆盖远程分支(慎用,可能会覆盖其他开发者的内容):

    git push --force origin main
    

适用场景:当本地开发完成并提交后,使用 git push 将更改同步到远程仓库,确保团队成员能够获取到最新代码。在多人协作时,不推荐使用 --force 推送,避免破坏他人工作。

示例操作流程

在实际的团队协作中,通常的同步流程如下:

  1. 更新远程分支信息:在同步之前,先运行 git fetch 拉取远程仓库的更新,了解远程分支的最新状态。

    git fetch origin
    
  2. 拉取并合并远程更新:如果发现远程分支有更新,需要合并到当前分支,可以使用 git pull 合并更新。

    git pull origin main
    
  3. 推送本地更改到远程:当本地开发完成并解决冲突后,使用 git push 将更改推送到远程分支。

    git push origin main
    
小结
  • git fetch:获取远程更新,不影响本地分支;适合在合并前查看远程变更。
  • git pull:获取并自动合并远程更新;适合需要立即同步更新的场景。
  • git push:将本地更改推送到远程仓库;适合完成开发后同步代码给团队成员。

解决冲突和提交

在团队协作或多分支开发中,代码合并时经常会遇到冲突。Git 冲突通常发生在不同分支对同一文件的同一区域进行了不同修改时。了解如何查看、解决冲突以及提交修改,是团队开发中至关重要的技能。

1. 什么是冲突?

冲突发生在 Git 无法自动合并不同分支的更改时,例如两人都修改了同一行代码。遇到冲突时,Git 会停止合并过程,并标记冲突的文件。开发者需要手动解决这些冲突,然后继续完成合并。

冲突的常见场景

  • 拉取远程更改:执行 git pull 合并远程更改时,本地的修改和远程的修改产生冲突。
  • 合并分支:将功能分支合并到主分支时,如果两个分支对同一文件的相同位置进行了不同更改,可能会产生冲突。
2. 查看冲突

当冲突发生时,Git 会将冲突文件标记为未合并状态。可以通过以下命令查看冲突文件的状态:

git status

冲突标记示例

Git 会在冲突的文件中生成类似以下的标记:

<<<<<<< HEAD
// 当前分支的代码
=======// 被合并分支的代码
>>>>>>> feature-branch
  • <<<<<<< HEAD 表示当前分支的代码。
  • ======= 是冲突的分界线。
  • >>>>>>> feature-branch 表示被合并分支的代码。
3. 解决冲突

解决冲突时,需要手动编辑冲突文件,选择保留的更改,或者合并两边的代码。可以按以下步骤进行:

  1. 编辑冲突文件:打开冲突的文件,找到冲突标记 (<<<<<<<=======>>>>>>>) 位置,手动选择保留或删除冲突代码块。

    示例:合并两个冲突的版本,手动选择适当的代码,然后删除冲突标记。

    // 解决冲突后
    // 保留的合并代码
    
  2. 添加解决后的文件:解决冲突后,将文件添加到暂存区标记为已解决。

    git add <conflicted-file>
    
  3. 完成合并提交:在所有冲突解决并添加到暂存区后,执行以下命令完成合并。

    git commit
    
4. 查看并处理多个冲突

在大型项目中,多个文件可能会产生冲突。可以通过以下命令逐步查看并处理冲突:

  • 查看所有冲突文件

    git status
    
  • 添加已解决的所有文件

    git add .
    
  • 完成合并并提交

    git commit -m "Resolve merge conflicts"
    
5. 使用工具解决冲突

Git 兼容多种 GUI 工具,可以帮助可视化解决冲突。可以使用 VS Code、Sourcetree、P4Merge 等工具直接查看并解决冲突,更加直观。

设置默认冲突解决工具

git config --global merge.tool <tool-name>

例如:

git config --global merge.tool vscode

然后执行以下命令启动工具解决冲突:

git mergetool
6. 提交解决后的代码

在解决冲突后,可以使用 git commit 提交已合并的更改。以下是常见的提交流程:

  1. 解决冲突并保存更改:确保所有冲突文件已保存。

  2. 将解决的文件添加到暂存区

    git add .
    
  3. 提交合并更改

    git commit -m "Resolve merge conflicts and merge branch"
    
小结
  • 冲突解决流程:在合并冲突发生时,先用 git status 查看冲突文件,手动编辑或使用工具解决冲突,然后通过 git addgit commit 完成合并。
  • 工具辅助:可以设置并使用合并工具,如 VS Code 或其他合并工具,更高效地可视化解决冲突。

通过熟练掌握冲突解决和提交方法,团队开发中能够更快速地整合分支和解决代码冲突,确保项目稳定。


暂存和恢复工作区

在实际开发中,有时我们正在修改代码,但需要临时切换到其他任务或分支,这时可以使用 git stash 来保存当前的未提交更改,将工作区恢复到干净状态,方便切换工作。git stash 系列命令允许我们将未完成的更改暂存起来,并在需要时恢复。

使用场景

以下是使用 git stash 的典型场景:

  • 临时切换分支:如果在某个分支上修改了代码,但还未完成或提交,而此时需要切换到其他分支,可以将更改暂存起来,避免影响切换操作。
  • 测试其他功能:正在开发某个功能,但需要临时测试或修复其他功能的代码,可以将当前的工作暂存。
  • 清理工作区:如果需要清理工作区的修改内容,但又不想丢失更改,可以使用 git stash 来保存当前状态。
1. 保存当前工作区更改:git stash

git stash 命令用于将当前工作区的所有更改(包括未提交的文件)存入 Git 的暂存栈中,然后将工作区恢复到上一次提交的状态。执行 git stash 后,工作区将变为干净状态,便于进行其他操作。

示例命令

git stash

执行此命令后,所有未提交的更改会被暂存到一个栈中,工作区恢复为最新提交的状态。

常用参数

  • 保存特定消息:可以添加备注,方便后续识别暂存内容:

    git stash push -m "WIP: feature A development"
    
  • 仅暂存未提交的文件

    git stash --keep-index
    
2. 查看暂存的更改列表:git stash list

git stash list 命令用于查看当前仓库的所有暂存记录。每条记录都有唯一的编号和备注(如果有)。

示例命令

git stash list

示例输出

stash@{0}: WIP on main: 9b0f5a2 Add feature XYZ
stash@{1}: WIP on main: 7c8e4e1 Bugfix for ABC function

这里 stash@{0} 是最近一次的暂存内容,记录了暂存的分支名称和最近的提交信息。

3. 恢复暂存的更改:git stash pop

git stash pop 命令用于从暂存栈中恢复最近一次暂存的更改,并从暂存栈中删除该记录。执行此命令后,暂存内容会被还原到工作区。

示例命令

git stash pop

执行该命令后,工作区会恢复到最近一次的暂存状态,并删除该暂存记录。

###3 4. 应用暂存的更改但不删除:git stash apply

git stash apply 命令会将指定的暂存内容应用到工作区,但不会删除该暂存记录。如果需要多次使用某个暂存记录,可以使用 apply 而不是 pop

示例命令

  • 恢复最近一次暂存的内容(不删除):

    git stash apply
    
  • 恢复特定的暂存记录(不删除):

    git stash apply stash@{1}
    
5. 删除特定的暂存记录:git stash drop

git stash drop 命令用于删除指定的暂存记录,帮助保持暂存栈的整洁。

示例命令

git stash drop stash@{1}

此命令会删除 stash@{1} 的暂存内容,但不会影响工作区。

6. 清除所有暂存记录:git stash clear

git stash clear 会清空所有的暂存记录,不可恢复。谨慎使用。

示例命令

git stash clear
示例操作流程
  1. 将当前工作区的修改暂存

    git stash push -m "WIP: Refactoring feature B"
    
  2. 切换到其他分支进行任务处理

    git checkout main
    
  3. 完成任务后,切回原分支并恢复暂存的更改

    git stash pop
    
  4. 查看暂存历史,删除不需要的暂存记录

    git stash list
    git stash drop stash@{1}
    
小结
  • git stash:暂存当前工作区更改,用于临时保存修改。
  • git stash list:查看暂存的更改记录。
  • git stash pop:恢复最近一次暂存内容并删除记录。
  • git stash apply:恢复指定暂存内容但不删除记录。
  • git stash drop / git stash clear:删除单个或全部暂存记录,保持暂存栈整洁。

使用 git stash 系列命令,开发者可以灵活地在不同任务之间切换,同时保持未完成的工作不被丢失。


查看和比较命令

在使用 Git 时,经常需要查看提交的详细信息、对比不同分支的差异以及查看提交历史等。Git 提供了多种查看和比较命令,包括 git showgit diffgit log,帮助开发者更好地理解代码变更和项目进展。

1. 查看提交详情:git show

git show 命令用于查看某次提交的详细信息,包含提交人、提交时间、提交信息以及具体的代码变更。它默认显示最新的提交内容,也可以指定提交哈希查看特定提交的详细信息。

基本用法

git show

此命令会展示最新一次提交的详细内容。

指定提交

git show <commit-hash>

常用参数

  • --name-only:仅显示提交中修改的文件列表。

    git show --name-only <commit-hash>
    
  • --stat:显示提交的统计信息(每个文件的增加和删除行数)。

    git show --stat <commit-hash>
    

示例

git show 9b0f5a2

输出内容包括提交的摘要信息和具体的代码差异。git show 是查看单个提交内容的最佳工具,适合快速了解每次提交的变动。

2. 查看差异:git diff

git diff 用于查看工作区或暂存区与最后一次提交之间的差异,也可以用来比较两个分支、两个提交之间的差异。git diff 是开发者查看代码变动的重要工具,尤其在提交前检查更改是否符合预期。

基本用法

  • 查看工作区的更改(相对于上一次提交的差异):

    git diff
    
  • 查看暂存区与上次提交的差异:

    git diff --cached
    
  • 查看工作区与暂存区的差异:

    git diff HEAD
    

比较不同分支或提交

  • 比较两个分支

    git diff branch1 branch2
    
  • 比较两个提交

    git diff <commit1> <commit2>
    

常用参数

  • --name-only:只显示差异的文件列表,不显示具体代码。

    git diff --name-only
    
  • --stat:显示差异的统计信息(修改的文件、增加和删除的行数)。

    git diff --stat
    

示例

  • 查看当前工作区和上次提交的差异:

    git diff
    
  • 比较两个提交之间的差异:

    git diff abc1234 xyz5678
    
3. 查看提交历史:git log

git log 用于查看提交历史,帮助开发者回顾项目的变更记录。git log 会列出从最近到最早的所有提交记录,每条记录包含提交哈希、提交人、提交时间和提交信息。

基本用法

git log

常用参数

  • --oneline:每次提交仅显示一行,简化显示内容。

    git log --oneline
    
  • --graph:以图形方式展示分支和合并情况,方便查看分支的演变。

    git log --graph
    
  • --all:显示所有分支的提交历史(包括远程分支)。

    git log --all
    
  • 组合参数--graph --oneline --all 组合使用,以图形方式展示所有分支的历史记录。

    git log --graph --oneline --all
    
  • -p:显示每次提交的具体代码差异。

    git log -p
    
  • --stat:显示每次提交的文件修改统计。

    git log --stat
    

示例

  • 查看简化的提交历史:

    git log --oneline
    
  • 图形方式查看提交历史:

    git log --graph --oneline --all
    
  • 查看特定文件的提交历史:

    git log -- filename.txt
    
示例操作流程
  1. 查看最近一次提交的详细信息

    git show
    
  2. 检查本地修改与上次提交的差异

    git diff
    
  3. 查看项目提交历史,图形化展示分支和合并情况

    git log --graph --oneline --all
    
小结
  • git show:查看某次提交的详细内容,适合查看单个提交的代码变更。
  • git diff:比较不同提交或分支的代码差异,适合提交前检查代码变动。
  • git log:查看提交历史,帮助追踪项目的历史记录和分支合并情况。

标签管理

在 Git 中,标签(Tag)是一种特殊的标记,用于标识特定的提交版本。标签通常用于为代码的关键版本(如发布版、里程碑)创建一个永久的记录。标签可以帮助开发者快速找到项目的某个重要版本,便于回溯或重新部署。Git 中的标签有轻量标签(Lightweight)和注释标签(Annotated)两种。

什么时候需要打标签?

标签通常用于以下场景:

  • 版本发布:在发布一个新版本时,可以在主分支上打上标签,以方便后续查找和回溯。
  • 里程碑:当项目达到某个重要的进展阶段(如完成某个重大功能)时,可以打标签记录当前版本。
  • 回溯参考:为特定的修复点或优化点打标签,便于后续对比和参考。
1. 创建标签:git tag <tag-name>

创建标签的命令是 git tag,默认会创建一个轻量标签(Lightweight Tag),直接将标签指向当前的提交记录。标签名应具有标识性,通常以版本号格式命名(如 v1.0v2.1.3)。

示例命令

  • 创建轻量标签:

    git tag v1.0
    
  • 创建带注释的标签(推荐):注释标签包含标签的创建者、日期和说明信息。

    git tag -a v1.0 -m "Release version 1.0"
    
  • 指定某个提交创建标签:

    git tag v1.0 <commit-hash>
    

:推荐使用带注释的标签 -a,因为注释标签包含更多信息,便于日后查阅。

2. 推送标签到远程仓库:git push origin <tag-name>

本地创建的标签不会自动推送到远程仓库。若希望与团队共享某个标签,可以将标签推送到远程仓库。

示例命令

  • 推送单个标签:

    git push origin v1.0
    
  • 推送所有标签:

    git push --tags
    

适用场景:在发布新版本或重要里程碑时,将标签推送到远程仓库,方便团队成员查看和使用。

3. 删除标签

有时,可能会需要删除不再使用或错误的标签。Git 支持在本地和远程仓库分别删除标签。

  • 删除本地标签:使用 git tag -d 删除本地标签记录。

    示例命令

    git tag -d v1.0
    
  • 删除远程标签:远程标签需要通过推送空标签来删除。

    示例命令

    git push origin :refs/tags/v1.0
    

注意:在多人协作项目中,删除远程标签需谨慎,避免删除关键版本标记。

示例操作流程
  1. 在发布新版本时,创建带注释的标签

    git tag -a v1.1 -m "Release version 1.1 with new features"
    
  2. 将标签推送到远程仓库,以便团队成员查阅

    git push origin v1.1
    
  3. 查看所有标签

    git tag
    
  4. 删除错误的本地标签

    git tag -d v1.1
    
  5. 删除远程标签

    git push origin :refs/tags/v1.1
    
小结
  • git tag <tag-name> :创建标签,用于标记关键版本。
  • git tag -a <tag-name> -m <message> :创建带注释的标签,推荐用于版本管理。
  • git push origin <tag-name> :将标签推送到远程仓库,便于团队共享。
  • git tag -d <tag-name>git push origin :refs/tags/<tag-name> :分别删除本地和远程标签。

总结

Git 提供了灵活的版本控制功能,通过分支管理、提交历史查看、合并与冲突解决、标签管理等命令,开发者可以轻松在团队中协作、跟踪代码变更,并快速发布新版本。掌握 Git 的核心命令和工作流程,能够提升代码管理效率,保证项目的稳定和可追溯性。

Git 命令速查表
操作命令说明
初始化仓库git init初始化一个新的 Git 仓库
克隆仓库git clone <repository-url>克隆现有的远程仓库到本地
配置用户信息git config --global user.name "Your Name" git config --global user.email "your.email@example.com"设置全局用户名和邮箱
创建分支git branch <branch-name>创建一个新的分支
切换分支git checkout <branch-name>切换到指定分支
创建并切换分支git checkout -b <branch-name>创建并切换到新的分支
查看分支git branch -a查看所有分支(包括远程分支)
添加文件到暂存区git add <file>将文件添加到暂存区
查看暂存状态git status查看工作区和暂存区状态
提交更改git commit -m "message"提交暂存区的更改
修改最近的提交git commit --amend修改上一次提交
合并分支git merge <branch-name>合并指定分支到当前分支
选择性合并提交git cherry-pick <commit-hash>将特定提交应用到当前分支
查看提交历史git log查看完整的提交历史
简洁查看提交历史git log --oneline --graph --all简化和图形化显示所有分支的提交历史
查看单个提交git show <commit-hash>查看特定提交的详细信息
查看差异git diff查看工作区和暂存区的差异
比较两个分支git diff branch1 branch2比较两个分支之间的差异
创建标签git tag <tag-name>创建轻量标签
创建注释标签git tag -a <tag-name> -m "message"创建带注释的标签,包含更多信息
推送标签git push origin <tag-name>推送指定标签到远程仓库
推送所有标签git push --tags推送本地的所有标签到远程仓库
删除本地标签git tag -d <tag-name>删除本地标签
删除远程标签git push origin :refs/tags/<tag-name>删除远程仓库中的标签
保存更改到暂存区git stash将当前工作区的修改暂存
查看暂存列表git stash list查看所有暂存的更改记录
恢复最近的暂存git stash pop恢复并删除最近的暂存更改
恢复指定暂存git stash apply stash@{index}应用指定的暂存更改,但不删除
推送分支到远程git push origin <branch-name>将当前分支推送到远程仓库
拉取并合并远程更新git pull获取远程更改并合并到当前分支
仅获取远程更新git fetch从远程仓库获取更新,不合并到当前分支
撤销提交历史git reset --soft <commit-hash> git reset --mixed <commit-hash> git reset --hard <commit-hash>回退到指定提交,保留更改或丢弃所有更改
回滚指定提交git revert <commit-hash>创建一个新的提交来撤销指定提交

资源链接和进一步学习
  • Git 官方文档:Git Documentation
  • GitHub 官方教程:GitHub Guides
  • Pro Git(免费电子书) :Pro Git Book

上面就是本篇文章总结的有关工作中常用到的Git 相关操作命令 虽然现在我们开发大多数都是适用开发软件进行Git操作的 但是基本的Git命令还是要了解的。面试问的一般会比较多哈。

相关文章:

Git 常用命令与开发流程总结

引言 在我之前面试过程中&#xff0c;经常会问到关于公司使用什么代码版本管理工具。 无非是考察咱们是否用过 Git和SVN。 现在公司选择的工具直接影响到项目的开发流程和协作效率。当前市面上&#xff0c;Git 和 SVN&#xff08;Subversion&#xff09;是两种流行的版本控制系…...

链表中插入新的节点

/* 节点结构体定义 */ struct xLIST_ITEM {TickType_t xItemValue; /* 辅助值&#xff0c;用于帮助节点做顺序排列 */ struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ void * pvOw…...

AUTOSAR从入门到精通-BswM模块(二)

目录 前言 算法原理 BswM接口端口 BswM功能描述 模式仲裁 仲裁规则(Arbitration Rules) 模式仲裁来源 模式仲裁过程 模式条件(ModeCondition) 逻辑表达式(LogicExpressions) 模式控制 模式处理 操作执行 模式控制过程 模式控制基本流程 BswM Interfaces and …...

Spring DispatcherServlet详解

文章目录 Spring DispatcherServlet详解一、引言二、DispatcherServlet的初始化与工作流程1、DispatcherServlet的初始化1.1、加载配置和建立WebApplicationContext1.2、初始化策略 2、DispatcherServlet的工作流程2.1、请求分发2.2、代码示例 三、总结 Spring DispatcherServl…...

JS | 软件制作的流程是什么?

目录 一、 需求分析 二、 系统设计 三、 编码实现 四、 测试验证 五、 部署上线 六、 维护更新 软件制作的流程主要包含需求分析、系统设计、编码实现、测试验证、部署上线和维护更新。其中&#xff0c;需求分析是基础&#xff0c;它决定了软件的功能和性能&#xff1b;通…...

简单工厂模式

引言 简单工厂模式并不属于23种设计模式&#xff0c;它是工厂方法模式的“小弟”&#xff0c;由于日常编程中大家会经常用到&#xff0c;只不过没有察觉&#xff0c;因此下文将详解简单工厂模式。 1.概念 简单工厂模式(Simple Factory Pattern)&#xff1a;又称为静态工厂方法(…...

【django】Django REST Framework 序列化与反序列化详解

目录 1、什么是序列化和反序列化&#xff1f; 2、Django REST Framework中的序列化和反序列化 3、安装与配置&#xff08;第10章是从零开始&#xff09; 3.1 安装 3.2 配置 4、基本使用 4.1 创建序列化器 4.2 使用序列化器&#xff08;将数据序列化返回给前端&#xff…...

【Golang】Golang的Map的线程安全问题

文章目录 前言一、场景介绍二、线程安全的Map的使用四、总结 前言 在 Golang 编程中&#xff0c;map 是一种常用的数据结构&#xff0c;用于存储键值对。然而&#xff0c;Golang 的 map 在并发访问时是线程不安全的。如果多个 goroutine 同时读写同一个 map&#xff0c;可能会…...

指向指针的指针+ 值传递的理解

//17、下面的程序会出现什么结果 #include #include void getmemory(char *p) { p(char *) malloc(100); strcpy(p,”hello world”); } int main( ) { char *strNULL; getmemory(str); printf(“%s/n”,str); free(str); return 0; } // 程序崩溃&#xff0c…...

CSS常用定位

一、relative 相对原先的位置进行定位 {position: relative;left: 50px; /* 相对原先位置左边的距离 */top: 100px; /* 相对原先位置上边的距离 */ } 二、absolute 绝对定位&#xff0c;是相对于最近有定位的父级元素进行定位 {position: absolute;righ…...

【Linux】从零开始使用多路转接IO --- select

碌碌无为&#xff0c;则余生太长&#xff1b; 欲有所为&#xff0c;则人生苦短。 --- 中岛敦 《山月记》--- 从零开始认识五种IO模型 1 前言2 认识多路转接select3 多路转接select等待连接4 完善代码5 总结 1 前言 上一篇文章我们讲解了五种IO模型的基本概念&#xff0c;并…...

ArcGIS Pro SDK (二十一)渲染

ArcGIS Pro SDK (二十一)渲染 文章目录 ArcGIS Pro SDK (二十一)渲染1 定义唯一值呈现器定义2 为最新观测值设置唯一值渲染器3 为先前的观测值设置唯一值渲染器4 设置简单的渲染器以绘制轨迹线5 检查先前的观测值和轨道线可见性6 使轨迹线和先前的观测点可见7 检索当前观测…...

FPGA在物联网边缘计算中的应用!!!

FPGA&#xff08;现场可编程门阵列&#xff09;在物联网边缘计算中的应用正变得越来越重要。边缘计算是一种分布式计算架构&#xff0c;它将数据的处理分散到网络的边缘&#xff0c;靠近数据源&#xff0c;而不是集中在数据中心处理。以下是FPGA在物联网边缘计算中的几个关键应…...

【解决】Linux环境中mysqlclient安装失败问题

问题描述 在Linux系统下安装myslclient报异常。系统为Centos 8 使用 pip install mysqlclient 报出下面的异常 error: subprocess-exited-with-error Getting requirements to build wheel did not run successfully.│ exit code: 1╰─> [30 lines of output]/bin/sh: pkg…...

✨ Midjourney中文版:创意启航,绘梦无界 ✨

Midjourney AI超强绘画 (原生态系统&#xff09;用户端&#xff1a;Ai Loadinghttps://www.mjdiscord.com 项目详细介绍飞书文档&#xff1a;Docshttps://ivqklkndl4k.feishu.cn/docx/GRnMdCbcooWkwTx1RU4cZjGVnzb?fromfrom_copylk &#x1f310; 无缝体验&#xff0c;中文定制…...

软件(1)

软件 常考软件 图像软件 Flash 一款二维动画处理软件 photoshop 图像处理界的“巨无霸” ACDSee ACDSee是常用的图片管理编辑软件&#xff0c;尽管也可以支持WAV格式的音频播放&#xff0c; 但目前主要是作为看图软件 音频软件 Winamp Winamp是数字媒体播放的先驱Audition Audi…...

linux perf 环境部署和基本测试(基于Ubuntu20.04)

1,linux 安装perf sudo apt-ge install linux-tools-common sudo apt-get install linux-tools-$(uname -r) linux-tools-generic -y 2 补充安装 sudo apt-get install python3-q-text-as-data 3&#xff0c;perf常用命令 larkubuntu:~$ perf usage: perf [--version] [--hel…...

【网络面试篇】HTTP(1)(笔记)——状态码、字段、GET、POST、缓存

目录 一、相关问题 1. HTTP请求常见的状态码和字段&#xff1f; &#xff08;1&#xff09;状态码 &#xff08;2&#xff09;字段 ① Host 字段 ② Content-length 字段 ③ Connection 字段 ④ Content-Type 字段 ⑤ Content-Encoding 字段 2. GET 和 POST 的区别&a…...

HTML 基础标签——分组标签 <div>、<span> 和基础语义容器

文章目录 1. `<div>` 标签特点用途示例2. `<span>` 标签特点用途示例3. `<fieldset>` 标签特点用途示例4. `<section>` 标签特点用途示例5. `<article>` 标签特点用途示例总结HTML中的分组(容器)标签用于结构化内容,将页面元素组织成逻辑区域…...

SS928V100 ISP常见问题列表

下载链接&#xff1a; https://download.csdn.net/download/quantum7/89948226 1 FAQ 1 1.1 ISP 1 1.1.1 如何解决整体锐度不足 1 1.1.2 如何解决图像发蒙问题&#xff0c;提高通透性 2 1.1.3 如何解决低照度清晰度差 2 1.1.4 如何解决图像清晰度与物体边缘白边和黑边问题…...

AI写诗:自动版大唐宫体诗

大唐学子&#xff0c;手拿一本小卷&#xff08;类书&#xff09;&#xff0c;从中挑选过去他们&#xff08;权威&#xff09;认为好的词来拼接一首诗&#xff0c;此类诗词称作“宫体诗”&#xff0c;在初唐时期甚是流行。 写“宫体诗”的过程有木有那么一丝丝的熟悉&#xff1f…...

Java复习31(PTA)

sdust-Java-字符串集合求并集 分数 15 全屏浏览 切换布局 作者 张峰 单位 山东科技大学 从键盘接收N个英文字符串&#xff08;其中不同的字符串数量大于10&#xff09;&#xff0c;从头开始取5个不同的字符串放入一个集合S1&#xff0c;然后接着取5个不同的字符串放入另一个…...

【Linux系列】Linux 系统中的软连接管理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

@layer(级联层)

在css样式表(文件)中声明layer为样式添加级联层,其意义在于可以使用它重新定义样式的叠层关系. layer后声明的级联层里面的样式将覆盖前声明的级联层里面的相同属性.在级联层外声明的样式会覆盖级联层里面的相同属性样式,同一层级里面的样式冲突,依然按照优先级来计算. 在级联层…...

nginx代理websocket服务

一、nginx代理websocket服务 一&#xff09;nginx代理ws服务 在nginx中&#xff0c;可以通过proxy_pass指令来代理WebSocket服务。 以下是一个示例配置&#xff1a; map $http_upgrade $connection_upgrade {default upgrade; close; }upstream ws_backend {server 127.0.0.1:…...

第二十七章 Vue异步更新之$nextTick

目录 一、概述 二、完整代码 2.1. main.js 2.2. App.vue 一、概述 需求&#xff1a;编辑标题, 弹出显示编辑框自动聚焦 1. 点击编辑&#xff0c;显示编辑框 2. 让编辑框&#xff0c;立刻获取焦点 我们常规的思路可能会编写如下代码来实现&#xff1a; 问题&#xff1a…...

【51 Pandas+Pyecharts | 深圳市共享单车数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 处理起始时间、结束时间2.4 增加骑行时长区间列2.5 增加骑行里程区间列 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 各…...

【Clikhouse 探秘】ClickHouse 物化视图:加速大数据分析的新利器

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…...

线程相关题(线程池、线程使用、核心线程数的设置)

目录 线程安全的什么情况用&#xff1f;情况下用线程安全的类&#xff1f; 线程池线程方面的优化 线程池调优主要涉及以下几个关键参数。 线程不安全原因? 1. 共享资源访问冲突 2. 缺乏原子操作 3. 内存可见性问题 4. 重排序问题 如何解决线程不安全的问题&#xff1…...

2181、合并零之间的节点

2181、[中等] 合并零之间的节点 1、问题描述&#xff1a; 给你一个链表的头节点 head &#xff0c;该链表包含由 0 分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val 0 。 对于每两个相邻的 0 &#xff0c;请你将它们之间的所有节点合并成一个节点&#xff…...