VS的git功能,团队资源管理器(五)同步、提取、拉取、推送、合并分支

勇哥注:

由于VS自带有git管理功能且相当完善,所以第三方git工具相对来讲就显得不那么重要。

通常技术人员会刻意维护技术的复杂性,会Git的人,可能会鄙视用Fork之类git图形化软件的人、

以上两者都会鄙视用vs自带git工具的人,因为一门技术一但傻瓜就会伤了一些前辈的自尊。

我们还是抛弃掉这种技术自尊,努力适应傻瓜型的新技术吧!(也许未来低端的编程都会傻瓜到机器自己去编制了)


系列贴子汇总:

VS的git功能,团队资源管理器(一)怎么知道代码被git托管了,Git托管的主要功能

VS的git功能,团队资源管理器(二)第一次使用Git的必要设置、建立存储库的几种方法

VS的git功能,团队资源管理器(三)复制远端的存储库(代码仓库)

VS的git功能,团队资源管理器(四)分支历史、推送、.gitignore忽略文件

VS的git功能,团队资源管理器(五)同步 提取 拉取 推送

VS的git功能,团队资源管理器(六) 常见的错误处理


(一)同步 提取 拉取 推送


Visual Studio 通过下载(提取和拉取)和上传(推送)操作来使本地分支与远程分支保持同步。


中文化后名词变得不好理解,下面标出对应git中的指令。

但是注意的是,git中不存在同步“Sync"指令的,它是vs的功能。

同步 (Sync,  Pull Then Push 拉取然后推送)
提取 (Fetch)
拉取 (Pull)
推送 (Push)



image.png

(图1)


提取与拉取的区别见下面的贴子:


git fetch和git pull的区别

http://www.skcircle.com/?id=2143


同步是先拉取合并然后再推送。

VS会自动生成一个Merge的commit,如下图所示:

image.png

如果你和同事只在一个分支上工作的话,那么应该两人都只用“同步”,这样是非常安全的,不存在覆盖和丢失修改的问题。



(二)合并


合并就是git merge指令。在vs中,在当前分支上右键菜单上选择“合并自”功能。

如下图所示:

image.png

image.png

(图1.1)


VS团队管理器的合并,有一个很无语的bug,当一个文件被vs自己访问时,而合并时又会用到它,这个时候报XXX文件被占用,然后合并不能继续。

你可能奇怪啥文件会被vs占用?

比如下面这个:

SMC.vshost.exe

它其实是bin目录下的可执行程序(SMC.exe)对应的系统用到的exe。

这个SMC.vshost.exe会在vs打开项目时就出现在系统进程中了(即使不run程序)。


对于这种问题,你当然可以用忽略文件.gitignore屏蔽掉bin目录。但是有时候我无法屏蔽bin目录,因此会出现上面的问题。

对于这种问题,只能用命令行方式使用git来合并,此时SMC.vshost.exe被占用的问题会由git报告出来,问你是否要继续重试(y/n)? ,你可以选择n跳过。

对下面的例子中,命令行为:

git status   //先确定当前分支是dev_Lxy,没问题则执行下面的合并
git merge dev


一般来讲合并后基本上都是失败的(failed) 如图2所示。

这时候你切换回你的vs面板上可以看到冲突的列表,如图3所示。

image.png

(图2)


image.png

(图3)


另个,如果此时想后悔合并则用下面的指令:

git merge --abort

你也可以在vs的面板中点击“撤消合并”,它等于上面的指令。

image.png

(图4)


如果你不撤消合并,则请立刻处理当前的冲突!!

千万不要此时关闭vs等明天再来处理,因为你再次打开项目时会发现源代码时已经损坏,工程可能打不开!!!切记!!!

为什么源码会损坏?
因为对同一个文件,如果dev和devLxy分支都改过,则合并后git会用下面的方式注释冲突的地方。


未冲突的内容(两个分支都未改动)在分隔线外面
<<<<<<< HEAD
Git当前所在分支修改的内容(准确来说是HEAD指针指向的分支修改的内容)
=======
要合并过来的分支修改的内容
>>>>>>> branch_to_merge


下面说下vs的冲突列表怎么操作


下面冲突中: 当前分支为devLxy,要合并的分支为dev

出现冲突时,有下面几种情况:

(1)均已修改

(2)已由我们删除

(3)已由其删除


image.png

(图5)


对于冲突类型(1)可以选择保留目标,即devLxy,因为我确定修改内容当前分支是正确的。

但是如果两个分支的修改都要采纳,则需要“比较文件”,然后人工修改,如图7所示。

image.png

(图6)

左边是dev分支,右边是devLxy分支。

如果不当清楚左边与右边到底哪个是devLxy分支,可以鼠标指向下图比较窗体的标题“差异。。。。”,就可以看到提示。

image.png

(图7)


差异窗口的提示的作用见图8所示:

此窗口还带一个工具栏,使用上比较方便。

但是有一个问题,就是差异的部分,貌似不能修改(包括复制粘贴),可能是勇哥还没玩会。

知道的朋友请留言告之。

另外,下面图片取之微软官方网站,大家可以点进去看详细说明:https://learn.microsoft.com/zh-cn/azure/devops/repos/tfvc/compare-files?view=azure-devops&redirectedfrom=MSDN&f1url=%3FappId%3DDev14IDEF1%26l%3DZH-CN%26k%3Dk(vs.tfs.vctrl.DiffMerge.Legend)%3Bk(TargetFrameworkMoniker-.NETFramework%2CVersion%253Dv4.6.1)%26rd%3Dtrue&viewFallbackFrom=vsts


屏幕截图显示了文件的两个版本的比较。

屏幕截图显示了比较窗口布局。

步骤 1 已删除的文本

步骤 2 添加了文本

步骤 3 已更改的文本

步骤 4 代码评审注释

步骤 5 文件差异的直观摘要

(图8)


对于冲突类型(2),选择删除,这是当前分支devLxy这边的忽略文件(.gitignore)规则中,不存在此文件。而dev分支的忽略规则中存在些文件。

image.png

(图9)


图于冲突类型(3),一般可以选择保留文件(即保留当前分支的文件),如果你认为当前分支的文件为主。

image.png

(图10)



三)git cherry-pick


git cherry-pic是将代码从一个分支转移到另一个分支,并且只更新指定的commit(即所谓的快进更新)

而git  merge不同,它是全部文件进行合并更新(即所谓的非快进更新)

git cherry-pic的详细解析见文章:http://www.skcircle.com/?id=2146


下面的的例子中:

ce4calbe是devLxy分支的其中一个版本的id

git cherry-pick ce4calbe


当出现hint 提示时,说明当前git cherry-pick遇到冲突。

此时回到vs面板,处理冲突,解决方式如上面所讲。

然后回到命令行 git cherry-pick --continue进行继续。

image.png

(图11)





--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年5月    »
12345
6789101112
13141516171819
20212223242526
2728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864