使用Git进行版本控制
1. 理解版本控制
在软件开发过程中,版本控制至关重要。假设两位软件开发者Natasha和Bruce正在全力投入一个名为StoneTracker的新项目。由于不断的修改和修订,项目被拆分成多个程序文件,文件名变得复杂,如UI - 3.2.A - 73.py。他们需要不断沟通正在处理的文件,避免意外覆盖,还创建了多个目录树来存储项目文件的各种修订。这种情况导致项目进展受阻,他们急需版本控制。
版本控制(也称为源代码控制或修订控制)是一种组织各种项目文件并保护其修改的方法或系统。它不仅可以控制程序文件,还能处理纯文本文件、可执行文件、图形、文字处理文档、压缩文件等。
版本控制系统(VCS)提供了一个公共的中央位置来存储和合并项目文件,让你可以访问项目的最新版本。它能防止文件被其他开发者覆盖,消除关于谁正在修改文件的额外沟通。此外,当新开发者加入项目时,如Tony,他可以通过版本控制系统复制最新的StoneTracker项目文件并开始工作。
分布式版本控制系统让项目开发更加轻松。开发者可以离线工作,无需担心网络连接问题。开发工作在本地系统上进行,直到将修改后的文件和VCS元数据副本发送到远程中央系统,此时才需要网络连接。这样还能将工作备份到中央位置。
2005年,Linus Torvalds为Linux项目创建了一个新的版本控制系统——Git。他希望有一个分布式的VCS,能够快速合并文件并提供Linux开发者所需的其他功能。Git是一个流行的高性能分布式VCS,常用于敏捷和持续软件开发环境。
1.1 Git环境的基本概念
要理解Git的基本原理,需要了解其配置中的几个术语:
|术语|描述|
| ---- | ---- |
|工作目录|所有程序文件在此创建、修改和审查,通常是开发者主目录树中的子目录,开发者的计算机系统可以是本地服务器或笔记本电脑|
|暂存区|也称为索引,与工作目录位于同一系统。工作目录中的程序文件通过Git命令(git add)注册到暂存区,使用名为.git的隐藏子目录,通过git init命令创建|
|本地仓库|包含每个项目文件的历史记录,也使用.git子目录。项目树和提交信息通过Git命令(git commit)作为对象存储在.git/objects/目录中,这些数据称为快照,每次提交都会创建一个新的快照,你可以查看旧快照并在需要时恢复到以前的版本|
|远程仓库|通常是基于云的位置,也可以是本地网络上的另一台服务器。知名的远程仓库包括GitHub、GitLab、BitBucket和Launchpad,其中GitHub最受欢迎|
1.2 使用Git作为VCS的好处
- 性能 :除了向远程仓库发送/检索文件外,Git仅使用本地文件进行操作,使用起来更快。
- 历史记录 :Git在文件注册到索引时捕获文件的所有内容。当提交到本地仓库完成时,Git会创建并存储该时间点的快照引用。
- 准确性 :Git使用校验和来保护文件完整性。
- 去中心化 :开发者可以在同一个项目上工作,但不必在同一网络或系统上。
1.3 Git环境的设置步骤
Git工具通常不会默认安装,因此在设置Git环境之前,需要安装git包。安装完成后,为新项目设置Git环境有四个基本步骤:
1.
创建工作目录
:在本地主文件夹中创建一个子目录即可。例如:
$ mkdir MWGuard
$ cd MWGuard
$ pwd
/home/Christine/MWGuard
- 初始化.git/目录 :使用git init命令。示例如下:
$ git init
Initialized empty Git repository in /home/Christine/MWGuard/.git/
$ ls -ld .git
drwxrwxr-x. 7 Christine Christine 119 Feb 6 15:07 .git
- 设置本地仓库选项 :如果是首次在系统上创建.git/子目录,需要修改全局Git仓库的配置文件,包含用户名和电子邮件地址,以便跟踪文件更改。使用git config命令:
$ git config --global user.name "Christine Bresnahan"
$ git config --global user.email "cbresn377@ivytech.edu"
$ git config --get user.name
Christine Bresnahan
$ git config --get user.email
cbresn377@ivytech.edu
可以使用git config –list命令查看所有配置:
$ git config --list
user.name=Christine Bresnahan
user.email=cbresn377@ivytech.edu
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
- 建立远程仓库 :以基于云的远程仓库GitHub为例,你可以在github.com/join设置一个免费的远程仓库。建立后,需要记录它提供的URL,用于将项目文件发送到远程仓库。
2. 使用Git进行提交
当Git环境设置好后,就可以开始使用版本控制了,主要有四个步骤:
1.
创建或修改程序文件
2.
将文件添加到暂存区(索引)
3.
将文件提交到本地仓库
4.
将文件推送到远程仓库
根据团队的工作流程,可能需要在进入下一步之前重复某些步骤。例如,程序员在一天内完成文件后将其添加到暂存区,在一天结束时将项目提交到本地仓库,然后将项目工作推送到远程仓库,供非本地团队成员访问。
2.1 创建示例文件
创建一个简单的shell脚本MyScript.sh作为Git VCS的示例:
$ cat MyScript.sh
#!/bin/bash
#
echo "Hello World"
#
exit
2.2 添加文件到暂存区
使用git add命令将文件添加到暂存区:
$ pwd
/home/Christine/MWGuard
$ git add MyScript.sh
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: MyScript.sh
#
git add命令执行时不会提供任何响应,可使用git status命令查看是否添加成功。你也可以使用git add .命令将当前工作目录中的所有文件同时添加到暂存区的索引。如果工作目录中有不想添加到暂存区索引的文件,可以在工作目录中创建一个.gitignore文件,添加不想包含在索引中的文件和目录名称,git add .命令将忽略这些文件。
2.3 查看暂存区索引文件
使用file命令查看暂存区索引文件的类型:
$ file .git/index
.git/index: Git index, version 2, 1 entries
2.4 提交项目到本地仓库
使用git commit命令将项目提交到本地仓库,-m选项用于添加注释行到COMMIT_EDITMSG文件,帮助跟踪更改:
$ git commit -m "Initial Commit"
[master (root-commit) 6d2370d] Initial Commit
1 file changed, 5 insertions(+)
create mode 100644 MyScript.sh
$ cat .git/COMMIT_EDITMSG
Initial Commit
$ git status
# On branch master
nothing to commit, working directory clean
如果不添加 -m 选项及其参数,会进入vim编辑器手动编辑.git/COMMIT_EDITMSG文件。
2.5 创建并提交README.md文件
对于新项目,建立远程仓库账户后,创建一个Markdown文件README.md,其内容会显示在远程仓库的网页上,描述仓库信息:
$ pwd
/home/Christine/MWGuard
$ ls
MyScript.sh
$ echo "# Milky Way Guardian" > README.md
$ echo "## Programming Project" >> README.md
$ cat README.md
# Milky Way Guardian
## Programming Project
$ git add README.md
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: README.md
#
$ git commit -m "README.md commit"
[master 4541578] README.md commit
1 file changed, 2 insertions(+)
create mode 100644 README.md
2.6 查看Git日志
在将项目推送到远程仓库之前,查看Git日志是个好习惯:
$ git log
commit 45415785c17c213bac9c47ce815b91b6a9ac9f86
Author: Christine Bresnahan <cbresn377@ivytech.edu>
Date: Fri Feb 11 13:49:49 2022 -0500
README.md commit
commit 6d2370d2907345671123aeaaa71e147bd3f08f36
Author: Christine Bresnahan <cbresn377@ivytech.edu>
Date: Wed Feb 9 15:23:11 2022 -0500
Initial Commit
2.7 配置远程仓库地址
使用git remote add origin URL命令配置远程仓库地址:
$ git remote add origin https://github.com/C-Bresnahan/MWGuard.git
$ git remote -v
origin https://github.com/C-Bresnahan/MWGuard.git (fetch)
origin https://github.com/C-Bresnahan/MWGuard.git (push)
可以使用git remote -v命令检查远程地址的状态。如果URL输入错误,可以使用git remote rm origin命令删除远程仓库地址,然后使用正确的URL重新设置。
2.8 推送项目到远程仓库
使用git push命令将项目推送到远程仓库:
$ git push -u origin master
Username for 'https://github.com': C-Bresnahan
Password for 'https://C-Bresnahan@github.com':
Counting objects: 6, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 561 bytes | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://github.com/C-Bresnahan/MWGuard.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
通常远程仓库需要用户名和密码,除非你设置了使用SSH密钥。推送成功后,你可以查看项目。如果是私有仓库,需要登录远程仓库才能查看工作成果。
2.9 从远程仓库拉取文件
项目团队成员可以使用git pull命令从远程仓库拉取最新的项目文件:
$ whoami
Rich
$ git remote add origin https://github.com/C-Bresnahan/MWGuard.git
$ git pull -u origin master
如果拉取项目文件的人在本地仓库中有未上传到远程仓库的特定文件的修改版本,git pull命令将失败,但错误消息会指导如何解决这个问题。
2.10 克隆项目
新的开发团队成员可以使用git clone命令从远程仓库将整个项目(包括.git/文件)复制到本地系统:
$ whoami
Samantha
$ ls
$ git clone https://github.com/C-Bresnahan/MWGuard.git
Cloning into 'MWGuard'...
[...]
remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
$ ls
MWGuard
$ cd MWGuard
$ ls -a
. .. .git MyScript.sh README.md
$ git log
commit 45415785c17c213bac9c47ce815b91b6a9ac9f86
Author: Christine Bresnahan <cbresn377@ivytech.edu>
Date: Fri Feb 11 13:49:49 2022 -0500
README.md commit
commit 6d2370d2907345671123aeaaa71e147bd3f08f36
Author: Christine Bresnahan <cbresn377@ivytech.edu>
Date: Wed Feb 9 15:23:11 2022 -0500
Initial Commit
综上所述,Git是一个强大的版本控制系统,通过合理使用其功能,可以高效地管理项目的版本和协作开发。
3. Git 分支管理
3.1 分支的概念
在 Git 中,分支是一个非常重要的概念。分支允许开发者在不影响主项目的情况下,独立地进行新功能开发、错误修复等工作。每个分支都可以看作是项目的一个独立副本,开发者可以在不同的分支上进行并行开发,最后再将这些分支合并到主分支上。
3.2 创建和切换分支
创建新分支可以使用
git branch
命令,切换分支使用
git checkout
命令。例如,创建一个名为
feature
的新分支并切换到该分支:
$ git branch feature
$ git checkout feature
Switched to branch 'feature'
也可以使用
git checkout -b
命令同时创建并切换到新分支:
$ git checkout -b feature
Switched to a new branch 'feature'
3.3 查看分支
使用
git branch
命令可以查看当前仓库中的所有分支:
$ git branch
master
* feature
星号
*
表示当前所在的分支。
3.4 合并分支
当在分支上的工作完成后,需要将其合并到主分支(通常是
master
)上。首先切换回主分支,然后使用
git merge
命令进行合并:
$ git checkout master
Switched to branch 'master'
$ git merge feature
Updating 6d2370d..4541578
Fast-forward
README.md | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 README.md
上述示例中,
Fast-forward
表示这是一次快进合并,即主分支直接移动到了
feature
分支的位置。
3.5 删除分支
合并完成后,如果不再需要该分支,可以使用
git branch -d
命令删除分支:
$ git branch -d feature
Deleted branch feature (was 4541578).
3.6 分支管理流程
下面是一个简单的分支管理流程图:
graph LR
A[master 分支] --> B[创建 feature 分支]
B --> C[在 feature 分支开发]
C --> D[完成开发]
D --> E[切换到 master 分支]
E --> F[合并 feature 分支到 master]
F --> G[删除 feature 分支]
4. 解决冲突
4.1 冲突的产生
当不同的开发者在不同的分支上对同一文件的同一部分进行了修改,然后尝试合并这些分支时,就会产生冲突。Git 无法自动决定使用哪个修改,因此需要开发者手动解决冲突。
4.2 冲突的表现
当执行
git merge
或
git pull
命令时,如果出现冲突,会在终端输出类似如下的信息:
Auto-merging MyScript.sh
CONFLICT (content): Merge conflict in MyScript.sh
Automatic merge failed; fix conflicts and then commit the result.
同时,冲突的文件中会包含特殊的标记,用于指示冲突的位置:
<<<<<<< HEAD
# 主分支上的内容
=======
# 要合并的分支上的内容
>>>>>>> feature
4.3 解决冲突的步骤
- 编辑冲突文件 :打开冲突的文件,手动删除特殊标记,并选择要保留的内容。可以结合两边的修改,或者只保留某一边的内容。
-
标记冲突已解决
:使用
git add命令将解决冲突后的文件添加到暂存区:
$ git add MyScript.sh
-
提交合并结果
:使用
git commit命令提交合并结果:
$ git commit -m "Resolve conflict in MyScript.sh"
4.4 冲突解决示例
假设
MyScript.sh
文件在
master
分支和
feature
分支上都有修改,合并时产生冲突。以下是解决冲突的具体步骤:
$ git merge feature
Auto-merging MyScript.sh
CONFLICT (content): Merge conflict in MyScript.sh
Automatic merge failed; fix conflicts and then commit the result.
$ vim MyScript.sh # 编辑冲突文件,手动解决冲突
$ git add MyScript.sh
$ git commit -m "Resolve conflict in MyScript.sh"
5. Git 标签
5.1 标签的作用
Git 标签用于标记代码仓库中的特定版本,通常用于发布版本。标签可以看作是对某个提交的一个友好的别名,方便开发者快速定位到特定的版本。
5.2 创建标签
创建轻量级标签可以使用
git tag
命令,后面跟上标签名:
$ git tag v1.0
创建带有注释的附注标签可以使用
-a
选项:
$ git tag -a v1.0 -m "Release version 1.0"
5.3 查看标签
使用
git tag
命令可以查看当前仓库中的所有标签:
$ git tag
v1.0
5.4 推送标签到远程仓库
默认情况下,
git push
命令不会推送标签到远程仓库。需要使用
git push origin <tagname>
命令推送单个标签,或者使用
git push origin --tags
命令推送所有标签:
$ git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/C-Bresnahan/MWGuard.git
* [new tag] v1.0 -> v1.0
5.5 删除标签
删除本地标签使用
git tag -d
命令:
$ git tag -d v1.0
Deleted tag 'v1.0' (was 6d2370d)
删除远程标签使用
git push origin :refs/tags/<tagname>
命令:
$ git push origin :refs/tags/v1.0
To https://github.com/C-Bresnahan/MWGuard.git
- [deleted] v1.0
5.6 标签管理总结
| 操作 | 命令 |
|---|---|
| 创建轻量级标签 |
git tag <tagname>
|
| 创建附注标签 |
git tag -a <tagname> -m "注释"
|
| 查看标签 |
git tag
|
| 推送单个标签到远程 |
git push origin <tagname>
|
| 推送所有标签到远程 |
git push origin --tags
|
| 删除本地标签 |
git tag -d <tagname>
|
| 删除远程标签 |
git push origin :refs/tags/<tagname>
|
通过以上对 Git 分支管理、冲突解决和标签管理的介绍,你可以更加高效地使用 Git 进行版本控制和团队协作开发。合理运用这些功能,可以提高项目的开发效率和代码质量。
Git版本控制全流程详解
超级会员免费看
21

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



