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
- 在功能分支进行开发 :在功能分支上进行代码编写、测试等工作。
- 提交代码 :
admin@myhome:~/git-repository$ git add .
admin@myhome:~/git-repository$ git commit -m "完成功能开发"
- 将功能分支合并到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
- 创建分支 :
admin@myhome:~/git-repository$ git branch new-feature
admin@myhome:~/git-repository$ git switch new-feature
- 在分支开发 :进行代码编写和测试。
- 提交代码到本地分支 :
admin@myhome:~/git-repository$ git add .
admin@myhome:~/git-repository$ git commit -m "实现新功能"
- 将本地分支推送到Fork的仓库 :
admin@myhome:~/git-repository$ git push origin new-feature
- 发起Pull Request :在GitHub上,切换到自己Fork的仓库,点击“New pull request”按钮,选择要合并的分支,填写描述信息后提交。
- 审核并合并 :仓库维护者会对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
-
继续操作
:
-
如果是
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的优势,为软件开发带来更多便利。

346

被折叠的 条评论
为什么被折叠?



