SourceTree使用教程
1.克隆、提交、推送
在使用SourceTree之前必须要先安装Git和sourceTree,具体安装过程不再赘述
(1)以加入我的管理团队为例,进入5-27-dq 这个仓库,点击管理,然后进入仓库成员管理,发现现在我的仓库成员有4个了,gitee免费版最多可5个成员。
![image-20230529162517651](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180433464-1514214419.png)
若要加入我的代码仓,请向我申请邀请链接。
![image-20230529162537383](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180433824-86809943.png)
(2)加入我的代码仓,成为的的项目开发成员之后,大家首先将该远程仓clone到自己本地,作为自己的本地仓。
值得注意的是,5-27-dq这个仓库有两个分支,大家选着dev开发分支进行远程提交,master作为最终发布使用
![image-20230529163412238](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180434182-581939996.png)
(3)打开Sourcetree,单击clone,填写远程仓库的url:https://gitee.com/su-deqi/5-27-dq.git ,以及想要克隆到本地的文件夹地址,作为自己的本地仓,对本地仓进行管理。
![image-20230529163556575](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180434537-522459399.png)
等待一会之后,就可以在Sourcetree中看到已经成功将远程的5-27-dq仓库克隆下来了,Sourectree页面可以看到该仓的整个生命进程,包括团队成员的提交历史,每个提交节点都可以查询提交的文件内容。
![image-20230529164128212](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180434902-367875925.png)
回到自己的本地仓库,就可以看到一个带.git 的与gitee云端仓库一样的本地文件夹了,该文件夹就是自己的本地仓。
![image-20230529164516259](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180435246-922295502.png)
(4)add-->commit-->push文件到远程仓库。在该文件夹下新建一个名叫 dog.txt的文本文件为例。
![image-20230529164919220](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180435546-1748107182.png)
新建完成之后,我们回到Sourcetree,点击WORKSPACE工作区,查看文件状态,发现未暂存区有一个dog.txt 的文件,即刚才我们新建的那个文件。然后暂存所有(add命令),提交到暂存区。
![image-20230529165036156](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180435919-738307170.png)
然后填写commit备注信息,点击提交到版本库中。
![image-20230529165445521](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180436241-959950488.png)
提交完成之后,更新到以下界面,在推送上面显示“1”,即有一个新文件要提交。在其他区域我们可以清晰的看到该文件提交过程中的所有信息。
![image-20230529170045306](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180436562-1634139248.png)
点击推送,在新页面中,选择推送路线,即将自己本地的文件分支(一般为master),推送选择推送到dev开发分支。
![image-20230529170444911](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180436889-704677032.png)
(5)推送成功之后,我们登录gitee远程仓库查看一下。发现一个名叫dog.txt的文件成功推送过来了。
![image-20230529171704802](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180437186-739479687.png)
![image-20230529171739371](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180437497-541944899.png)
2.拉取和获取
(1)打开gitee上的5-27-dq仓库,编辑dog.txt文件,并在文件中增加一行 dog2 hello,如下图,提交如下图
![image-20230529172531605](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180437787-235683524.png)
(2)获取和拉取。获取是将远程仓库的代码更新到本地仓库,拉取是将本地仓库的代码更新到本地工作副本。打开sourceTree,点击 获取 按钮,如下图
![image-20230529172740250](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180438121-1956305117.png)
(4)点击确定,可以看到拉取图标那里多了一个蓝底白色的数字1,分支master那里也有一个灰色的数字1,并有一个向下的箭头,这表示 有一个更新需要 拉取到本地工作副本。
![image-20230529172911784](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180438478-67914382.png)
同时打开版本文件,可以看到dog.txt文件中并没有第二步增加的 dog2 hello。
![image-20230529173027512](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180438801-836926936.png)
(5)点击拉取,如下图
![image-20230529173136598](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180439108-567554185.png)
(6)点击确定,可以看到待拉取的图标消失了。同时本地的dog.txt文件也多了 dog2 hello
![image-20230529173312085](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180439416-1943345077.png)
(7)一般在实际使用中是不会先点获取,再点拉取的,因为拉代码都是直接一步到位为拉到本地工作副本的。所以直接一个拉取操作就够了。
3.分支创建与合并
(1)分支。当要新增一个功能,又要保证原始功能的正常的使用,这个时候为了不影响原功能的使用,就可以建立一个分支,在分支上进行新增功能的开发,等到新增的功能测试通过后再把分支合并到主干上。如下图,点击分支,输入新分支名字,以当前工作副本为基础生成一个新的develop分支。
![image-20230529173930838](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180439738-491779238.png)
(2)点击创建分支,可以看到多了一个develop分支,但是这个分支只存在于本地仓库。可以看到最新的日志记录节点上只有master,origin/master,develop,所以这个新分支是没有推送到远程仓库的。
![image-20230529174024895](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180440061-786290913.png)
(3)点击推送,如下图,勾选第一个,将本地develop分支推送到远程develop分支
![image-20230529174203219](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180440498-268571317.png)
(4)点击推送 ,如下图,可以看到本地develop和远程develop已经同步了。
![image-20230529174446138](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180440842-1922274404.png)
(5)在develop分支上新增功能,这里是新增了 add func1
![image-20230529174634079](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180441127-281379258.png)
(6)在sourceTree界面,推送新增的功能到develop分支
![image-20230529174815611](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180441497-864158369.png)
(7)如下图。可以看到develop分支比master分支多了1条提交记录。
![image-20230529175131567](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180441818-255135587.png)
(8)功能1和2测试通过,现在要将develop分支上新增的两个功能合并到主分支master上。
将当前分支切换到master分支,鼠标移到到develop分支,右键,选择合并develop至当前分支,也即是主分支。
![image-20230529175254889](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180442178-1820584653.png)
(9)点击确定
![image-20230529175344819](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180442491-15791281.png)
(10)可以看到master的本地仓库多了1条需要推送的记录。如图所示的红框内图标1,说明develop分支新增的1个功能已合并到本地仓库的master分支。
![image-20230529175442083](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180442817-1787812287.png)
![image-20230529175924571](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180443125-1312913864.png)
(11)推送合并过来的1个新增功能。可以看到master分支已有了新增的1个功能。
![image-20230529180042542](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180443453-921396468.png)
在gitee仓库中我们也能看到推送过来的develop开发分支。
![image-20230529180121173](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180443756-759979225.png)
4.冲突解决
虽然在团队协作开发中强调尽量避免操作同一文件,以避免冲突,但是在实际开发中还是会遇到冲突,所以掌握解决冲突的方法必不可少。
(1)解决冲突就要先制造冲突,冲突一般是由于两个人同时修改同一文件而造成的。在gitee上修改远程仓库文件模拟一个人操作,sourceTree本地修改同一文件模拟另一个人操作。
(2)登录Gitee ,打开我的仓库,编辑dq.txt文件
![image-20230529153304685](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180444035-2062726126.png)
(3)在文件末尾增加内容 dq本地 ,点击提交,如下图所示。
![image-20230529153338331](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180444344-1808637995.png)
![image-20230529153442369](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180444636-353080648.png)
(4)打开本地工作副本的dq.txt文件,新增内容 dq本地,并保存,如下图:
![image-20230529153608364](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180444940-1460584872.png)
(5)打开sourceTree,可以看到本地工作副本有个待提交记录,然后add-->commit,提交到版本库。
![image-20230529153745666](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180445242-720362243.png)
![image-20230529153933419](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180445552-1141723858.png)
(6)推送代码。这个时候你修改完了本地的功能,并不知道远程仓库上也有人提交了该文件的修改。
![image-20230529154050033](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180445878-1746163191.png)
直接推送本地修改,推送本地工作副本到远程仓库,运行完成后会报错,大概是提示本地仓库和远程仓库版本不一致,无法提交,但是本地工作副本的修改却是已经提交到了本地仓库。如下图。
![image-20230529154217179](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180446260-1903457419.png)
然后关闭这个页面。
![image-20230529154440539](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180446585-633573020.png)
(7)既然提示 和远程仓库版本不一致,无法推送,那只能先拉成一致了。点击拉取图标,等执行完,就会出现下图所示。
![image-20230529154731471](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180446912-44604942.png)
有一个待拉取的图标和一个待推送的图标,并且dq.txt文件的图标变成了黄色的感叹号。这个时候文件的冲突就造成了。
(8)冲突文件会把两者的修改以冲突的方式合在一个文件里,等待使用者去处理。那么基本的处理思想是:要么使用其中某一个人的,要么使用两者的组合。
冲突的解决需要一个外部代码对比工具,我这里使用的是Beyond Compare 4,下载安装,然后集成到sourceTree软件中。如下图。在外部对比工具中找到Beyond Compare 4的可执行程序,点击确定。
![image-20230529155312131](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180447610-87769771.png)
(9)下面开始使用代码对比工具解决冲突,选中待解决冲突的代码,右键 解决冲突,打开外部合并工具。
![image-20230529155533918](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180447955-511354953.png)
(10)等待一会,Beyond Compare 4就会被打开。
![image-20230529155707731](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180448281-1046410746.png)
第一块是本地修改的版本,第二块是冲突两者(本地仓库和远程仓库)相同的版本基准,第三块是 远程仓库的修改,第四块是冲突处理后的代码
![image-20230529160147848](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180448566-1155718925.png)
11 本次解决冲突是为了合并两者的修改,所以我会把第一块和第三块所做的修改按照正确的逻辑顺序,合到第四块。在第4部分,可以点击不同箭头选择以哪个版本为基础,或者右键-->重新编辑。
![image-20230529160255876](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180448878-836009293.png)
![image-20230529160517325](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180449174-1551354671.png)
如下图,点击保存。关闭该对比软件。
![image-20230529160601147](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180449453-1307713997.png)
(12)切到sourceTree界面,点击dq.txt文件,发现冲突根据刚才和编辑修改完成了。
![image-20230529160838000](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180449760-1296265471.png)
在未编辑区内,可以看到多了一个解决冲突的中间文件,由于冲突已解决,直接右键移除。
![image-20230529161050315](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180450078-1513587094.png)
![image-20230529161130495](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180450404-351431027.png)
点击确定移除。
(13)可以看到冲突已解决,代码已正确合并。然后commit-->push,推送该合并。
![image-20230529161319560](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180450684-146047170.png)
![image-20230529161440151](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180451033-1811271973.png)
![image-20230529161541681](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180451365-332872038.png)
(14)这样冲突就被解决了,可以看到本地工作副本和远程仓库的代码都是一致的了。
![image-20230529161702056](/i/l/?n=23&i=blog/3010252/202305/3010252-20230529180451661-894865124.png)