目录
- 第一部分:准备工作
- 什么是 Git 和 SourceTree?
- 安装和配置
- 第二部分:SourceTree 界面概览
- 主界面解析
- 核心功能区域介绍
- 第三部分:核心工作流 - 克隆、提交、推送
- 克隆一个远程仓库
- 创建和切换分支
- 修改文件并提交
- 推送你的更改到远程仓库
- 第四部分:协作工作流 - 抓取、拉取、合并
- 抓取 和拉取 的区别
- 解决合并冲突
- 同步你的分支
- 第五部分:高级操作与技巧
- 查看历史记录和比较差异
- 使用 Stash (临时保存)
- 变基 - 让历史更整洁
- 创建和管理 Pull Request (在 GitHub/GitLab 上)
- 第六部分:常见问题与最佳实践
- 常见问题解答
- 最佳实践建议
第一部分:准备工作
什么是 Git 和 SourceTree?
- Git: 是一个分布式版本控制系统,你可以把它想象成一个“超级时间机器”,它记录了你项目文件的所有历史更改,你可以随时回溯到任何一个历史版本,比较不同版本之间的差异,与他人协作开发等。
- SourceTree: 是一个Git 的图形化客户端,它由 Atlassian (Jira, Confluence 的开发商) 开发,免费提供给个人使用,它将 Git 复杂的命令行操作转化为了直观的按钮和界面,让你无需记忆命令就能高效地使用 Git。
安装和配置
-
安装 Git:
(图片来源网络,侵删)- SourceTree 本身只是一个界面,它需要依赖你电脑上安装的 Git,请确保你已经安装了 Git。
- Windows: 访问 Git for Windows 下载并安装,安装时一路点击 "Next" 即可,它会自动配置好环境变量。
- Mac: 使用 Homebrew 安装
brew install git,或者直接从 Git for Mac 下载安装包。
-
安装 SourceTree:
- 访问 SourceTree 官网,下载适合你操作系统的版本并安装。
- 注意: 在安装过程中,SourceTree 会提示你登录 Atlassian 账号,这是为了同步你的仓库凭证等,建议注册一个。
-
配置 Git 用户信息:
- 这是非常重要的一步,因为你的每一次提交都会记录这个信息,打开终端 (Windows上是 Git Bash 或 CMD)。
- 运行以下命令,将
Your Name和your.email@example.com替换成你自己的信息:git config --global user.name "Your Name" git config --global user.email "your.email@example.com"
- 这个配置只需要设置一次,Git 会永久记住。
第二部分:SourceTree 界面概览
安装并打开 SourceTree 后,主界面看起来可能有点复杂,但别担心,我们把它拆解开。
主界面解析
-
左侧导航栏:
(图片来源网络,侵删)- Repositories: 你所有克隆或创建的本地仓库列表。
- Worktrees: (高级功能) Git Worktree 的管理。
- Bitbucket: (如果你使用 Bitbucket) 快速访问你的 Bitbucket 仓库。
- GitHub: (如果你连接了 GitHub) 快速访问你的 GitHub 仓库。
-
中央区域:
- 这是信息展示的核心区域,根据你左侧选择的仓库,它会显示不同的信息。
- Summary (概览): 显示仓库的基本信息,如当前分支、未提交的更改、远程仓库状态等。
- Files (文件): 显示所有被 Git 追踪的文件,这里是你进行提交操作的主要场所。
- History (历史): 显示该分支的提交历史记录,像一个时间线。
- Branches (分支): 显示所有本地和远程分支的列表。
- Remotes (远程): 显示你配置的远程仓库(如 GitHub, GitLab 等)。
- Stashes (暂存): 显示你保存的临时工作。
-
顶部工具栏:
- 包含了最常用操作的快捷按钮,如
Pull,Push,Commit,Rebase等。
- 包含了最常用操作的快捷按钮,如
核心功能区域介绍
- 未提交的更改: 这是 SourceTree 的核心工作区,你可以看到你修改过的文件。
- 已暂存的更改: 你选择了要包含在下一次提交中的文件。
- 未暂存的更改: 你修改了但还没决定是否提交的文件。
- 操作: 点击 号可以暂存文件,点击 号可以取消暂存,你可以对文件进行
Diff(查看差异) 或Discard(放弃更改)。
第三部分:核心工作流 - 克隆、提交、推送
假设你已经有一个远程仓库(比如在 GitHub 上)。
克隆一个远程仓库
- 点击左侧导航栏的 号,选择
Clone。 - 在弹出的窗口中,粘贴你的远程仓库 URL (从 GitHub/GitLab 的
Clone or download按钮获取)。 - 选择一个本地路径来存放仓库。
- 点击
Clone,SourceTree 会自动下载仓库的所有文件和历史记录。
创建和切换分支
分支是 Git 的精髓,它允许你在不影响主代码的情况下进行开发。
- 在左侧导航栏,找到你的仓库,点击
Branches。 - 你会看到
master或main分支,这通常是主分支。 - 在
Branches列表上方,点击New Branch。 - 输入新分支的名称(
feature/user-login),然后点击Create。 - 新分支会自动切换,现在你就在这个新分支上进行工作了。
修改文件并提交
这是最频繁的操作。
- 用你的代码编辑器(如 VS Code, Sublime Text)打开你克隆的本地文件夹。
- 修改任意一个文件,
README.md。 - 回到 SourceTree,在中央区域的 Files 标签下,你会看到
README.md出现在 未暂存的更改 列表中。 - 点击文件名旁边的
Diff按钮,可以查看你具体修改了哪些内容。 - 在下方的 Summary 输入框中,写下这次提交的说明("Update README with installation instructions")。
- 点击 Commit 按钮。
- SourceTree 会弹出一个确认窗口,确认你的提交信息,然后再次点击
Commit,你的更改就被保存到本地仓库了!- 最佳实践: 提交信息要清晰、简洁,说明你做了什么。
推送你的更改到远程仓库
你刚才的提交只存在于你的本地电脑上,为了让其他人看到,或者在其他设备上继续工作,你需要推送到远程仓库。
- 确保你当前在正确的分支上(
feature/user-login)。 - 点击顶部工具栏的 Push 按钮。
- SourceTree 会弹出一个窗口,显示你要推送到哪个远程仓库的哪个分支,确认无误后,点击
Push。 - 稍等片刻,你的更改就成功上传到 GitHub/GitLab 上了!
第四部分:协作工作流 - 抓取、拉取、合并
当团队协作时,你需要同步其他人的代码。
抓取 和拉取 的区别
- Fetch (抓取): 从远程仓库下载最新的信息(比如新的提交、新的分支),但不会合并到你当前的分支,它只是“看一看”远程有什么新东西,SourceTree 会自动在后台执行
fetch。 - Pull (拉取):
Fetch+Merge,它会从远程仓库下载最新内容,并自动合并到你当前的分支,对于简单的、没有冲突的更新,直接用Pull最方便。
操作: 点击顶部工具栏的 Pull 按钮,SourceTree 会自动处理合并。
解决合并冲突
当你在本地修改了一个文件,而其他人也修改了同一个文件的同一个部分时,Git 无法自动决定谁的版本是正确的,这时就会产生合并冲突。
- 尝试
Pull时,SourceTree 会提示你发生了冲突。 - 回到 SourceTree 的 Files 视图,你会看到有冲突的文件被标记了出来。
- 双击有冲突的文件,SourceTree 会打开一个合并工具。
- 合并工具通常会分三栏显示:
- Your changes: 你的版本。
- Incoming changes: 远程仓库的版本。
- Merged result: 你需要手动编辑并最终保存的版本。
- 合并工具通常会分三栏显示:
- 仔细比较两个版本,手动在
Merged result中编辑,保留你需要的代码,删除 Git 自动生成的冲突标记(如<<<<<<<, ,>>>>>>>)。 - 保存合并后的文件。
- 回到 SourceTree,这个文件会从“冲突”状态变为“已暂存”状态。
- 像平常一样写一个提交信息("Resolve merge conflict in user.js"),然后点击 Commit,这次提交就是解决冲突的提交。
同步你的分支
这是一个很好的习惯,可以保持你的分支与远程分支同步。
- 在左侧导航栏,点击你的仓库,然后选择
Branches。 - 在分支列表中,找到你的分支(如
feature/user-login)和它对应的远程分支(如origin/feature/user-login)。 - 右键点击你的本地分支,选择
Pull,确保它包含了最新的远程更改。 - 右键点击你的本地分支,选择
Push,将你的本地提交推送到远程。
第五部分:高级操作与技巧
查看历史记录和比较差异
- 查看历史: 在 History 标签下,你可以看到所有提交的列表,点击任意一个提交,可以查看该提交的详细信息(作者、时间、提交信息)和修改的文件。
- 比较差异:
- 比较两个提交: 在历史记录中,按住
Ctrl(Windows) 或Cmd(Mac) 键,同时点击两个提交,然后右键选择Compare,这可以看到两个提交之间的所有改动。 - 比较工作区和最新提交: 在 Files 视图中,点击
Diff按钮,可以比较你当前未提交的修改和最新提交之间的差异。
- 比较两个提交: 在历史记录中,按住
使用 Stash (临时保存)
当你正在一个分支上工作,做到一半时,突然需要切换到另一个分支去修复一个紧急 Bug,这时 Stash 就派上用场了。
- 在 Files 视图中,确保你已经暂存了所有想保留的更改。
- 点击顶部工具栏的 Stash 按钮。
- 输入一个 Stash 的描述(可选),然后点击
Stash。 - 你的工作区被“藏”了起来,变得和最新提交一样干净了,你可以放心地切换分支去工作。
- 当你回到原来的分支时,点击 Stash 按钮,选择你之前保存的 Stash,然后点击
Pop,你的修改就会恢复回来。
变基 - 让历史更整洁
Merge 会产生一个“合并提交”(Merge Commit),这会让提交历史看起来很杂乱。Rebase (变基) 可以将你的提交“移动”到最新分支的顶部,创造出一条线性的、更整洁的历史。
场景: 你在 feature 分支上工作,master 分支也有了新的提交。
- 确保你的
feature分支是最新的(已经Pull了远程的master)。 - 在 SourceTree 中,右键点击你的
feature分支。 - 选择
Rebase onto...。 - 在弹出的窗口中:
- Base onto: 选择你想要基于其进行变基的分支,通常是
master或main。 - Branch to rebase: 确认是你的
feature分支。
- Base onto: 选择你想要基于其进行变基的分支,通常是
- 点击
Rebase,SourceTree 会尝试自动应用你的每一个提交,如果遇到冲突,解决方法和Merge冲突一样。 - 变基成功后,你的
feature分支的提交历史会看起来像是从master的最新提交直接开始的。 - 最后一步: 因为变基是“重写历史”,你需要强制推送你的分支,右键点击你的
feature分支,选择Push,在弹出的窗口中勾选Force Push。警告: 强制推送会覆盖远程分支的历史,通常只在确认团队成员没有基于该远程分支工作时才使用。
创建和管理 Pull Request (在 GitHub/GitLab 上)
Pull Request (PR) 是协作的核心,它用来通知团队成员你完成了一项功能或修复了一个 Bug。
- 确保你的分支已经
Push到了远程仓库。 - 在 SourceTree 中,右键点击你的本地分支(
feature/user-login)。 - 选择
Create Pull Request。 - SourceTree 会自动在浏览器中打开 GitHub/GitLab 的页面,并帮你填写好 PR 的标题和描述,你只需要补充一些细节,然后点击
Create pull request即可。
第六部分:常见问题与最佳实践
常见问题解答
-
Q:
Push失败,提示 "You are not allowed to push code to this branch"- A: 通常是因为主分支(如
master)是受保护的,不允许直接推送,正确的做法是创建一个特性分支,开发完成后,通过 Pull Request 的方式让代码合并到主分支。
- A: 通常是因为主分支(如
-
Q: 我误操作了,想撤销上一次提交怎么办?
- A: 在 History 中找到那个提交,右键点击,选择
Reset。Soft Reset: 撤销提交,但保留更改在工作区(文件还在,已暂存)。Mixed Reset: 撤销提交,并将更改放回工作区(文件还在,未暂存),这是最常用的。Hard Reset: 撤销提交,并永久删除所有更改。非常危险,请谨慎使用!
- A: 在 History 中找到那个提交,右键点击,选择
-
Q: SourceTree 提示我需要登录 Atlassian 账户,但我不想登录怎么办?
- A: SourceTree 支持使用系统自带的 Git 凭证,可以在设置中关闭 Atlassian 登录选项,但可能会失去一些云服务的集成功能。
最佳实践建议
- 小步快跑,频繁提交: 不要把所有修改攒在一起再提交,每次完成一个小的功能点或修复一个 Bug 就提交一次,这样你的提交历史会很清晰。
- 写清晰的提交信息: 使用现在时态,"Add user login feature" 而不是 "Added user login feature"。
- Pull Request 是你的代码名片: 在 PR 中详细描述你的改动、原因以及如何测试,这有助于他人进行代码审查。
- 保持分支简洁: 一个分支只做一件事,开发新功能用
feature/xxx,修复 Bug 用bugfix/xxx。 - 定期同步: 在开始新工作前,先
Pull一下远程仓库的最新代码,避免你的工作基于过时的代码。
