TortoiseGit冲突解决方法
场景一:本地相同文件冲突
- 冲突场景:User1和User2修改、拉取相同文件
User1修改文件C内容,提交并推送,成功;
User2修改文件C内容,拉取,提示合并错误。
冲突分析:
此时文件状态还未显示冲突,因为本地文件只是修改,并未提交到本地暂存区;而此时从远程拉取的文件已保存在暂存区,但又无法和本地的修改直接合并,所以pull操作被中止。从提示的错误信息:Please commit your changes or stash them before you merge,也可以得知,此时需要先commit(提交)或Stash save(暂存),才能将User1和User2的修改合并。
- 解决方法:
User2选择文件C,右击选择:Stash save(保存贮藏),将文件C的修改暂存。在Stash save 窗口,可以编辑相应的注释。如下:
此时打开文件C,可以看到之前的修改已经隐藏,回到未修改时的状态。
贮藏修改后,再执行pull操作(即,相当于在未修改本地版本库前进行pull操作),此时 User2本地文件C的版本与User1、服务端均相同,贮藏的内容不会对此次pull的内容产生任 何影响。
User2可以有两个选择:
右键选择一:Pop Stash(弹出贮藏),将之前的贮藏内容弹出,继续合并到当前文件;
提示:
Pop Stash过程中出提示失败,是因为此时文件C的版本和Stash Save时的版本已经不一致(即,Stash进、出时的版本改变),所以需要手动解决冲突。
点击yes,进入编辑冲突的过程,后续的操作过程参照场景二的解决方法即可。
右键选择二:
Stash List(贮藏列表),在弹出的对话框进行贮藏内容管理,例如删除贮藏,重新对本地文件进行修改、提交、推送。
场景二:服务端相同文件冲突
- 冲突场景:User2和User1修改、提交、推送相同文件
User1修改文件B内容,提交并推送,成功;
User2修改文件B内容,提交并推送,提示冲突。
- 解决方法:
User2执行pull操作,此时文件B显示冲突状态;打开文件B如下:
说明:
<<<<<<<HEAD 与 ======= 之间的是user2本地修改的内容
======= 与 >>>>>>>(哈希值-1) 之间的是user1已经更新到服务器的内容
手动解决冲突文件,可以使用两种方法:
方法1:
直接修改文件B,删除标识符,保留所需内容(此方法只适合修改内容较少的 情况下)。修改后如下:
方法2:
使用TortoiseGitMerge工具,打开方法:右击文件,选择“Edit Conflict(编辑冲突)”。 此时,自动生成文件B的三个版本,并且对应显示在工具窗口。编辑完内容后, 选择文件另存并覆盖冲突文件B。关闭窗口后,其他三个文件自动消失。
说明:文件B的三个不同版本
BASE.txt文件: B文件对应User1、User2、服务端共同的历史版本;
LOCAL.txt文件: B文件对应User2本地修改的版本;
REMOTE.txt文件: B文件对应User1提交更新的版本(也是当前服务端的版本)。
冲突文件修改完成后,文件仍然显示冲突状态。再次右击文件,选择“Resolve…(解决冲突)”。正常弹出如下界面,确定即可。
注意:
如果此时提示如下界面,是因为当前TortoiseGit与GitBash软件版本不兼容,将TortoiseGit更新为最新版即可。
解决完冲突后,如下。User2可正常执行commit、push操作,服务端将更新User1和User2的修改。
场景三:服务端不同文件冲突
- 冲突场景:User2和User1修改、提交、推送不同文件
User1修改文件A内容,提交并推送,成功;
User2修改文件B内容,提交并推送,提示冲突。
- 解决方法:
User2执行pull操作,勾选“No Fast Forward”,拉取服务器文件A;
User2再执行push操作,A、B文件均更新到服务器。
场景四:服务端文件名冲突
- 冲突场景:User2和User1重命名同一文件
User1重命名文件A为A-1,提交并推送,成功;
User2重命名文件A为A-2,提交并推送,提示冲突。
- 解决方法:
User2执行pull操作,此时文件A-1和A-2显示冲突状态。
在上述窗口点击resolve(解决);或者右键本地冲突文件,选择“Edit Conflict(编辑冲突)”,进入文件冲突编辑窗口。
说明:文件A的三个命名版本
A-1.txt文件: User1已更新到服务端的文件名;
A-2.txt文件: User2本地修改的文件名;
A.txt文件: User1、User2、服务端的历史文件名;
根据需要保留相应的文件名,例如:只保留A-2文件,依次右键文件A-1和文件A,选择“Edit conflict(编辑冲突)”,执行删除文件,如下:
对于A-2文件,选择“Edit conflict(编辑冲突)”后,执行Create(创建)文件,如下:
创建文件A-2后,冲突文件列表显示为空,文件A-2的状态将恢复为已提交状态,如下:
此时,User需要先执行commit操作,再执行push操作,如下:
提示:
此时文件A-2显示已提交状态,是因为文件在冲突之前已经被提交到暂存区;但仍然不能直接执行push操作,是因为在解决冲突过程中,原来在本地暂存区的历史文件A和从远程pull到本地暂存区的文件A-1已经被删除,所以需要先将这两个文件的更新重新提交。
小结
TortoiseGit可视化界面,很好的解决了用户习惯在Windows系统环境下使用界面操作进行Git版本库管理的问题,而且文件状态实时同步也是一大便捷之处。
版权归原作者 流心语IoT 所有, 如有侵权,请联系我们删除。