本教程旨在为参与竞赛团队提供一套基于 TortoiseGit 和 Visual Studio Code (VS Code) 的高效 Git 协作工作流程。我们将涵盖从项目初始化到日常开发、冲突解决及高级技巧等多个方面,助力团队成员顺畅协作,共同完成项目。
前言:团队协作基石——Git分支策略
在项目开发中,合理的分支策略是保证代码质量和协作效率的关键。针对我们5人开发团队,推荐采用 main
和 develop
的双分支模型,并辅以个人 功能分支 的工作方式。
main
分支:- 作用:作为稳定、可发布的代码基线,所有用于比赛或演示的代码最终会合并到此分支。
- 稳定性:最高。通常会设置分支保护,限制直接提交,所有更改需通过
develop
分支合并,并经过严格的代码审查。
develop
分支:- 作用:主要开发分支,集成所有新功能、bug 修复和实验性代码。
- 稳定性:次高,是
main
分支的预备版本。团队成员将功能分支合并到此。
- 功能分支 (如
feature/xxx
,bugfix/xxx
):- 作用:每个团队成员在开发新功能或修复bug时,都应从
develop
分支创建自己的独立功能分支。在此分支上进行开发、测试,完成后再合并回develop
分支。
- 作用:每个团队成员在开发新功能或修复bug时,都应从
1. 团队项目初始化与克隆
1.1 场景:队长/项目初始化者操作 (创建和推送仓库)
作为团队的队长或项目初始化者,你需要负责创建远程仓库并在本地进行首次提交和分支设置。
- 在远程托管服务(如 Gitee、GitHub 或 GitLab)上创建空仓库。建议命名简洁且具辨识度,例如
xf-smart-car
。 - 在本地创建项目目录:
在你的电脑上选择一个合适的路径(例如D:\Projects
),创建一个新的文件夹,例如命名为XFSmartCarProject
。 - 通过 TortoiseGit 初始化本地仓库:
- 进入
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
两个分支,项目初始化完成。
- 在推送窗口中,
- 右键点击文件夹空白处 ->
1.2 场景:其他团队成员操作 (克隆现有仓库)
作为团队的其他成员,你只需将远程仓库克隆到本地即可开始工作。
- 获取远程仓库 URL:从队长或项目仓库页面获取远程仓库的 HTTPS 或 SSH URL。
- 选择本地存放位置:例如,在
D:
盘下创建一个Projects
文件夹用于存放所有项目。 - 通过 TortoiseGit 克隆仓库:
- 进入
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
分支,可以开始你的开发任务了。
- 进入
2. 日常开发工作流程
本节将详细介绍在 TortoiseGit 和 VS Code 中进行日常 Git 操作的步骤。
2.1 场景:从远程仓库同步最新代码 (Pull)
在每次开始工作或进行重大操作前,务必先从远程仓库拉取(Pull)最新代码,确保你的本地 develop
分支是最新的,避免不必要的冲突。
- TortoiseGit 操作:
- 在项目文件夹内右键点击空白处。
- 选择
Git Pull...
(或Git 拉取...
)。 - 在弹出的拉取窗口中,通常保持默认配置即可(即从
origin
远程仓库拉取当前分支develop
的最新代码)。 - 点击
OK
。
- VS Code 操作:
- 打开 VS Code,通过
文件
->打开文件夹
(或Ctrl+K Ctrl+O
) 打开你的项目文件夹。 - 点击左侧活动栏的
源代码管理
(Git 图标)。 - 在顶部工具栏的省略号菜单中 (三个点
...
) ->拉取
(Pull)。 - 你可以选择
拉取 (变基)
(Pull (Rebase)) 或拉取 (合并)
(Pull (Merge))。- 拉取 (合并):会创建一个新的合并提交,将远程更改并入你的本地分支。
- 拉取 (变基):会尝试将你的本地提交“移动”到远程最新提交之上,使提交历史保持线性。推荐在
develop
分支上使用拉取 (变基)
,有助于保持提交历史的整洁。
- 打开 VS Code,通过
2.2 场景:创建和切换功能分支 (Branch & Checkout)
为每个新功能或 Bug 修复创建独立的功能分支是团队协作的最佳实践,可以有效隔离开发,降低风险。
- TortoiseGit 操作:
- 确保你当前位于
develop
分支(可以通过右键菜单或Git Show Log
查看当前分支)。 - 右键点击文件夹空白处 ->
TortoiseGit
->Create Branch...
(或TortoiseGit
->创建分支...
)。 - 在
Branch name
(分支名称) 处输入你的功能分支名,例如feature/voice-control
(开发语音控制功能) 或bugfix/qr-code-bug
(修复二维码识别 Bug)。 - 勾选
Switch to new branch
(切换到新分支)。 - 点击
OK
。
- 确保你当前位于
- VS Code 操作:
- 点击 VS Code 左下角的状态栏,那里会显示当前分支名称(例如
develop
)。 - 点击分支名称,在弹出的命令面板中选择
从...创建新分支
(Create new branch from…)。 - 输入新分支名称,例如
feature/voice-control
。 - 选择从哪个分支创建(通常是
develop
)。 - 创建完成后,VS Code 状态栏会显示你已切换到新创建的功能分支。
- 点击 VS Code 左下角的状态栏,那里会显示当前分支名称(例如
2.3 场景:进行代码更改、暂存和提交 (Add & Commit)
这是日常开发的核心环节,用于记录你的代码变更历史。
- 修改文件:在 VS Code 中打开并编辑你的项目代码。
- 查看文件状态:
- TortoiseGit:在项目文件夹内右键点击空白处 ->
Git Commit -> "your-feature-branch"
。弹出的提交窗口中会列出所有被修改、新增或删除的文件,并用不同颜色或图标标识其状态。 - VS Code:点击左侧活动栏的
源代码管理
(Git 图标)。更改
(Changes) 部分会列出所有未被 Git 暂存的修改。
- TortoiseGit:在项目文件夹内右键点击空白处 ->
- 将更改添加到暂存区:
- TortoiseGit:在提交窗口中,直接勾选你想要包含在本次提交中的文件。
- VS Code:
- 将鼠标悬停在
更改
中的文件上,点击+
图标(或暂存更改
)将其暂存。 - 或者点击
更改
标题旁边的+
图标,暂存所有更改。 - 被暂存的文件会移动到
暂存的更改
(Staged Changes) 部分。
- 将鼠标悬停在
- 提交更改:
- TortoiseGit:
- 在提交窗口的
Message
(信息) 框中输入清晰、简洁的提交信息(例如feat: 实现智能车语音唤醒启动
)。 - 点击
Commit
按钮完成提交。
- 在提交窗口的
- VS Code:
- 在
源代码管理
面板顶部的消息
(Message) 文本框中输入提交信息。 - 点击顶部的
√
(提交) 按钮。
- 在
- TortoiseGit:
2.4 场景:推送功能分支到远程仓库 (Push)
将你的功能分支代码推送到远程仓库,以便团队成员可以看到你的进度或进行代码审查。
- TortoiseGit 操作:
- 右键点击文件夹空白处 ->
Git Push...
(或Git 推送...
)。 - 在推送窗口中,
Local
(本地) 选择你当前的功能分支(例如feature/voice-control
),Remote
(远程) 通常会自动选择origin/<你的功能分支名>
。 - 首次推送时,
Local Branch
(本地分支) 下方Track remote branch
(跟踪远程分支) 选项通常会自动勾选。 - 点击
OK
。
- 右键点击文件夹空白处 ->
- VS Code 操作:
- 点击左侧活动栏的
源代码管理
(Git 图标)。 - 点击顶部工具栏中的
推送到...
(Push To…) 图标 (一个向上箭头的图标)。 - 如果提示选择远程仓库,通常选择
origin
。 - 如果你的本地分支是首次推送到远程,VS Code 会提示你是否发布分支,点击
发布分支
(Publish Branch) 即可。
- 点击左侧活动栏的
2.5 场景:将功能分支合并到 develop
(Merge)
当你的功能开发完成并通过自测后,需要将其代码集成到 develop
主开发分支。
推荐流程:先在远程仓库发起 Pull Request (PR) / Merge Request (MR)
这是最推荐和规范的团队协作方式,有助于代码审查和质量控制。
- 推送你的功能分支到远程 (参照 2.4 场景)。
- 在远程仓库网站 (Gitee/GitHub/GitLab) 上发起 PR/MR:
- 登录到你的远程仓库网站,进入你的项目页面。
- 通常,在你推送新分支后,网站会有醒目的提示,询问你是否要创建 Pull Request。如果没有,请手动导航到
Pull Request
或Merge Request
页面并点击创建按钮。 - 选择源分支 (Source Branch):你的功能分支 (例如
feature/voice-control
)。 - 选择目标分支 (Target Branch):
develop
分支。 - 填写 PR 的标题和详细描述,清晰地说明你完成了什么功能、解决了什么问题。
- 将此 PR 分配给团队成员进行代码审查(通常是队长或指定的技术负责人)。
- 代码审查 (Code Review):
- 团队成员会查看你提交的代码,并可能在 PR 页面上提出评论和修改意见。
- 根据反馈,继续在你的本地功能分支上进行修改和提交。
- 每次修改后,只需正常
git push
到你的功能分支,PR 会自动更新,审查人会看到最新的更改。
- 合并 PR/MR:
- 当所有代码审查通过后,队长或指定的审查人会在远程仓库网站上点击
Merge
(合并) 按钮。 - 在合并选项中,通常会选择
Squash and Merge
(壁球式合并,将功能分支的所有提交合并成develop
分支上的一个提交) 或Rebase and Merge
(变基合并,将功能分支的提交线性地应用到develop
的最新提交之上)。这两种方式都有助于保持develop
分支历史的整洁。 - 切勿直接在
main
或develop
分支上直接合并功能分支,除非你们团队有特殊约定且所有成员都非常清楚并能承担由此带来的风险。
- 当所有代码审查通过后,队长或指定的审查人会在远程仓库网站上点击
如果团队决定直接在本地合并 (不推荐,但作为备用方案):
- 切换到
develop
分支:- TortoiseGit:右键点击文件夹空白处 ->
TortoiseGit
->Switch/Checkout...
-> 在弹出的窗口中选择develop
分支 -> 点击OK
。 - VS Code:点击 VS Code 左下角的状态栏分支名称 -> 在弹出的命令面板中选择
develop
分支。
- TortoiseGit:右键点击文件夹空白处 ->
- 拉取
develop
最新代码 (非常重要,确保你的本地develop
分支是最新状态):- TortoiseGit:右键点击文件夹空白处 ->
Git Pull...
-> 点击OK
。 - VS Code:点击左侧
源代码管理
(Git 图标) -> 顶部...
->拉取
-> 选择拉取 (变基)
或拉取 (合并)
。
- TortoiseGit:右键点击文件夹空白处 ->
- 合并你的功能分支:
- TortoiseGit:右键点击文件夹空白处 ->
TortoiseGit
->Merge...
(或TortoiseGit
->合并...
)。- 在
Merge
窗口中,Branch
(分支) 选择你的功能分支(例如feature/voice-control
)。 - 保持默认的
Merge
策略 (通常是三方合并)。 - 点击
OK
。
- 在
- VS Code:
- 确保你当前位于
develop
分支。 - 点击左侧
源代码管理
(Git 图标)。 - 点击顶部
...
(省略号菜单) ->分支
(Branches) ->合并来自...
(Merge Branch…)。 - 在弹出的列表中选择你的功能分支。
- 确保你当前位于
- TortoiseGit:右键点击文件夹空白处 ->
- 解决合并冲突 (如果有冲突,请参照本教程的第 3 节:合并冲突处理)。
- 提交合并结果 (如果 TortoiseGit 或 VS Code 没有在合并完成后自动创建合并提交)。
- 推送合并后的
develop
分支到远程:- TortoiseGit:右键点击文件夹空白处 ->
Git Push...
-> 点击OK
。 - VS Code:点击左侧
源代码管理
(Git 图标) -> 顶部推送到...
图标。
- TortoiseGit:右键点击文件夹空白处 ->
- 删除已合并的功能分支 (可选,但推荐):
一旦功能分支的代码成功合并到develop
并推送到远程,通常可以删除该功能分支以保持仓库的整洁。- 本地删除:
- TortoiseGit:右键点击文件夹空白处 ->
TortoiseGit
->Delete Branch...
-> 勾选你的功能分支 -> 点击OK
。 - VS Code:点击 VS Code 左下角分支名称 -> 在弹出的命令面板中选择你的功能分支 -> 点击
删除分支
(Delete Branch)。
- TortoiseGit:右键点击文件夹空白处 ->
- 远程删除 (需要先删除本地分支):
- TortoiseGit:右键点击文件夹空白处 ->
Git Push...
-> 点击Manage remotes
(管理远程) 按钮 -> 在弹出的对话框中选择origin
-> 点击Delete branch
(删除分支) -> 在弹出的输入框中输入你要删除的远程功能分支名称 -> 点击OK
。 - VS Code:点击左侧
源代码管理
(Git 图标) -> 顶部...
(省略号菜单) ->拉取/推送
(Pull/Push) ->删除远程分支
(Delete Remote Branch…) -> 在列表中选择要删除的远程功能分支。
- TortoiseGit:右键点击文件夹空白处 ->
- 本地删除:
2.6 场景:develop
合并到 main
(发布/比赛版本准备)
当 develop
分支的代码已经通过了充分测试,并且稳定到足以用于比赛或发布时,可以将其合并到 main
分支。此操作通常由队长或指定发布负责人执行。
切换到
main
分支:- TortoiseGit:右键点击文件夹空白处 ->
TortoiseGit
->Switch/Checkout...
-> 选择main
分支 -> 点击OK
。 - VS Code:点击 VS Code 左下角分支名称 -> 在弹出的命令面板中选择
main
分支。
- TortoiseGit:右键点击文件夹空白处 ->
拉取
main
最新代码 (确保你的本地main
分支是最新的状态):- TortoiseGit:右键点击文件夹空白处 ->
Git Pull...
-> 点击OK
。 - VS Code:点击左侧
源代码管理
(Git 图标) -> 顶部...
->拉取
-> 选择拉取 (变基)
或拉取 (合并)
。
- TortoiseGit:右键点击文件夹空白处 ->
合并
develop
分支到main
:- TortoiseGit:右键点击文件夹空白处 ->
TortoiseGit
->Merge...
->Branch
(分支) 选择develop
-> 点击OK
。 - VS Code:点击左侧
源代码管理
(Git 图标) -> 顶部...
->分支
(Branches) ->合并来自...
(Merge Branch…) -> 在弹出的列表中选择develop
。
- TortoiseGit:右键点击文件夹空白处 ->
解决可能的冲突 (理论上,如果
main
分支在此期间没有独立提交,则不应产生冲突)。推送合并后的
main
分支到远程:- TortoiseGit:右键点击文件夹空白处 ->
Git Push...
-> 点击OK
。 - VS Code:点击左侧
源代码管理
(Git 图标) -> 顶部推送到...
图标。
- TortoiseGit:右键点击文件夹空白处 ->
为比赛版本打标签 (Tag) (推荐):
为比赛版本打上标签是一个好习惯,可以方便地回溯和管理不同比赛阶段的代码版本。- TortoiseGit 操作:
- 右键点击文件夹空白处 ->
TortoiseGit
->Create Tag...
(或TortoiseGit
->创建标签...
)。 - 在
Tag name
(标签名称) 处输入标签名,例如v1.0.0-competition
。 - 在
Message
(信息) 框中输入标签注释,例如2025年讯飞智能车比赛版本 V1.0.0
。 - 点击
OK
。
- 右键点击文件夹空白处 ->
- 推送标签到远程:右键点击文件夹空白处 ->
Git Push...
-> 勾选Include Tags
(包含标签) 选项 -> 点击OK
。 - VS Code 操作:
- 点击左侧
源代码管理
(Git 图标) -> 顶部...
->标签
(Tags) ->创建新标签
(Create New Tag…)。 - 输入标签名称和注释。
- 创建后,当你点击顶部
推送到...
图标时,VS Code 会弹出提示是否推送标签,选择推送标签
(Push Tags)。
- 点击左侧
- TortoiseGit 操作:
3. 合并冲突处理
合并冲突是团队协作中常见的场景,当两个分支修改了同一个文件的同一部分时就会发生。掌握冲突解决技巧至关重要。
3.1 识别冲突
- TortoiseGit:在执行
Merge
或Pull
操作后,如果发生冲突,会弹出一个窗口提示冲突文件列表。受冲突影响的文件在文件管理器中会显示红色感叹号的图标。 - VS Code:在
源代码管理
面板中,冲突文件会显示在合并冲突
(Merge Conflicts) 部分,并有特殊的冲突图标提示。
3.2 解决冲突 (在 VS Code 中操作更方便)
VS Code 内置的冲突解决工具非常强大,强烈推荐使用。
- 打开冲突文件:在 VS Code 中点击冲突文件。
- 冲突标记:VS Code 会在文件中用特殊的标记显示冲突区域,并提供便捷的操作按钮:
在冲突区域上方,VS Code 会提供以下按钮:<<<<<<< HEAD # 这里是当前分支(例如 develop)的代码,通常是你的本地改动 ======= # 这里是传入分支(例如 feature/your-feature-name)的代码,通常是你要合并进来的改动 >>>>>>> feature/your-feature-name
接受当前更改
(Accept Current Change):保留HEAD
(当前分支) 的代码,丢弃传入分支的代码。接受传入更改
(Accept Incoming Change):保留传入分支的代码,丢弃HEAD
(当前分支) 的代码。接受两边更改
(Accept Both Changes):同时保留HEAD
和传入分支的代码。比较更改
(Compare Changes):打开一个并排的 diff 视图,让你更仔细地比较两边的代码差异,帮助你做出决策。
- 手动编辑:你可以手动删除
<<<<<<<
、=======
和>>>>>>>
这些标记,然后根据实际需求,将两边的代码进行整合,使其成为你最终想要的代码逻辑。 - 保存文件:完成手动修改后,保存冲突文件。
- 标记为已解决并暂存:
- TortoiseGit:右键点击已解决冲突的文件 ->
TortoiseGit
->Resolved
(已解决)。然后,右键点击文件夹空白处 ->Git Commit
,在提交窗口中勾选所有已解决的文件。 - VS Code:保存文件后,该文件会自动从
合并冲突
区域移动到更改
区域。你需要像普通提交一样,将已解决的文件添加到暂存区(点击旁边的+
图标)。VS Code 会自动识别这是合并提交。
- TortoiseGit:右键点击已解决冲突的文件 ->
- 完成合并提交:
- TortoiseGit:在提交窗口中,Git 通常会预填充一个合并提交信息,可以直接点击
Commit
。 - VS Code:在
源代码管理
面板顶部的消息
文本框中,通常会有一个预填充的合并提交信息(例如Merge branch 'feature/your-feature-name' into develop
),可以直接点击√
(提交) 按钮。
- TortoiseGit:在提交窗口中,Git 通常会预填充一个合并提交信息,可以直接点击
- 推送:完成合并提交后,将合并后的分支推送到远程仓库。
4. 高级 Git 技巧
这些技巧有助于在特定场景下更好地管理提交历史,但部分操作(如 reset --hard
和强制推送)可能会修改历史,请务必谨慎使用,并在公共分支上操作前与团队沟通。
4.1 场景:撤销或修改提交
修改最近一次提交 (
git commit --amend
):
如果你刚刚提交了,但发现提交信息有误,或者漏掉了一些文件,并且这个提交还没有推送到远程。- TortoiseGit 操作:
- 如果你漏掉了文件,先将其添加到暂存区 (
Git Add
)。 - 右键点击文件夹空白处 ->
Git Commit
-> 勾选Amend Last Commit
(修正上一次提交) 选项。 - 你可以在
Message
(信息) 框中修改提交信息(如果需要),然后点击Commit
。
- 如果你漏掉了文件,先将其添加到暂存区 (
- VS Code 操作:
- 如果你漏掉了文件,先将其添加到暂存区。
- 在
源代码管理
面板顶部...
(省略号菜单) ->提交
(Commit) ->修正上一次提交
(Amend Last Commit)。
- 注意:如果这个提交已经推送到远程,修改后会改变提交的哈希值,你需要强制推送 (
git push --force
或git push --force-with-lease
)。
- TortoiseGit 操作:
撤销已经提交的修改 (
git revert
):
如果你想撤销之前的某个提交,但又想保留 Git 历史记录(不重写历史),可以使用git revert
。它会创建一个新的“撤销”提交,将指定提交的更改反向应用。这在公共分支上是安全的。- TortoiseGit 操作:
- 右键点击文件夹空白处 ->
TortoiseGit
->Show Log
(显示日志)。 - 在日志窗口中,找到你要撤销的提交,右键点击该提交 ->
Revert changes by this commit
(通过此提交撤销更改)。 - TortoiseGit 会自动创建一个新的提交来撤销该更改。
- 右键点击文件夹空白处 ->
- VS Code 操作:
- 点击左侧
源代码管理
(Git 图标) -> 顶部...
->提交
(Commit) ->查看提交
(View Commit History)。 - 在提交历史视图中,找到要撤销的提交,右键点击该提交 ->
Revert Commit
(撤销提交)。
- 点击左侧
- TortoiseGit 操作:
重置提交到某个状态 (
git reset
):
git reset
会重写历史,将分支指针移动到指定的提交。此操作会改变历史记录,请慎用!尤其是在已推送到远程的公共分支上。- TortoiseGit 操作:
- 右键点击文件夹空白处 ->
TortoiseGit
->Show Log
。 - 在日志窗口中,找到你要回到的提交,右键点击该提交 ->
Reset "your-branch-name" to this...
(将 “你的分支名” 重置到此…)。 - 选择重置模式:
Hard
(硬):危险! 将分支指针移到指定提交,并丢弃所有工作目录和暂存区的更改。Mixed
(混合,默认):将分支指针移到指定提交,保留更改在工作目录,但不会保留在暂存区。Soft
(软):将分支指针移到指定提交,保留更改在暂存区。
- 点击
OK
。
- 右键点击文件夹空白处 ->
- VS Code 操作:
- 点击左侧
源代码管理
(Git 图标) -> 顶部...
->提交
->查看提交
(View Commit History)。 - 在提交历史视图中,找到要回到的提交,右键点击该提交 ->
重置 HEAD
(Reset HEAD…)。 - 选择重置模式 (
--soft
,--mixed
,--hard
)。
- 点击左侧
*如果重置的提交已经推送到远程,你需要强制推送 (
git push --force
或git push --force-with-lease
) 来更新远程仓库。在 TortoiseGit 的 Push 窗口中,可以勾选Force
(强制) 选项。在 VS Code 中,点击推送按钮时可能会提示是否强制推送。再次强调:强制推送公共分支非常危险,务必提前与团队成员沟通并获得同意!- TortoiseGit 操作:
4.2 场景:整理提交历史 (git rebase -i
)
git rebase -i
(交互式变基) 是一个强大的工具,可以用来修改、合并、删除、重排你尚未推送到公共分支的本地提交历史,使历史更清晰、简洁。
- TortoiseGit 操作 (推荐):
- 右键点击文件夹空白处 ->
TortoiseGit
->Rebase...
(或TortoiseGit
->变基...
)。 - 在
Rebase
窗口中,选择Branch
(分支) 为develop
(即你的功能分支要变基到develop
的最新提交之上)。 - 勾选
Interactive Rebase
(交互式变基)。 - 点击
Start Rebase
(开始变基)。 - 弹出的窗口会列出你的本地提交,你可以右键点击每个提交来修改其操作(如
Edit
更改提交、Squash
合并提交、Drop
删除提交、Revert
撤销提交)。 - 完成操作选择后,点击
Continue Rebase
(继续变基) 完成整个过程。
- 右键点击文件夹空白处 ->
- VS Code 操作:
- VS Code 本身没有直接的 GUI 按钮进行交互式 Rebase,通常需要通过命令行 (
Git Bash
) 来完成。 - 打开 Git Bash (在项目文件夹内右键 ->
Git Bash Here
),进入你的项目目录。 - 运行命令:
git rebase -i HEAD~N
(其中N
是你想操作的最近N
个提交)。 - 根据命令行提示,在默认的文本编辑器中修改 Rebase 脚本。
- 如果在 Rebase 过程中遇到冲突,VS Code 会提示你解决。解决冲突后,在 Git Bash 中运行
git rebase --continue
继续 Rebase 过程。
- VS Code 本身没有直接的 GUI 按钮进行交互式 Rebase,通常需要通过命令行 (
4.3 场景:git fetch
vs git pull
理解 fetch
和 pull
的区别对于掌握 Git 至关重要。
git fetch
:
从远程仓库下载最新的提交和分支信息,但不会合并或修改你的本地工作目录。它只是将远程分支的最新状态带到你的本地仓库(例如,你可以看到origin/develop
指向的最新提交),但你的本地分支(例如develop
)不会移动。- TortoiseGit 操作:右键点击文件夹空白处 ->
Git Fetch
。 - VS Code 操作:点击左侧
源代码管理
(Git 图标) -> 顶部...
->拉取
->抓取
(Fetch)。
- TortoiseGit 操作:右键点击文件夹空白处 ->
git pull
:
相当于执行git fetch
后再执行git merge
(默认行为) 或git rebase
(如果配置了)。它会下载最新更改并立即合并到你当前的分支。- TortoiseGit 操作:右键点击文件夹空白处 ->
Git Pull...
。 - VS Code 操作:点击左侧
源代码管理
(Git 图标) -> 顶部拉取
(向下箭头) 图标或...
->拉取
。
- TortoiseGit 操作:右键点击文件夹空白处 ->
5. 团队协作规范与最佳实践
良好的团队协作规范是项目成功的关键。
- 提交频率高,每次提交小而精:
每次提交应只包含一个逻辑上独立的、有意义的更改。这使得代码审查更容易,也方便日后通过日志回溯问题。 - 提交信息清晰明了:
遵循统一的提交信息规范,例如使用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
: 构建过程或辅助工具的变动
- 功能分支化:
所有新功能和 Bug 修复都必须在独立的功能分支上进行开发,避免直接在develop
或main
分支上进行改动。 - 定期从远程
develop
同步代码到本地功能分支:
每天开始工作前,先从远程develop
分支拉取最新代码到你的本地develop
分支。然后,考虑将最新的develop
代码合并或变基到你的功能分支,以避免长时间不同步导致的大量冲突。git checkout feature/your-feature
git pull origin develop
(进行合并) 或git rebase develop
(进行变基)。
- 解决冲突时务必沟通:
当出现合并冲突时,不要单独盲目解决。应积极与相关代码的作者沟通,共同理解冲突产生的原因,并协商最佳的解决方案。 - 代码审查 (Pull Request / Merge Request):
这是最推荐的协作方式。在将功能分支合并到develop
之前,通过远程仓库的 PR/MR 功能进行代码审查。这有助于提高代码质量,发现潜在问题,并促进团队成员之间的知识共享。 main
分支保护:
在远程仓库(如 Gitee)中设置分支保护规则,禁止直接推送到main
分支,只能通过拉取请求进行合并。同样,develop
分支也可以考虑设置保护规则,限制直接推送,强制通过 PR/MR 合并。- 遇到问题及时求助:
在 Git 使用或项目开发中遇到问题时,不要独自挣扎太久。及时在团队群里提问,或向有经验的队友寻求帮助。
6. 添加 Git 忽略文件 (.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
如何使用 TortoiseGit 和 VS Code 处理 .gitignore
:
- 创建/编辑:你可以在项目根目录手动创建或修改
.gitignore
文件。 - TortoiseGit:当你右键点击文件夹空白处选择
Git Commit
时,被.gitignore
规则忽略的文件将不会出现在提交列表中。如果你不小心追踪了一个本应被忽略的文件,想要将其从 Git 仓库中移除并添加到忽略列表,可以右键该文件 ->TortoiseGit
->Delete and add to ignore list
(删除并添加到忽略列表)。 - VS Code:在
源代码管理
面板中,被.gitignore
规则忽略的文件不会出现在更改
列表中。如果一个已追踪的文件你不小心提交了,后来决定要忽略它,你需要先通过 Git 命令将其从 Git 历史中移除 (git rm --cached <file>
),然后将其添加到.gitignore
文件中。