1. 概述
使用 TortoiseGit 比直接使用 Git 命令行实现代码版本管理更为方便,本文根据实际使用情况作一些记录,特别是对于解决冲突的处理。
2. Git 安装与配置
下载 Git 官方安装包,完成 Git 的安装与配置。
本文详细介绍了 TortoiseGit 在 Windows 下的安装配置及核心功能使用。内容包括 Git 环境搭建、TortoiseGit 设置(如密码保存、右键菜单)、基本操作(克隆、提交、拉取、推送)、分支管理(新建、切换、合并、删除)、版本回滚、暂存操作以及冲突解决流程。旨在帮助用户通过图形化界面高效进行代码版本控制。

使用 TortoiseGit 比直接使用 Git 命令行实现代码版本管理更为方便,本文根据实际使用情况作一些记录,特别是对于解决冲突的处理。
下载 Git 官方安装包,完成 Git 的安装与配置。
Git 安装后,涉及到的主要命令可视化如图所示。
[图示:Git 安装后的主界面]
TortoiseGit 是 Windows 系统下使用的 Git 版本控制客户端。它提供了图形用户界面,操作简单,同时完全兼容 Git 的命令行操作。
TortoiseGit 可以用于执行常规任务,如提交、查看日志、差异比较、创建分支和标签、创建补丁等。它还支持与远程仓库的交互,如推送(push)和拉取(pull)操作。
在官网下载 TortoiseGit 及中文简体语言包。
[图示:TortoiseGit 下载页面]
客户端与语言包的安装方法,一直下一步默认选择即可。
[图示:General 配置界面]
[图示:右键菜单配置]
注意:密码会明文保存在 C:\Users\Administrator.git-credentials 这种文件中,请小心使用。
进入设置,点选左边的 Git 标签。可以发现,右边可以配置用户的名字与 Email 信息。
[图示:Git 标签配置]
若在某个本地 Git 项目下打开配置对话框,那么这个按钮就可用,然后可编辑此项目的一些属性。
点击 'Edit global .git/config(O)' 按钮,会使用记事本打开全局配置文件,在全局配置文件中,在后面加上下面的内容:
[credential]
helper = store
完成后保存,关闭记事本,确定即可。
当你推送项目到 GitHub 等在线仓库或托管的仓库时,会记住你输入的用户名和密码。
在工作目录下,如 D:\work,空白处右键,选择:Git clone,则会弹出克隆对话框。
[图示:Git Clone 对话框]
在 URL 中填写项目的访问地址。
根据项目大小,时间会不一样。克隆完成后,如果没有错误,会给出提示。
[图示:克隆成功提示]
进入克隆下的文件夹中,如 D:\work\opt,空白处右键,弹出如下菜单:
[图示:项目根目录右键菜单]
其中,Git Pull 是从远端拉取最新的代码,Git Fetch 是从远端拉取最新的分支,Git Push 是将本地仓库的代码提交到远端。
Git Commit -> "master",将本地代码提交到本地版本库(默认的分支是 master)。
创建一个文件,如 test.txt,先 add 再提交到本地版本库 (因为不涉及发送到远端,这个步骤可在离线状态操作)。
[图示:Add 操作]
[图示:Commit 对话框]
[图示:提交确认]
填写提交备注 message(不填写不允许提交),勾选需要提交的文件,点击 commit,即可将本地代码提交到本地版本库。出现如下弹框,表示本地提交成功:
[图示:提交成功提示]
其中,提交时,会发现上图中的 Status 有几种值:
注意:提交成功后,本地的 test 文件的提示符号'?'变为绿色的'√'表示修改版本已提交到位。
提交前:
[图示:提交前状态]
提交后:
[图示:提交后状态]
右键选择 Git Show Log(这个菜单可以通过上面的的配置出来)。在日志中,可以通过日期、文件名、提交人等等过滤查询。
[图示:Log 日志界面]
通过日志,可以很直观的看到提交相关记录。比如提交人、提交时间、提交了哪些文件等等。这些信息便于以后进行文件对比或者版本对比,甚至版本回滚 (后面将会介绍)。
点击 test.txt,可以看到本次提交,对 test 文件进行了哪些操作 (也就是添加了一行 Hello World):
[图示:文件变更详情]
将代码推送 (push) 到远程,这里演示的是代码托管仓库。
右键空白处,选择 Git Push,出现如下弹框:
[图示:Git Push 对话框]
这里可以看到是本地哪个版本库提交到远端哪个版本。至此,文件的整个提交过程就完成了。
PS:首先 commit 提交到本地仓库,然后 pull 拉取一下合并代码,确保 push 为最新的版本代码。
有时候我们一些文件是不需要提交的比如说 idea/eclipse,或者说本地记录的一些简要说明,不是正式提交的 README.md 这种文件,或者开发的代码自动生成的配置文件,如何设置为不提交呢?
[图示:忽略文件设置]
按照提示方式,标记 a.txt 或全部 .txt 为可忽略文件,此时我们根目录下会生成一个.gitignore 文件。
[图示:.gitignore 文件]
忽略文件如何阅读,常见格式如下:
# 所有以.a 结尾的文件讲被忽略 (递归)
*.a
# 不管其他规则怎样,强制不忽略 lib.a
!lib.a
# 只忽略 文件 TODO (注意这里是文件)
/TODO
# 忽略 build 文件夹下所有内容 (递归) 这里是文件夹
build/
# 忽略 doc 目录下以 *.txt 结尾的文件 (不递归)
doc/*.txt
# 忽略 doc 目录下以 *.pdf 结尾的文件 (递归)
doc/**/*.pdf
上述介绍的都是一些基本用法,使用小乌龟的优势主要是体现在版本控制与分支管理上。下面介绍分支与版本管理。
对于通常的项目开发,比如想新加一个功能进去的时候,可以先新建一个分支,例如名字叫 dev-0430,然后在分支中把新功能加上去,如果 OK,将代码合并到 master 分支上,如果新功能失败,还可以回退到 master 分支上来,在 dev-0430 写的代码,不至于影响 master 分支。
查看分支,包括查看本地已拉取的分支和远端全部提交的有效分支。对应的就是命令
git branch -a # 查看所有分支
git branch # 查看本地分支
git branch -r # 查看远程分支
方法一:
右键-->TortoiseGit-->Switch/ Checkout 看到的是全部的分支,远端分支前有 remotes 字样。
[图示:Switch/Checkout 界面]
方法二:
右键-->TortoiseGit-->Show log,
[图示:Show Log 界面]
在打开的窗口中,比如选中左上角 master(当前的本地分支),弹出的窗口中 heads 就是本地已拉取的分支,remotes 显示的就是远程的所有分支。
[图示:Log 中的分支列表]
[图示:分支结构展示]
[图示:Create Branch]
[图示:Branch 命名]
[图示:当前分支显示]
[图示:修改文件状态]
[图示:新增文件状态]
[图示:文件图标变化]
[图示:分支提交]
[图示:提交完成]
提交完成后,图标都变为绿色,表示版本已经 commit 到位。
右键-->TortoiseGit-->Switch/Checkout,选择 master 即可。如下图:
[图示:切换分支]
[图示:切换后文件状态]
结果显示,无论是修改还是添加,都没有影响 master 分支上的文件,这就是分支的作用。
分支的合并就是我们说的分支 merge,如果此时发现 dev-0430 分支上的功能是有效的,希望能合并到 master,又该怎么操作呢?
PS:在合并分支前,一定要确认 dev-0430 分支上的代码全部提交到本地版本库了。
[图示:Merge 选择]
[图示:Merge 确认]
点击 Ok 按钮,会出现下图弹框。弹框中会列出被合并的文件。如下图所示:
[图示:合并文件列表]
自此,我们发现 test2.txt 文件被合并过来了,打开 test 文件,发现内容正好是在 dev-0430 分支上修改的内容。至此,分支合并完成。
PS:分支合并完成后,根据实际需要,可将本地合并的最终版本 push 到远程分支,具体可参照章节 4.1.4 执行。
分支被合并后并不会被自动删除,如果该分支已经完成它在开发阶段的使命,则可以大胆地将其删除。不过,一般情况下建议保留一段时间再删除。
步骤一:在相应的本地代码库里面,点击 switch/Checkout/首先切换到比如 master 分支上(注意如果你想删除 dev-0430,首先应切换到别的分支,只要不是 dev-0430 就行,否则会报错)依次如下:
[图示:切换分支准备删除]
步骤二:进入下图的对话框中注意左边的分支目录点选 heads 是本地的分支,选中 dev-0430 分支,选择删除分支,弹出对话框点击是,完成了 dev-0430 的删除。
[图示:删除分支确认]
步骤三:选择 remotes 远程分支按照同样的步骤执行操作弹出对话框选择是就成功的删除了远程分支。由于上文提到的 dev-0430 并未实际提交到远端相应分支,所以此处这一步不用执行。
步骤四:执行上述步骤后,看一下本地的仓库,发现 dev-0430 分支已被删除。
[图示:分支删除后]
比如本地的某个文件发生了变更,但不确定与已提交的版本中对应文件发生了哪些变更,那么可以右键-->TortoiseGit-->Show -log,选中某个提交的版本,再右键 Compare with working tree。
[图示:对比操作入口]
在下面的 path 路径下选中对应的文件,选中 Compare with working tree(工作区未提交版本),或者 Compare with base(已拉取的本地最新未变更版本),就可以在弹出的窗口中左右对比内容。
[图示:对比窗口]
[图示:差异高亮]
此时,我们团队还有另一个成员 B,他需要获取我最新修改的内容,该怎么操作呢?
首先 B 切换到跟我同一分支,然后右键-->Git Pull,点击确认即可,就可将我修改的内容拉取到他的本地版本库。
PS:其他成员能够拉取到最新的前提是,任何人本地的修改都已经 push 到远端。
关于代码提交的终极简化:
总结:
a) 不管什么场景,先 commit 提交到本地仓库再说
b) pull 更新合并本地代码,保证本地版本的新鲜度
c) push 提交代码
commit:commit
pull:commit+pull
push:commit+pull+push
一言以蔽之:一提(commit)二拉(pull)三推(push)
先查看日志:右键-->TortoiseGit-->Show -log,确定想回滚到哪个版本 (这时就体现出添加 message 的好处了吧)。
[图示:日志回滚定位]
比如想回滚到创建 test.txt 文件前,则点击该步操作所对应的 message 之前的那一个日志(origin/HEAD),然后右键-->Reset 'master' to this…,表示将当前 master 分支上的文件回滚到这个版本,如下图
[图示:Reset 操作]
选择之后,弹出如下弹框,在 Reset Type 下选择你回退的类型 (通常个人一般选择 Hard:Reset working…..),点击 OK 即可
[图示:Reset 类型选择]
会发现,此时 test.txt 和 test2.txt 文件都消失了,也就是回退到最初没有作任何修改时,如下图:
[图示:回滚后文件消失]
比如我本地修改了多个文件内容,但是远程仓库上也有人更新了其中部分文件或者全部文件,这个时候,我不想将本地全部修改的文件直接上传至远程仓库,只想更新修改的多个文件里的一部分。
或者比如说我本地临时修改了部分代码,现在还没有修改到位,暂时不方便直接提交版本,但是现在有紧急的事情需要切换分支,那么怎么办呢?这时可以先把本地修改的中间版本暂存起来。
Stash Changes – TortoiseGit 允许你将工作目录的脏状态保存到堆栈中,以便稍后重新应用。
步骤 1:在自己的工程项目文件夹下,鼠标右键菜单中选择【Stash changes】
[图示:Stash Changes]
步骤 2:弹出的窗口中的 Message 文本输入框中输入自己需要的描述信息,然后点击 OK
[图示:Stash 消息]
步骤 3:步骤 2 后,弹出下图所示的处理界面,等待成功 (Success) 后,点击 Close 按钮,关闭该窗口。
[图示:Stash 成功]
步骤 4:临时修改的代码暂存完毕,接下来在项目根目录下鼠标右键菜单中选择【Switch/checkout】,可以切换当前的分支,在其他分支上进行处理。
步骤 5:或者鼠标右键菜单中选择【Stash List】查看暂存代码的列表。
[图示:Stash List]
步骤 6:在处理完成紧急事情后,如果需要再次切换到暂存的版本状态,应该怎么办呢:
鼠标右键菜单中选择【Show-log】,然后 stash message 信息选中暂存的版本,在下面的 path 中选中对应版本的,[Diff with parent],就能自动选中所有需要回退的代码版本
[图示:Stash 恢复定位]
然后选中后,右键【Revert to this version】,在弹出的窗口点击【确定】就能切换到之前暂存的版本代码。
[图示:Revert 确认]
如果本地未完成版本已经暂存了,且添加了相应的 message,现在需要先暂时放置暂存的临时版本,需要把当前的代码拉取到最新版本,应该怎么办呢?
由于当前的暂存版本没有有效提交,直接拉取最新代码进行本地合并,势必可能出现合并冲突,为了版本的管理方便起见,可以先按照上述步骤回退到一个之前最新的有效提交版本。
然后在这个有效版本基础上,考虑合并本地的暂存版本。
采用拉取/pull 命令更新最新的项目到本地。
方法一:
pull 命令用于从远程获取代码并合并本地的版本。本地没有修改时可直接 pull,如果存在修改,需要先 commit 后,再 pull 拉取合并(否则会出现失败或者本地修改丢失的情况)。
方法二:
PS: 如果只有 1,2,3 步骤,并不能通过 fetch 拉取最新代码,而是还需要有 reset
对于实际开发过程,经常涉及在多个分支之间切换与合并,有可能出现版本冲突导致提交不成功。
或者通常情况下开发需要在本地新建的 dev 分支上进行,但有时版本的快速迭代时期,比如项目组多个成员在指定的时间内反复提交多个改进版本,那么可能就会出现远程的分支与本地分支相同,多人在各自本地开发的分支也是相同的,那么将如何保证版本的有效提交与管理呢?下文介绍几种常见情况。
常见的几种冲突主要有如下几种场景:
在 tortoise 内解冲突相对来说对比不太直观,实际处理冲突可按如下步骤进行:
在 from 中选取主分支,实现主分支往本地开发分支 merge
[图示:Merge 冲突界面]
完成分支的 merge 后,可能会出现冲突的界面,双击选中其中冲突的文件之一,弹出来对比的窗口后,再关闭之。此时文件夹出现一个感叹号。
具体来说修改 commit 日志可分为 3 种情况:
第一种情况,如果需要修改的 commit 是当前分支的最新的一个 commit,
在版本库中,右键菜单,提交
在提交的界面,选择 Amend Last Commit
然后根据需要修改日志信息,包括 commit message,日期,作者
[图示:Amend Last Commit]
如果存在本地出现了修改还未提交,但 remote 对应分支已出现了更新,那么可以先将本地修改保存为 stash changes。
[图示:Stash Changes]
[图示:Stash 确认]
保存 stash 后,可以拉取远程分支的更新到本地代码。
然后选中 stash pop 弹出本地 stash 代码。
[图示:Stash Pop]
把弹出的 stash 提交,commit 到当前分支,完成修改版本的合并。
[图示:Stash 合并提交]

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online