本教程旨在为参与竞赛团队提供一套基于 TortoiseGit 和 Visual Studio Code (VS Code) 的高效 Git 协作工作流程。我们将涵盖从项目初始化到日常开发、冲突解决及高级技巧等多个方面,助力团队成员顺畅协作,共同完成项目。
在项目开发中,合理的分支策略是保证代码质量和协作效率的关键。针对我们5人开发团队,推荐采用 main
和 develop
的双分支模型,并辅以个人 功能分支 的工作方式。
main
分支:
develop
分支合并,并经过严格的代码审查。develop
分支:
main
分支的预备版本。团队成员将功能分支合并到此。feature/xxx
, bugfix/xxx
):
develop
分支创建自己的独立功能分支。在此分支上进行开发、测试,完成后再合并回 develop
分支。作为团队的队长或项目初始化者,你需要负责创建远程仓库并在本地进行首次提交和分支设置。
xf-smart-car
。D:\Projects
),创建一个新的文件夹,例如命名为 XFSmartCarProject
。XFSmartCarProject
文件夹,右键点击空白处。Git Create repository here...
(或 Git 创建仓库于此...
)。Make bare
选项(裸仓库通常用于服务器端,不适用于本地工作目录)。OK
。此时,XFSmartCarProject
文件夹内部会生成一个隐藏的 .git
文件夹,表示这是一个本地 Git 仓库。XFSmartCarProject
文件夹内创建一个 README.md
文件(用于项目说明),并写入基本信息。README.md
文件 -> Git Add
。这将把文件添加到暂存区。Git Commit -> "main"
(或 Git 提交 -> "main"
)。
Message
(信息) 框内输入提交信息,例如 Initial commit
。Author
(作者) 和 Committer
(提交者) 信息为你本人,这应在Git环境配置阶段完成。README.md
文件以确保它被包含在本次提交中。Commit
按钮完成首次提交。main
分支:
TortoiseGit
-> Settings
(或 TortoiseGit
-> 设置
)。Git
-> Remote
(或 Git
-> 远程
)。Remote
文本框中输入 origin
(这是远程仓库的约定俗成名称)。URL
文本框中,粘贴你从远程托管服务(如 Gitee)获取到的仓库 HTTPS 或 SSH URL(推荐使用 HTTPS,因为它通常更易于配置和使用)。Add New/Save
(或 添加新项/保存
)。OK
关闭设置窗口。main
分支到远程:右键点击文件夹空白处 -> Git Push...
(或 Git 推送...
)。
Local
(本地) 选择 main
分支,Remote
(远程) 选择 origin/main
。Local Branch
下方的 Track remote branch
(跟踪远程分支) 选项通常会自动勾选。OK
。如果提示输入远程仓库的用户名和密码,请正确输入。main
分支及其首次提交已成功推送到远程仓库。develop
分支并推送到远程:
TortoiseGit
-> Create Branch...
(或 TortoiseGit
-> 创建分支...
)。Branch name
(分支名称) 处输入 develop
。HEAD
(即当前所在的 main
分支)。Switch to new branch
(切换到新分支)。OK
。现在,你的本地仓库已切换到 develop
分支。Git Push...
。
Local
(本地) 选择 develop
,Remote
(远程) 选择 origin/develop
。Track remote branch
。OK
。main
和 develop
两个分支,项目初始化完成。作为团队的其他成员,你只需将远程仓库克隆到本地即可开始工作。
D:
盘下创建一个 Projects
文件夹用于存放所有项目。Projects
文件夹,右键点击空白处。Git Clone...
(或 Git 克隆...
)。URL
文本框中粘贴远程仓库 URL。Directory
(目录) 处指定本地项目名称(例如 xf-smart-car
)。TortoiseGit 会自动帮你创建这个文件夹。OK
。如果需要,输入远程仓库的凭据。Projects
文件夹下会有一个 xf-smart-car
文件夹,其中包含了远程仓库的所有内容。develop
分支:
xf-smart-car
文件夹,右键点击空白处。TortoiseGit
-> Switch/Checkout...
(或 TortoiseGit
-> 切换/检出...
)。develop
分支。OK
。develop
分支,可以开始你的开发任务了。本节将详细介绍在 TortoiseGit 和 VS Code 中进行日常 Git 操作的步骤。
在每次开始工作或进行重大操作前,务必先从远程仓库拉取(Pull)最新代码,确保你的本地 develop
分支是最新的,避免不必要的冲突。
Git Pull...
(或 Git 拉取...
)。origin
远程仓库拉取当前分支 develop
的最新代码)。OK
。文件
-> 打开文件夹
(或 Ctrl+K Ctrl+O
) 打开你的项目文件夹。源代码管理
(Git 图标)。...
) -> 拉取
(Pull)。拉取 (变基)
(Pull (Rebase)) 或 拉取 (合并)
(Pull (Merge))。
develop
分支上使用 拉取 (变基)
,有助于保持提交历史的整洁。为每个新功能或 Bug 修复创建独立的功能分支是团队协作的最佳实践,可以有效隔离开发,降低风险。
develop
分支(可以通过右键菜单或 Git Show Log
查看当前分支)。TortoiseGit
-> Create Branch...
(或 TortoiseGit
-> 创建分支...
)。Branch name
(分支名称) 处输入你的功能分支名,例如 feature/voice-control
(开发语音控制功能) 或 bugfix/qr-code-bug
(修复二维码识别 Bug)。Switch to new branch
(切换到新分支)。OK
。develop
)。从...创建新分支
(Create new branch from…)。feature/voice-control
。develop
)。这是日常开发的核心环节,用于记录你的代码变更历史。
Git Commit -> "your-feature-branch"
。弹出的提交窗口中会列出所有被修改、新增或删除的文件,并用不同颜色或图标标识其状态。源代码管理
(Git 图标)。更改
(Changes) 部分会列出所有未被 Git 暂存的修改。更改
中的文件上,点击 +
图标(或 暂存更改
)将其暂存。更改
标题旁边的 +
图标,暂存所有更改。暂存的更改
(Staged Changes) 部分。Message
(信息) 框中输入清晰、简洁的提交信息(例如 feat: 实现智能车语音唤醒启动
)。Commit
按钮完成提交。源代码管理
面板顶部的 消息
(Message) 文本框中输入提交信息。√
(提交) 按钮。将你的功能分支代码推送到远程仓库,以便团队成员可以看到你的进度或进行代码审查。
Git Push...
(或 Git 推送...
)。Local
(本地) 选择你当前的功能分支(例如 feature/voice-control
),Remote
(远程) 通常会自动选择 origin/<你的功能分支名>
。Local Branch
(本地分支) 下方 Track remote branch
(跟踪远程分支) 选项通常会自动勾选。OK
。源代码管理
(Git 图标)。推送到...
(Push To…) 图标 (一个向上箭头的图标)。origin
。发布分支
(Publish Branch) 即可。develop
(Merge)当你的功能开发完成并通过自测后,需要将其代码集成到 develop
主开发分支。
推荐流程:先在远程仓库发起 Pull Request (PR) / Merge Request (MR)
这是最推荐和规范的团队协作方式,有助于代码审查和质量控制。
Pull Request
或 Merge Request
页面并点击创建按钮。feature/voice-control
)。develop
分支。git push
到你的功能分支,PR 会自动更新,审查人会看到最新的更改。Merge
(合并) 按钮。Squash and Merge
(壁球式合并,将功能分支的所有提交合并成 develop
分支上的一个提交) 或 Rebase and Merge
(变基合并,将功能分支的提交线性地应用到 develop
的最新提交之上)。这两种方式都有助于保持 develop
分支历史的整洁。main
或 develop
分支上直接合并功能分支,除非你们团队有特殊约定且所有成员都非常清楚并能承担由此带来的风险。如果团队决定直接在本地合并 (不推荐,但作为备用方案):
develop
分支:
TortoiseGit
-> Switch/Checkout...
-> 在弹出的窗口中选择 develop
分支 -> 点击 OK
。develop
分支。develop
最新代码 (非常重要,确保你的本地 develop
分支是最新状态):
Git Pull...
-> 点击 OK
。源代码管理
(Git 图标) -> 顶部 ...
-> 拉取
-> 选择 拉取 (变基)
或 拉取 (合并)
。TortoiseGit
-> Merge...
(或 TortoiseGit
-> 合并...
)。
Merge
窗口中,Branch
(分支) 选择你的功能分支(例如 feature/voice-control
)。Merge
策略 (通常是三方合并)。OK
。develop
分支。源代码管理
(Git 图标)。...
(省略号菜单) -> 分支
(Branches) -> 合并来自...
(Merge Branch…)。develop
分支到远程:
Git Push...
-> 点击 OK
。源代码管理
(Git 图标) -> 顶部 推送到...
图标。develop
并推送到远程,通常可以删除该功能分支以保持仓库的整洁。
TortoiseGit
-> Delete Branch...
-> 勾选你的功能分支 -> 点击 OK
。删除分支
(Delete Branch)。Git Push...
-> 点击 Manage remotes
(管理远程) 按钮 -> 在弹出的对话框中选择 origin
-> 点击 Delete branch
(删除分支) -> 在弹出的输入框中输入你要删除的远程功能分支名称 -> 点击 OK
。源代码管理
(Git 图标) -> 顶部 ...
(省略号菜单) -> 拉取/推送
(Pull/Push) -> 删除远程分支
(Delete Remote Branch…) -> 在列表中选择要删除的远程功能分支。develop
合并到 main
(发布/比赛版本准备)当 develop
分支的代码已经通过了充分测试,并且稳定到足以用于比赛或发布时,可以将其合并到 main
分支。此操作通常由队长或指定发布负责人执行。
切换到 main
分支:
TortoiseGit
-> Switch/Checkout...
-> 选择 main
分支 -> 点击 OK
。main
分支。拉取 main
最新代码 (确保你的本地 main
分支是最新的状态):
Git Pull...
-> 点击 OK
。源代码管理
(Git 图标) -> 顶部 ...
-> 拉取
-> 选择 拉取 (变基)
或 拉取 (合并)
。合并 develop
分支到 main
:
TortoiseGit
-> Merge...
-> Branch
(分支) 选择 develop
-> 点击 OK
。源代码管理
(Git 图标) -> 顶部 ...
-> 分支
(Branches) -> 合并来自...
(Merge Branch…) -> 在弹出的列表中选择 develop
。解决可能的冲突 (理论上,如果 main
分支在此期间没有独立提交,则不应产生冲突)。
推送合并后的 main
分支到远程:
Git Push...
-> 点击 OK
。源代码管理
(Git 图标) -> 顶部 推送到...
图标。为比赛版本打标签 (Tag) (推荐):
为比赛版本打上标签是一个好习惯,可以方便地回溯和管理不同比赛阶段的代码版本。
TortoiseGit
-> Create Tag...
(或 TortoiseGit
-> 创建标签...
)。Tag name
(标签名称) 处输入标签名,例如 v1.0.0-competition
。Message
(信息) 框中输入标签注释,例如 2025年讯飞智能车比赛版本 V1.0.0
。OK
。Git Push...
-> 勾选 Include Tags
(包含标签) 选项 -> 点击 OK
。源代码管理
(Git 图标) -> 顶部 ...
-> 标签
(Tags) -> 创建新标签
(Create New Tag…)。推送到...
图标时,VS Code 会弹出提示是否推送标签,选择 推送标签
(Push Tags)。合并冲突是团队协作中常见的场景,当两个分支修改了同一个文件的同一部分时就会发生。掌握冲突解决技巧至关重要。
Merge
或 Pull
操作后,如果发生冲突,会弹出一个窗口提示冲突文件列表。受冲突影响的文件在文件管理器中会显示红色感叹号的图标。源代码管理
面板中,冲突文件会显示在 合并冲突
(Merge Conflicts) 部分,并有特殊的冲突图标提示。VS Code 内置的冲突解决工具非常强大,强烈推荐使用。
<<<<<<< HEAD
# 这里是当前分支(例如 develop)的代码,通常是你的本地改动
=======
# 这里是传入分支(例如 feature/your-feature-name)的代码,通常是你要合并进来的改动
>>>>>>> feature/your-feature-name
在冲突区域上方,VS Code 会提供以下按钮:
接受当前更改
(Accept Current Change):保留 HEAD
(当前分支) 的代码,丢弃传入分支的代码。接受传入更改
(Accept Incoming Change):保留传入分支的代码,丢弃 HEAD
(当前分支) 的代码。接受两边更改
(Accept Both Changes):同时保留 HEAD
和传入分支的代码。比较更改
(Compare Changes):打开一个并排的 diff 视图,让你更仔细地比较两边的代码差异,帮助你做出决策。<<<<<<<
、=======
和 >>>>>>>
这些标记,然后根据实际需求,将两边的代码进行整合,使其成为你最终想要的代码逻辑。TortoiseGit
-> Resolved
(已解决)。然后,右键点击文件夹空白处 -> Git Commit
,在提交窗口中勾选所有已解决的文件。合并冲突
区域移动到 更改
区域。你需要像普通提交一样,将已解决的文件添加到暂存区(点击旁边的 +
图标)。VS Code 会自动识别这是合并提交。Commit
。源代码管理
面板顶部的 消息
文本框中,通常会有一个预填充的合并提交信息(例如 Merge branch 'feature/your-feature-name' into develop
),可以直接点击 √
(提交) 按钮。这些技巧有助于在特定场景下更好地管理提交历史,但部分操作(如 reset --hard
和强制推送)可能会修改历史,请务必谨慎使用,并在公共分支上操作前与团队沟通。
修改最近一次提交 (git commit --amend
):
如果你刚刚提交了,但发现提交信息有误,或者漏掉了一些文件,并且这个提交还没有推送到远程。
Git Add
)。Git Commit
-> 勾选 Amend Last Commit
(修正上一次提交) 选项。Message
(信息) 框中修改提交信息(如果需要),然后点击 Commit
。源代码管理
面板顶部 ...
(省略号菜单) -> 提交
(Commit) -> 修正上一次提交
(Amend Last Commit)。git push --force
或 git push --force-with-lease
)。撤销已经提交的修改 (git revert
):
如果你想撤销之前的某个提交,但又想保留 Git 历史记录(不重写历史),可以使用 git revert
。它会创建一个新的“撤销”提交,将指定提交的更改反向应用。这在公共分支上是安全的。
TortoiseGit
-> Show Log
(显示日志)。Revert changes by this commit
(通过此提交撤销更改)。源代码管理
(Git 图标) -> 顶部 ...
-> 提交
(Commit) -> 查看提交
(View Commit History)。Revert Commit
(撤销提交)。重置提交到某个状态 (git reset
):
git reset
会重写历史,将分支指针移动到指定的提交。此操作会改变历史记录,请慎用!尤其是在已推送到远程的公共分支上。
TortoiseGit
-> Show Log
。Reset "your-branch-name" to this...
(将 “你的分支名” 重置到此…)。Hard
(硬):危险! 将分支指针移到指定提交,并丢弃所有工作目录和暂存区的更改。Mixed
(混合,默认):将分支指针移到指定提交,保留更改在工作目录,但不会保留在暂存区。Soft
(软):将分支指针移到指定提交,保留更改在暂存区。OK
。源代码管理
(Git 图标) -> 顶部 ...
-> 提交
-> 查看提交
(View Commit History)。重置 HEAD
(Reset HEAD…)。--soft
, --mixed
, --hard
)。*如果重置的提交已经推送到远程,你需要强制推送 (git push --force
或 git push --force-with-lease
) 来更新远程仓库。在 TortoiseGit 的 Push 窗口中,可以勾选 Force
(强制) 选项。在 VS Code 中,点击推送按钮时可能会提示是否强制推送。再次强调:强制推送公共分支非常危险,务必提前与团队成员沟通并获得同意!
git rebase -i
)git rebase -i
(交互式变基) 是一个强大的工具,可以用来修改、合并、删除、重排你尚未推送到公共分支的本地提交历史,使历史更清晰、简洁。
TortoiseGit
-> Rebase...
(或 TortoiseGit
-> 变基...
)。Rebase
窗口中,选择 Branch
(分支) 为 develop
(即你的功能分支要变基到 develop
的最新提交之上)。Interactive Rebase
(交互式变基)。Start Rebase
(开始变基)。Edit
更改提交、Squash
合并提交、Drop
删除提交、Revert
撤销提交)。Continue Rebase
(继续变基) 完成整个过程。Git Bash
) 来完成。Git Bash Here
),进入你的项目目录。git rebase -i HEAD~N
(其中 N
是你想操作的最近 N
个提交)。git rebase --continue
继续 Rebase 过程。git fetch
vs git pull
理解 fetch
和 pull
的区别对于掌握 Git 至关重要。
git fetch
:origin/develop
指向的最新提交),但你的本地分支(例如 develop
)不会移动。
Git Fetch
。源代码管理
(Git 图标) -> 顶部 ...
-> 拉取
-> 抓取
(Fetch)。git pull
:git fetch
后再执行 git merge
(默认行为) 或 git rebase
(如果配置了)。它会下载最新更改并立即合并到你当前的分支。
Git Pull...
。源代码管理
(Git 图标) -> 顶部 拉取
(向下箭头) 图标或 ...
-> 拉取
。良好的团队协作规范是项目成功的关键。
Conventional Commits
规范(如 feat: 实现智能车语音唤醒功能
、fix: 解决IMU数据异常问题
)。清晰的提交信息能帮助团队成员快速理解每次更改的目的和内容。
feat
: 新功能 (e.g., feat: Implement voice wake-up for robot
)fix
: Bug 修复 (e.g., fix: Resolve incorrect QR code scanning
)docs
: 文档更新 (e.g., docs: Update project README with setup instructions
)style
: 代码格式或风格调整 (不影响代码逻辑)refactor
: 代码重构 (不添加功能,不修复 Bug)chore
: 构建过程或辅助工具的变动develop
或 main
分支上进行改动。develop
同步代码到本地功能分支:develop
分支拉取最新代码到你的本地 develop
分支。然后,考虑将最新的 develop
代码合并或变基到你的功能分支,以避免长时间不同步导致的大量冲突。
git checkout feature/your-feature
git pull origin develop
(进行合并) 或 git rebase develop
(进行变基)。develop
之前,通过远程仓库的 PR/MR 功能进行代码审查。这有助于提高代码质量,发现潜在问题,并促进团队成员之间的知识共享。main
分支保护:main
分支,只能通过拉取请求进行合并。同样,develop
分支也可以考虑设置保护规则,限制直接推送,强制通过 PR/MR 合并。.gitignore
)为了避免将不必要的文件(如编译生成的文件、IDE 配置文件、日志文件、临时文件、虚拟环境等)提交到 Git 仓库,你需要创建一个 .gitignore
文件。
在项目根目录下创建(或打开)名为 .gitignore
的文件,然后将以下内容复制进去。请根据你们项目实际使用的语言和工具进行调整。
# 操作系统生成文件
Thumbs.db # Windows 系统文件
# 编译生成文件 (根据你们的ROS和Gazebo项目需要)
*.o # 目标文件
*.a # 静态库文件
*.so # 共享库文件
*.lo
*.la
*.pyc # Python 编译缓存文件
__pycache__/ # Python 缓存目录
# 依赖管理文件
/node_modules/ # Node.js 项目的依赖目录
/build/ # C/C++ 项目的构建目录
[cite_start]/devel/ # ROS 工作空间编译目录 [cite: 31]
/install/ # ROS 2 安装目录 (如果使用ROS 2)
/log/ # ROS 日志目录
.ros/ # ROS 相关文件
# IDE 和编辑器特定文件
.idea/ # IntelliJ / PyCharm 等JetBrains IDE 的项目文件
.vscode/ # VS Code 的工作区配置和设置
*.sublime-project
*.sublime-workspace
# 日志文件
*.log
log/
tmp/
# 临时文件
*~
*.tmp
temp/
# 虚拟环境 (Python)
.venv/
venv/
env/
# 其他可能忽略的文件
*.bak # 备份文件
*.swp # Vim 交换文件
*.orig
.gitignore
:.gitignore
文件。Git Commit
时,被 .gitignore
规则忽略的文件将不会出现在提交列表中。如果你不小心追踪了一个本应被忽略的文件,想要将其从 Git 仓库中移除并添加到忽略列表,可以右键该文件 -> TortoiseGit
-> Delete and add to ignore list
(删除并添加到忽略列表)。源代码管理
面板中,被 .gitignore
规则忽略的文件不会出现在 更改
列表中。如果一个已追踪的文件你不小心提交了,后来决定要忽略它,你需要先通过 Git 命令将其从 Git 历史中移除 (git rm --cached
),然后将其添加到 .gitignore
文件中。