16、Git:开启DevOps之门

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

Git:开启DevOps之门

1. 撤销特定提交的更改

你可以使用 git revert 命令来撤销特定提交所引入的更改。操作时,需要指定想要撤销的提交的哈希值,示例如下:

admin@myhome:~/git-repository$ git revert abc123

这将创建一个新的提交,用于撤销哈希值为 abc123 的提交所引入的更改。需要注意的是, git revert 不会删除提交或破坏历史记录,而是创建一个新提交来撤销之前提交的更改。这意味着更改仍然存在于仓库中,但在当前分支状态下不可见。

若要永久删除提交,可以使用 git reset git filter-branch 命令,但这些命令会永久破坏历史记录,使用时需格外谨慎。

2. 本地与远程Git仓库

在Git中,仓库是文件及其历史记录的集合,还包括用于管理仓库的配置文件。仓库可分为本地仓库和远程仓库。
- 本地仓库 :存储在本地机器上。使用 git init 命令初始化新的Git仓库,或使用 git clone 命令克隆现有仓库时,就创建了本地仓库。在没有网络连接或想在本地保留项目副本时,本地仓库很有用。
- 远程仓库 :存储在服务器上,通过互联网访问。使用 git push 命令将提交推送到远程仓库时,会用本地更改更新远程仓库。远程仓库便于与其他开发者协作,允许多人在同一项目上工作并共享更改。

Git采用分布式版本控制系统(VCS),每个开发者的本地机器上都有完整的仓库副本。这使开发者可以在本地工作,准备好与他人共享更改时再推送到远程仓库,即使在离线状态下也能协作。

git clone 命令用于创建远程Git仓库的本地副本。运行该命令时,会创建一个与仓库同名的新目录,并将所有文件及其历史记录克隆到该目录中。示例如下:

admin@myhome:~/git-repository$ git clone https://github.com/user/repo.git

这将创建一个名为 repo 的新目录,并将位于 https://github.com/user/repo.git 的仓库克隆到该目录中。也可以通过添加参数指定本地目录的不同名称:

admin@myhome:~/git-repository$ git clone https://github.com/user/repo.git my-local-repo

这将创建一个名为 my-local-repo 的新目录,并将仓库克隆到其中。如果使用GitHub等Git托管服务,还可以使用仓库URL的简写版本:

admin@myhome:~/git-repository$ git clone git@github.com:user/repo.git

这将使用SSH协议克隆仓库,需要为账户配置SSH密钥。

3. 与远程仓库交互
  • git pull :用于从远程仓库获取更新并将其合并到本地仓库,是 git fetch (从远程仓库下载更新)和 git merge (将更新合并到本地仓库)的组合。
  • git fetch :从远程仓库下载更新,但不将其合并到本地仓库,而是将更新存储在名为远程跟踪分支的临时区域。可以使用 git fetch 更新远程跟踪分支,查看可用的更改,但需要使用 git merge 将这些更改实际合并到本地仓库。

使用 git fetch 时常见的关键字如下:
| 关键字 | 说明 |
| ---- | ---- |
| origin | 克隆的远程仓库的默认名称,可用于指定要获取更新的远程仓库,也可更改默认名称并添加多个远程仓库 |
| main 或 master | master 是Git仓库中默认分支的名称, main 是GitHub平台引入的新默认名称 |
| REMOTE_HEAD | 指向远程仓库中分支的头提交的特殊引用,可用于获取当前在远程仓库中检出的分支的更新 |
| HEAD | 指向本地仓库中当前分支的头提交的特殊引用 |

以下是使用 git fetch 更新 origin 仓库上 main 分支的示例:

admin@myhome:~/git-repository$ git fetch origin main
From gitlab.com:gstlt/git-repository
 * branch            main     -> FETCH_HEAD

这将下载 origin 仓库上 master 分支的更新,并将其存储在 origin/master 远程跟踪分支中。然后可以使用 git merge 将更新合并到本地仓库:

admin@myhome:~/git-repository$ git merge origin/main
Already up to date.

这将把 origin/master 远程跟踪分支中的更新合并到本地 master 分支中。在这个例子中,没有需要合并的内容。

也可以使用 git pull 在一个命令中完成这两个步骤:

admin@myhome:~/git-repository$ git pull origin main
Already up to date.

这将从 origin 仓库获取更新并将其合并到本地仓库,除非按照前面的建议配置了Git客户端,此时Git会尝试在远程仓库的 main 分支上进行变基操作。

4. git rebase与git merge

git rebase git merge 都用于将一个分支的更改集成到另一个分支,但工作方式略有不同,对仓库的影响也不同。
- git rebase :用于将一系列提交从一个分支应用到另一个分支。运行 git rebase 时,它会查看目标分支中存在但源分支中不存在的提交,并将它们逐个应用到源分支上,就像将源分支的提交重新应用到目标分支上一样。例如,仓库中有 main develop 两个分支, main 是主开发分支, develop 是正在开发的功能分支。在 develop 分支上进行多次提交后,运行 git rebase main ,Git会将这些提交逐个应用到 main 分支上,就像直接在 main 分支上进行的提交一样。
- git merge :用于将一个分支的更改合并到另一个分支。运行 git merge 时,它会查看源分支中的更改,并将其作为一个提交应用到目标分支上,在目标分支上创建一个新提交,包含源分支的所有更改。同样以 main develop 分支为例,在 develop 分支上进行多次提交后,运行 git merge develop ,Git会在 main 分支上创建一个新提交,包含 develop 分支的所有更改。

git rebase 能保持线性历史记录,避免不必要的合并提交,但如果自源分支创建以来目标分支已被修改,可能会导致冲突。 git merge 是更直接的合并更改的方式,但会创建大量合并提交,使仓库历史记录更难阅读,即使使用图形工具也是如此。

5. git diff命令

git diff 命令用于比较仓库中所做的更改,显示文件的两个版本或仓库中两个分支(本地或远程)之间的差异。常见用法如下:
- 比较文件的当前状态与最近一次提交:

admin@myhome:~/git-repository$ git diff path/to/file
  • 比较两个提交之间的差异:
admin@myhome:~/git-repository$ git diff hash1 hash2
  • 比较分支与其上游分支之间的差异:
admin@myhome:~/git-repository$ git diff branch-name @{u}
  • 比较暂存区与最近一次提交之间的差异:
admin@myhome:~/git-repository$ git diff --staged
  • 若已添加一些文件待提交,但在创建提交前想再次确认,可使用:
admin@myhome:~/git-repository$ git diff --cached
  • 比较同一仓库的本地分支和远程分支,需要引用远程分支,可通过执行 git diff 实现:
admin@myhome:~/git-repository$ git diff main origin/main

origin/main 指的是远程仓库名为 origin 的远程分支。

git diff 有助于理解Git仓库中的更改情况,以及提交时这些更改将如何合并。可以使用 git diff 命令的各种选项和参数来指定要比较的文件或分支的版本。

6. 查看提交历史记录

Git会记录对仓库所做的每个提交,可使用 git log 命令查看提交历史记录,该命令会显示仓库中所有提交的列表,以及提交消息和提交日期。常见用例如下:
- 审查仓库历史 :使用 git log 查看仓库的完整提交历史,包括所做的更改及其原因,有助于理解项目随时间的演变。
- 查找bug源头 :在追踪仓库中bug的源头时,使用 git log 查看受影响文件的提交历史,找出引入bug的提交。
- 调试问题 :在排查仓库中的问题时,使用 git log 查看受影响文件的历史记录,了解可能导致问题的更改。

可以使用 git log 的各种选项来定制输出并过滤显示的提交。例如,使用 --author 选项仅显示特定人员所做的提交,使用 --since 选项仅显示最近一个月内所做的提交。

以下是使用 git log 命令的示例:
- 显示当前仓库的提交历史:

admin@myhome:~/git-repository$ git log
commit 9cc1536fb04be3422ce18a6271ab83f419840ae3 (HEAD -> main, origin/main, origin/HEAD)
Author: Grzegorz Adamowicz <grzegorz@devopsfury.com>
Date:   Wed Jan 4 10:13:26 2023 +0100

    Add first version of the table schema

commit fb8a64f0fd7d21c5df7360cac427668c70545c83
Author: Grzegorz Adamowicz <grzegorz@devopsfury.com>
Date:   Tue Jan 3 22:02:25 2023 +0100

    Add testing data, mock Azure class, remove not needed comments

commit ae0ac170f01142dd80bafcf40fd2616cd1b1bc0b
Author: Grzegorz Adamowicz <grzegorz@devopsfury.com>
Date:   Tue Dec 27 14:50:47 2022 +0100

    Initial commit
  • 查看特定文件的提交历史:
admin@myhome:~/git-repository$ git log path/to/file
  • 显示特定分支的提交历史:
admin@myhome:~/git-repository$ git log branch-name
  • 显示一定范围内提交的历史记录:
admin@myhome:~/git-repository$ git log hash1..hash2
  • 以紧凑格式显示提交历史,仅显示提交哈希和消息:
admin@myhome:~/git-repository$ git log --oneline
  • 显示带有差异的提交历史:
admin@myhome:~/git-repository$ git log -p
7. 分支管理

git branch git switch 是用于管理Git仓库中分支的两个命令。
- git branch :用于在仓库中创建、列出或删除分支。创建新分支时,指定分支名称作为参数,示例如下:

admin@myhome:~/git-repository$ git branch new-branch

这将创建一个名为 new-branch 的新分支,基于当前分支。使用 -a 选项列出仓库中的所有分支,包括本地分支和远程跟踪分支:

admin@myhome:~/git-repository$ git branch -a

使用 -d 选项删除分支,但只有当分支已完全合并到上游分支时才能删除,示例如下:

admin@myhome:~/git-repository$ git branch -d old-branch

若要强制删除分支,可以添加 --force 选项或使用 -D 选项:

admin@myhome:~/git-repository$ git branch -D old-branch

删除远程分支需要使用 git push 命令:

admin@myhome:~/git-repository$ git push origin --delete old-branch

这是一个破坏性命令,无法撤销,使用时需谨慎。
- git switch :用于在仓库中切换分支,指定要切换的分支名称作为参数,示例如下:

admin@myhome:~/git-repository$ git switch new-branch

这将切换到 new-branch 分支,并使其成为当前分支。

git branch git switch 命令可根据需要创建新分支、列出可用分支并在分支之间切换。

8. 使用交互式变基压缩提交

使用 git rebase 压缩提交时,首先需要确定要压缩的提交范围,通常通过指定范围中第一个提交和最后一个提交的哈希值来完成。例如,要压缩仓库中的最后三个提交,可以使用以下命令:

admin@myhome:~/git-repository$ git rebase -i HEAD~3

这将打开一个编辑器窗口,显示最后三个提交的列表及一些说明。文件中的每一行代表一个提交,行首以 pick 开头。若要压缩提交,需将 pick 改为 squash s 。示例如下,原始文件内容:

pick abc123 Add feature X
pick def456 Fix bug in feature X
pick ghi789 Add test for feature X

若要将第二个和第三个提交压缩到第一个提交中,将文件修改为:

pick abc123 Add feature X
squash def456 Fix bug in feature X
squash ghi789 Add test for feature X

综上所述,Git提供了丰富的功能和命令,帮助开发者高效地管理项目代码,无论是本地开发还是团队协作,都能发挥重要作用。掌握这些命令和操作技巧,能让开发者在软件开发过程中更加得心应手。

Git:开启DevOps之门

9. Git工作流概述

在软件开发中,良好的工作流能够提高团队协作效率、保证代码质量。Git提供了多种工作流,下面介绍两种常见的工作流:Git工作流和GitHub工作流。

10. Git工作流

Git工作流有多种类型,如集中式工作流、功能分支工作流、Gitflow工作流等。这里以功能分支工作流为例进行说明。

功能分支工作流的流程如下:

graph LR
    A[main分支] --> B[创建功能分支]
    B --> C[在功能分支开发]
    C --> D[完成开发,提交代码]
    D --> E[将功能分支合并到main分支]

具体操作步骤如下:
1. 创建功能分支

admin@myhome:~/git-repository$ git branch feature-branch
admin@myhome:~/git-repository$ git switch feature-branch
  1. 在功能分支进行开发 :在功能分支上进行代码编写、测试等工作。
  2. 提交代码
admin@myhome:~/git-repository$ git add .
admin@myhome:~/git-repository$ git commit -m "完成功能开发"
  1. 将功能分支合并到main分支
admin@myhome:~/git-repository$ git switch main
admin@myhome:~/git-repository$ git merge feature-branch
11. GitHub工作流

GitHub工作流是一种简单且高效的工作流,适合开源项目和小型团队。其流程如下:

graph LR
    A[Fork仓库] --> B[克隆到本地]
    B --> C[创建分支]
    C --> D[在分支开发]
    D --> E[提交代码到本地分支]
    E --> F[将本地分支推送到Fork的仓库]
    F --> G[发起Pull Request]
    G --> H[审核并合并]

具体操作步骤如下:
1. Fork仓库 :在GitHub上点击仓库页面的“Fork”按钮,将仓库复制到自己的账户下。
2. 克隆到本地

admin@myhome:~/git-repository$ git clone https://github.com/your-username/repo.git
  1. 创建分支
admin@myhome:~/git-repository$ git branch new-feature
admin@myhome:~/git-repository$ git switch new-feature
  1. 在分支开发 :进行代码编写和测试。
  2. 提交代码到本地分支
admin@myhome:~/git-repository$ git add .
admin@myhome:~/git-repository$ git commit -m "实现新功能"
  1. 将本地分支推送到Fork的仓库
admin@myhome:~/git-repository$ git push origin new-feature
  1. 发起Pull Request :在GitHub上,切换到自己Fork的仓库,点击“New pull request”按钮,选择要合并的分支,填写描述信息后提交。
  2. 审核并合并 :仓库维护者会对Pull Request进行审核,通过后将代码合并到主仓库。
12. 解决冲突

在使用 git rebase git merge 时,可能会遇到冲突。以下是解决冲突的一般步骤:
1. 检测冲突 :当执行 git rebase git merge 时,如果出现冲突,Git会提示并标记冲突的文件。
2. 编辑冲突文件 :打开冲突的文件,会看到类似如下的标记:

<<<<<<< HEAD
这是当前分支的内容
=======
这是要合并的分支的内容
>>>>>>> branch-name

手动编辑文件,选择保留哪些内容,删除冲突标记。
3. 标记冲突已解决

admin@myhome:~/git-repository$ git add path/to/conflicted-file
  1. 继续操作
    • 如果是 git rebase ,执行:
admin@myhome:~/git-repository$ git rebase --continue
- 如果是`git merge`,执行:
admin@myhome:~/git-repository$ git commit
13. 总结

Git作为一款强大的版本控制系统,为开发者提供了丰富的功能和工具。通过掌握 git revert git clone git pull git rebase git merge 等命令,以及合理运用不同的工作流,开发者能够更好地管理项目代码,提高团队协作效率。同时,在遇到冲突时,也能按照正确的步骤进行解决。希望本文介绍的内容能帮助开发者在使用Git的过程中更加得心应手,提升软件开发的质量和效率。

在实际应用中,开发者可以根据项目的特点和团队的需求,选择合适的工作流和命令组合。不断实践和探索,才能更好地发挥Git的优势,为软件开发带来更多便利。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值