Git提交引发代码丢失的问题(原创)

现象

同一个分支里多人协作,后提交的人需要合并别人的代码,在合并代码有冲突的情况下,如果处理不当(这里更多是用gui工具操作导致的,例如TortoiseGit🤣),会造成别人提交的代码丢失。

或者在多分支情况下,合并代码时,发现有冲突需要处理,处理不当同样会把别人之前提交的代码给弄丢了。

而且是莫名其妙的,查看历史提交记录也找不到主动删除代码的记录。

原因

由于提交或合并代码时,发现有冲突。本地处理冲突的过程中,改完冲突文件,只把自己修改的代码提交了,没有把别人的代码也一并提交,从而导致别人的代码丢失。

这里需要说明的是,Git在合并代码时,不仅有你的代码需要提交,还有别人的代码也需要提交。因为,git 会把从两个分支的公有节点开始后所有的变更,放到当前统一处理。

如图所示:将A3和B2合并,生成C提交点。在做合并处理时,Git会将A1开始的所有变更做统一处理(A2、A3、B1、B2)。此时,如果没有冲突,Git会自动处理,不会有任何问题。如果有冲突,就需要注意,在提交B1、B2的时候,也要把A2、A3的变更也提交。

从以上的分析可以看到,如果合并或提交代码时没有冲突,是不可能出现丢失代码的。

只有存在冲突时,Git会暂停合并,等待人工处理,然后再默认将从公有节点开始的所有提交做合并处理。此时,如果操作正常,也不会丢失代码。只有在提交时,有选择的只提交自己的,才会导致代码丢失。

下面在本地实际操作来模拟丢失代码的情况

这里用本地的一个demo项目为例,demo项目中有2个分支:develop和feature

目的是把feature分支的变更合并到develop

第一步:在develop分支新建两个文件file1和file2,并提交

第二步:在feature分支也新建同名的file1文件,并提交

下一步其实是想直接跳到第四步,将feature的变更合并到develop。但是由于develop和feature的file1文件内容不一样,有冲突,所以会操作失败。

因此,先做第三步,同步develop的代码到feature,发现也会有冲突(file1文件)。如果此时只提交file1文件,貌似是合理,但其实是把file2文件给弄丢了。Git在此时一般会有提示,阻止合并代码时只提交部分文件,但是可能有些gui工具会有选择提交的选项,导致此现象的发生。

具体的操作过程如下:

本例是使用命令行的方式,发现想要模拟出丢失代码的现象还是挺难的,正常开发过程中,基本不会出现。

如果大家感兴趣,也可以用gui工具模拟试试。

1  新建demo目录,并初始化为git项目

通过以上git init的初始化操作,新的git project就建好了

2 新建develop和feature分支

3 切换到develop分支,新建file1文件和file2文件,添加内容,并提交

此时的分支图如下:

4 切换到feature分支,新建file1文件,添加与develop分支不同的内容(develop中file1的内容是两行11),并提交

此时的分支图如下:

可以看到,此时develop和feature生成了两个不同的支线,而且都修改了file1。合并时会发生冲突。

5 尝试直接将feature的内容合并到develop分支

file1文件冲突,阻止了自动合并,查看file1文件内容,里面有两个分支的内容需要手动处理。实际开发过程中,此过程类似我们直接提交代码到gitlab,发现有冲突gitlab不允许push,直接撤回,让本地自己处理。所以,我们先还原合并,也不做处理。

6  切换到feature分支,同步develop的代码过来

注意:这里会看到,同步代码后,feature里面有file1和file2文件,这本身是没问题的。但是查看git status会发现,file2文件需要被提交。但是feature分支里,根本就没有对file2文件做任何操作。

此时,如果我们修改的file1的冲突,然后做commit操作,git会自动将file1和file2提交,不会丢失任何代码。

下面我们换一种方式,强制让file2不提交,模拟丢失代码的情况。

先将file2的提交撤回,然后修改file1文件的冲突,提交file1文件。此时的分支图如下:

feature同步了develop的变更,并处理了file1文件的冲突,但是没有操作file2,也没有提交file2。

7  我们再将feature的内容合并到develop分支,此时由于file1文件的冲突已经处理完毕,会自动完成合并操作。

注意file2文件的变化,合并之前develop文件有file2文件,并且有内容。合并之后,file2文件直接被删除了。

从分支图中也看不出任何删除file2文件的操作:(神奇的抹掉了操作痕迹)

至此,完成模拟合并丢失代码的全部操作。

结论

提交代码或合并代码有冲突的情况下,解决完冲突后,

一定要提交全部代码,包括不是自己修改的!

一定要提交全部代码,包括不是自己修改的!

一定要提交全部代码,包括不是自己修改的!

Git是一个流行的版本控制系统,通过分布式版本控制的方式,可以很好地解决代码提交冲突问题。以下是一些常用的Git解决代码提交冲突的方法: 1. 使用分支管理:在多人协作开发中,使用Git的分支管理功能可以很好地避免代码提交冲突。每个开发者可以在自己的分支上进行开发,避免直接修改主分支的代码,这样可以避免出现代码提交冲突的问题。 2. 提交代码前拉取最新代码:在进行代码提交之前,建议先从远程仓库中拉取最新的代码,这样可以避免其他开发者已经提交了新代码,导致出现冲突。 3. 使用合并工具:当出现代码提交冲突时,可以使用Git提供的合并工具来解决冲突。在合并代码时,需要仔细阅读提示信息,选择保留重要的代码和功能,同时需要避免出现重复的代码。 4. 手动解决冲突:如果无法通过合并工具来解决冲突,可以手动解决冲突。这需要仔细阅读冲突代码,选择保留重要的代码和功能,同时需要避免出现重复的代码。 5. 使用rebase命令:rebase命令可以将当前分支的修改合并到其他分支中,这样可以避免出现代码提交冲突的问题。在使用rebase命令时,需要仔细阅读提示信息,选择保留重要的代码和功能,同时需要避免出现重复的代码。 总之,Git提供了很多解决代码提交冲突的方法,开发者可以根据自己的需求选择合适的方法来解决冲突问题。同时,要注意及时提交代码,避免代码提交冲突的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值