精华内容
下载资源
问答
  • git合并丢失代码问题分析与解决

    千次阅读 2018-08-08 21:34:34
    git合并丢失代码问题分析与解决 转自简书,写的真心赞   问题描述 我们在主干dev和branch1分支上进行并行开发。当要把branch1功能的代码合并到dev上时,发现dev上开发的部分功能代码找不到了。 那么,是在...

    git合并丢失代码问题分析与解决


    转自简书,写的真心赞

     

    问题描述

    我们在主干dev和branch1分支上进行并行开发。当要把branch1功能的代码合并到dev上时,发现dev上开发的部分功能代码找不到了。

    那么,是在branch1上,作了删除提交导致的吗?然而,通过blame查提交日志,并没有发现删代码的提交记录。

    难道一个分支有一个功能,另一个分支没这个功能,git合并时就有可能把这块功能代码丢掉?跟功能添加时间顺序有关系?

    为了解决这个问题和相关的疑问,我们需要更加了解git合并的过程。

    git-merge过程

    稍微了解点git基础的应该都知道,合并是用的git merge命令,它只有两种,一种是快速合并(fast-forward),还有一种是三方合并(thirdparty merge)。

    如上图所求,当两个分支有直系关系时,使用快速合并,git默认都不产生新的commit结点,只是把head进行更新,如dev指向C4

    三方合并稍显复杂点,它会产生一个新的commit结点,并把head指向它。它会先去找这两个要合并分支的最近公有结点,如图中,C3 和 C5的最近公有父结点为C1。然后,git对 C1C3C5三个结点进行三方合并产生新结点C6。这里的三方合并,具体来说,就是把 C5相较于C1的 diff 应用到 C3上,最后产生C6 这个commit结点。

    现在回答上面的疑问,三方合并其实只看三个点的内容,和中间结点无任何关系,更别提跟时间有关系了。在一个分支上删除代码,如果合并时没有冲突的话,合并后是会直接删除的。

    所以,我们找到了问题的初步方向了。dev上的代码合并后没了,一定是branch1分支有问题。另外它们的最近公共结点也可能有问题!!!

    注:知道了git-merge的流程后,我们还可以知道,只要我们把这次合并代码丢失问题解决了,后续从branch1分支拉出去的分支代码再合并到dev时,都不用再解决这个代码丢失问题了。因为,合并后的提交结点和branch1分支拉出去分支的后续提交结点的父结点,已经变成branch1的当前结点了。如,C6的后续提交和C5的后续提交结点,公有结点都变成C5了。

    问题起因及检测

    为了描述问题方便,我把场景简化,搞了个demo,大家可以去下面地址clone:

    # git clone https://git.coding.net/myswift/git-merge.git
    

    提交记录用sourcetree看,是这样的(你可能已经发现问题了):

    dev合并branch1时,dev上,dev func 1部分的提交丢失。

    首先,让我们找最近公共结点吧,如果两个分支并行太久的话,可能不好直接找出来。我们可以使用git merge-base:

    # git merge-base 98d19a4 0acedcb
    9447776f5ee8c53536c947a1e13bfdead13f002b 
    

    我们发现最近的公共结点是9447776。然而,这个公共结点,并不是我们设想的。我们设想的最近公共结点应该是两个分支刚开始并行的那个结点(如图中c3275e2)。进一步发现,9447776的下一个结点有个Merge,而且是把dev合并到branch1!!!

    这就是问题的根源了,dev主干开发的一般是下个版本的功能,一般是把分支的代码合到主干上,把主干的代码逆向合并到分支上肯定是有问题的!!!

    回到开头的问题,我们看Merge结点变更记录,并没有发现有删除代码的地方啊?原因是,你看到的合并结点的修改记录,是针对一边的。回到介绍三方合并的那个图,把branch1合并到dev产生结点C6,那么C6的提交记录中显示的修改,是C6针对C3结点的。在我们的示例中,合并结点74a8d10的提交变更,显示的是74a8d10对branch1中c26c5e3的变更,而branch1中本来就没有dev中的代码,所以合并后变更根本不会显示删除。

    如果,你去比较合并结点和另一边的变更,你就可以发现问题:

    # git diff 9447776 74a8d10
    
    diff --git a/test.c b/test.c
    index 150de8d..d19a020 100644
    --- a/test.c
    +++ b/test.c
    @@ -7,8 +7,8 @@ void base_func() {
            printf("this is a crash %d\n", *p);
     }
    
    -void dev_func_1() {
    -       printf("dev func 1\n");
    +void branch_func_1(){
    +       printf("branch func1\n");
     }
    

    你可以明显看到,在合并时,把dev中的dev_func_1函数删除掉了。

    总结问题的原因是,在正式合并前,进行了逆向的合并,并在合并中悄悄把主干代码删除掉了。一般如果查看提交记录中,没有看到删除记录,那么很有可能是之前的Merge中把代码删除了。可以使用 merge-basegit diff 工具来进行定位,也可以用来检测是否有问题。

    注:很多人可能认为只要管好自己的分支就行了,然后把别的分支合过来,并在合并时或合并后随意删除另一分支的代码。这样当以后再和该分支合并时,就会有问题。好的做法,应该是只把另一个分支需要的提交用cherry-pick移过来。如,只把dev上的fec5b84优化cherry-pick复制到branch1上即可。

    解决思路

    既然我们发现了问题的原因,并知道怎么去规避、检测。那么,如果已经发生了问题,怎么去解决呢?这个可能是大家更关心的。

    其实我们最终的目标是,把branch1和dev进行合并,产生一个合并节点,并且这个合并结点的代码是正确的。

    注:有些人可能不太明白为什么一定要产生一个git合并记录节点。通过各种手段,只要保证dev上代码正确不就行了?结论是不行,因为如果没有git合并记录的话,从branch1拉出来的所有分支再想合并到dev时,还是要解决下这个代码丢失的问题(没想明白,可以再看下git-merge细节部分),而且如果把branch1分支悬着,也影响分支查看。

    保证合并后代码正确

    奔着这个目标,我们首先来保证代码的正确。

    1. dev重置到合并前

    既然最后合并branch1到dev会导致dev丢代码,我们首先把dev重置到合并前。

    # git checkout dev
    # git reset --hard HEAD~1
    

    2. 创建tmp分支,绕过错误的合并74a8d10

    我们知道branch1是有问题的,因为进行了合并dev的操作。所以,基于branch1创建一个临时分支tmp。

    # git checkout branch1
    # git checkout -b tmp
    

    把tmp的提交记录重塑,使用tmp分支回到branch1上,合并dev到branch1那个错误的合并之前的结点,示例中 74a8d10之前的那个c26c5e3结点,并提交一个新记录,这样tmp内容与branch1一样,而完全跟那个74a8d10结点没关系了。

    # git checkout tmp
    # git reset c26c5e3
    # git add .
    # git commit -m "内容与branch1一致"
    

    注:reset和reset --hard的区别,可以参考文末资料1。

    3. 合并tmp到dev

    # git checkout dev
    # git merge tmp
    

    这里dev和tmp合并时,它们的最近公共结点就不是之前错误的9447776了,而是我们设想的、dev和branch1最初分开的,c3275e2结点。

    解决冲突,并add进暂存区后,我们代码就是正确的了(先不急着提交)。

    产生合并commit对象

    上面代码正确了,如果我们直接commit的话,这个合并结点,就变成dev和tmp的合并了,而我们要的是dev和branch1的合并。所以,我们要产生一个dev和branch1合并的结点,并且内容是当前dev和tmp合并后的代码。显然,git merge不能满足我们的需求,我们需要更底层的git命令,就是git merge过程中,调用的底层命令。

    需要按序用到 write-tree -> commit-tree -> update-ref,这三条底层命令。这部分命令,可以查看参考资料2。

    1. write-tree产生tree对象

    # git add .
    # git write-tree
    853c36012082314f9463f3819d0a24da49dc5bb1
    

    我们产生了SHA-1值为 853c360的tree对象。

    2. commit-tree产生commit对象

    # git commit-tree 853c360 -p 98d19a4 -p 0acedcb -m "Merge branch 'branch1' into dev"
    675baf3973508ee03306cc5a36fe489d694e107f
    

    我们把tree对象 853c360进行了提交,并设置它的两个父结点为dev和branch1,产生了commit对象675baf3。我们可以看下这个结点的情况:

    # git cat-file 675baf3 -p
    
    tree 853c36012082314f9463f3819d0a24da49dc5bb1
    parent 98d19a4a5913f18a2c0e9821e114df9995b23d82
    parent 0acedcb89e4d25a0256fcbe7fba0bbc13de9d92e
    author Vincent <xxx> 1498497182 +0800
    committer Vincent <xxx> 1498497182 +0800
    
    Merge branch 'branch1' into dev
    

    3. 更新head

    使用如下命令,更新dev的指向这个新的commit对象, 675baf3

    # git update-ref refs/heads/dev 675baf3
    

    最终合并结果如下:

    可以验证,branch1合并到dev了,而且内容是正确的(即不会少dev fun 1部分的代码)。

    这个解决问题的示例代码,也上传到coding了,两份示例代码,之前的结点都是一致的。

    # git clone https://git.coding.net/myswift/git-merge2.git
    

    注:知道了git merge这些底层命令,你可以更加灵活地解决git问题,你可以结点随意合并,head随便指,是不是很开心,哈哈。

    更粗暴的方法

    如果你觉得底层命令不好理解。你可以:

    • 先整个目录拷备下工程(包含.git目录),比如拷贝到bak目录

    • 在工程中直接合并branch1到dev上,不解决冲突,不提交

    • 在bak目录,按照上面保存代码正确的方法,在bak目录合并出正确的代码。

    • 把bak目录中,除了.git目录外的东东,全部拷贝覆盖到原来工程目录中

    • 在原来工程目录中,提交

    这样比较好理解,缺点是工程如果大的话,拷来拷去花费时间比较长,而且不够优雅。

    其他解决思路

    上面描述的思路,我认为是最行之有效的。也试了其他思路,比如:

    • 查看git merge的参数,发现并没有可以自由设置base节点的方法,只有设置发现base节点的策略,而且这些策略发现的base节点都是那个错误的合并。

    • undo merge。参考资料3。然而,感觉revert merge的能力有限,加-m1参数、和-m2参数,均无法满足要求。

    • rebase branch1。错误发现生在branch1,那么重建branch1呢?把所有branch1上合并后的提交都重新提交呢?结果发现branch1上有太多合并冲突,rebase时,要把这个合并的冲突重新解决,很麻烦。

    这些思路,大家也可以继续研究下,感觉不能解决问题,也可能是我了解得有问题。当然,你有其他思路,也希望你交流下。

    迷思

    本文中,是因为错误地把dev合并到branch1上,导致了后面合并的问题。但是,我们真实遇到的场景,虽然看起来是一样的,也可以用文中的方法解决,但是也有细微不同,而且不知道如何出现这个问题。

    真实的场景下,也会出现一个dev合并到branch1的Merge提交,但是显示的信息是 "Revert xxx",据提交人员讲,这个确实是做的Revert操作,不知如何变成Merge结点了。用的sourcetree,提交人员也没法说清怎么必现这个问题。

    如果,你知道怎么操作能出现这个问题,希望你告诉我。。。

    总结

    文中描述了一种可能导致git合并代码丢失的错误操作,并讲解了如何规避、检测、解决这种错误。并粗略介绍了,git merge流程,git merge底层过程。

    说简单点,问题是因为悄悄在合并中把代码删除了。解决思路是,悄悄在后面的合并中把代码加回来。

    参考

    1. git-recipes

    2. Git 内部原理-commit对象

    3. Reverting a Merge

     

    原文:https://www.jianshu.com/p/603186352605

    展开全文
  • idea:svn不能同步代码问题修正

    万次阅读 2017-12-13 08:06:56
    svn 不能同步代码问题修正 File -> Settings ->Subversion ->General => Use command line client 选中使用command line方式需要指定svn.exe的路径,例如:D:\tools\TortoiseSVN\bin\svn.exe注意,安装TortoiseSVN...
    svn 不能同步代码问题修正
       
    1. File -> Settings ->Subversion ->General => Use command line client 选中
    2. 使用command line方式需要指定svn.exe的路径,例如:D:\tools\TortoiseSVN\bin\svn.exe
    3. 注意,安装TortoiseSVN时路径中不要带空格,例如:C:\Program Files\TortoiseSVN\bin\svn.exe就会报错.
    4. 安装TortoiseSVN选择全部安装组件,否则可能没有svn.exe


    展开全文
  • VS2017中无法提示Unity代码问题

    千次阅读 2018-10-25 15:00:19
    只有这个方法有效。

    只有这个方法有效。

    展开全文
  • 首部说明,博主IDEA jsp代码始终没有提示,网上遍寻各种答案...不过为了解决大多数人问题,还是决定从头码起,前部步骤引用tangxl2008008发布的文章 1.首先取消省电模式 取消“Power SaveMode”;File –&gt;...

    首部说明,博主IDEA jsp代码始终没有提示,网上遍寻各种答案,尝试过之后全都无果。

    一次偶然的机会发现了解决的办法,现在分享给大家,希望和我一样,无论怎么尝试都没法解决jsp没法提示代码的人

    可以远离烦恼~~~

    不过为了解决大多数人问题,还是决定从头码起,前部步骤引用tangxl2008008发布的文章

    1.首先取消省电模式

    取消“Power SaveMode”;File –> Power Save Mode,取消勾选:

    这也是可能造成无法代码提示的一个原因。

    2.有一丝丝小可能没有下插件,不过大多数情况下,配置的时候都已经下了,所以大部分问题不出在这,不过

    防止特殊情况的朋友,也在此码下吧~

    setting-->Plugins-->jsp插件,打钩确认后即可()

    3.项目结构添加依赖

    File -> Project Structure,打开项目设置页面;选择到“Dependencies”便签 -> 点击“+”-> 2Librarys:

     

     

    在Choose Libraries页面,选择“Tomcat”:

    将Tomcat的Scope设置为Provinced,然后保存设置:

    4.保存成功后,回到jsp页面

    若依旧无法解决,那么在码jsp代码的时候不要着急闭合标签,输入<%之后在后面打代码会有各种提示

    而在闭合之后在其中输入,就没有代码提示了,想来也是十分神奇~不过困扰了2天的问题终于解决了,心情也是十分舒畅,希望没有解决的朋友看到此篇文章之后也能解决困恼~~~

    如果还是没能解决的在此留言,一定会看~~很乐意帮助解决~O(∩_∩)O~

    展开全文
  • 0x00000A蓝屏代码问题与解决

    万次阅读 2010-01-03 12:50:00
    近日,朋友说系统崩掉了,赶紧的拿了一张盘,...蓝屏,代码为0X00000A.重新启动后,没过多久,问题依旧出现。一问朋友,原来这台电脑一直存在这个情况。开始着手解决这个蓝屏问题。 到官网找代码一看: 0x0000000A:I
  • 用时候在用git pull命令的时候不管用,拉取不下来远程分支上的代码,是因为本地分支和远程分支没有建立关联。 处理这种问题很简单就按照提示执行命令即可:git branch --set-upstream-to=origin/fixbug-...
  • 代码整洁 vs 代码肮脏

    万次阅读 多人点赞 2019-09-16 12:05:12
    写出整洁的代码,是每个程序员的追求。《clean code》指出,要想写出好的代码,首先得知道什么是肮脏代码、什么是整洁代码;然后通过大量的刻意练习,才能真正写出整洁的代码。 WTF/min是衡量代码质量的唯一标准,...
  • 解决Intellji Idea修改代码以后无效的问题

    万次阅读 多人点赞 2018-03-15 14:16:50
    因为之前一直用的maven构建的项目,可以直接install,所以没有出现这个问题,直到最近接手一个需要维护的老项目没有用到maven,调试的时候总是修改代码后不生效,即使重启idea还是重启tomcat都没用。 先说说我刚开始...
  • 14个提高代码质量的好问题

    万次阅读 多人点赞 2020-04-17 08:07:51
    阅读本文大概需要 2.6 分钟。并不是代码写的越多,代码的质量就越高。思考才是。解决一个问题,打开电脑就手撕代码,最终的结果往往是各种代码问题,经过一系列迭代后,代码积重难返,最终的结果...
  • fortify代码扫描问题结果分析

    万次阅读 2017-02-24 14:23:15
    最近项目的代码使用fortify工具扫描了一下,发现了项目中存在的一些问题,在...代码问题主要集中在如下类别:存在安全隐患、存在资源泄漏隐患、序列化问题、字符串比较、异常处理问题,以及其它一些BAD PRACTICE和粗
  • 后来换了台新机器部署项目,vs调试时弹窗提示:由于找不到VCRUNTIME140.dll,无法继续执行代码问题解决,重新安装程序可能会解决此问题。 问题原因分析: VCRUNTIME140.dll 可解读为 VC运行环境14.0版本,我们知道...
  • idea中properties配置文件没有代码提示及代码高亮问题解决方案,大家多多支持。。。
  • 解决IDEA代码重叠问题

    万次阅读 2021-03-26 20:17:58
    1 问题描述 IDEA默认情况下会出现代码重叠,如下图所示: 2 解决方法 快捷键:ctrl+shift+s,弹出设置面板 直接搜索code folding 点击General下面的Code Folding选项,再在右侧取消one-line methods前面的对勾 ...
  • Android Studio不自动代码提示问题解决

    千次阅读 2019-09-11 14:24:31
    在编写代码时,代码不自动提示,而代码自动提示的设置正常,经过一番研究后发现问题原因在于节能模式的开启,具体解决方式如下: 关闭节能模式 如上图所示,将Power Save Mode前面的对勾去掉,则完成节能模式的...
  • 今天在使用hbuilder书写前端页面时,没有代码提示。但其他工程有。 花了几分钟发现,在我们导入eclipse工程的时候,有一种方式导入的时候是没有代码提示的。 如下:有代码提示的导入方式,点击打开目录(有代码...
  • 最近在idea使用git提交代码的时候,更新之后发现自己的代码还没提交就已经没了 不知道是不是自己git命令使用有问题,反正做个记录吧 右击项目,选择 “Local History” —&gt; “Show History” ,弹出一个框,...
  • 记一次使用Android studio修改代码不生效的问题

    万次阅读 多人点赞 2016-07-05 15:49:23
    问题并没有解决,调试了半天发现原来新的代码并未生效,新打的log日志都没有,长舒一口气,原来并不是我的代码问题,是as的问题,好办!一顿clean,rebuild,卸载——卸载、clean、rebuild。。然而并没有什么卵用。...
  • 关于错误代码为0x80070643的问题的解决办法 解决方法:关于错误代码为0x80070643的问题的解决办法
  • IDEA Properties代码高亮问题

    千次阅读 2016-11-22 14:05:45
    IDEA Properties代码高亮问题IDEA默认会对.Properties文件进行unused检查,会使Properties变灰不高亮,解决方法看这里
  • vscode 解决格式化代码无效问题

    万次阅读 2019-01-09 10:13:14
    1、原因: vscode默认启用了根据文件类型自动设置tabsize的选项, 2、解决方法: 因此,可以通过关闭自动设置选项,防止格式覆盖。 3、如何操作 ... 在用户设置里添加如下配置即可: "...
  • vscode中react代码格式化问题

    千次阅读 2019-06-26 11:14:46
    之后调了一下语言模式,调成javascript React之后,把之前乱掉的react代码格式调整好,保存,是解决了当前文件的问题,但是换到其他react文件,还是需要修改。太麻烦了 看了一下之前安装的扩展程序, 设置为禁用,...
  • 今天安装配置最新版svn时遇到了这个问题 安装了以下运行库成功解决 微软常用运行库合集_2019.07.20_X64 提取码:0ovs
  • 完美解决vscode没有代码提示的问题

    万次阅读 多人点赞 2019-07-29 18:36:25
    问题 使用vscode打代码时老是没有提示。 解决 一般都移动一下光标之后再继续写就能有代码提示了. 效果如图 在设置中搜索prevent 把前面那个勾取消掉 设置完就立即生效了 ...
  • KEIL5代码自动补全设置不显示问题

    万次阅读 2019-07-21 12:49:47
    有同学可能遇到这样的问题,怎样自动补代码设置没有了呢??? 1.需要Keil4.7版本以上开始支持代码补全功能 2.查看自己是否安装了中文补丁 (本人也因为这个原因 —.—)!!! 3.重装keil 5 ...
  • MTSP问题遗传算法解决代码及其案例

    千次阅读 多人点赞 2020-06-05 16:58:53
    问题类型:解决所有旅行商从同一地点出发,同时回到同一地点(不是出发点)的问题。 个体的基因型: 设置基因型为两段: 1、路径基因型 2、中断点基因型 这些意味着什么呢?假设有3个旅行商,10个城市,城市...
  • 每次修改完Java代码,点击运行Tomcat,发现根本没有修改。刚刚开始的时候,因为一开始没找到原因,并没有立马解决。使用了另外一种比较麻烦的界面办法,就是Project-->Clean …。这样子,虽然能解决暂时不能部署...
  • C/C++ 代码换行问题

    万次阅读 2011-10-18 15:18:03
    C/C++ 代码换行问题 在写代码的时候遇到代码超长的情况下为了代码的美观及方便测试,故需要涉及到代码的换行问题,以下讨论了几种的情况: 1、#define的宏  宏定义是以“\”换行,如: #define MAX(a,b) ...
  • 闲暇之余,总结并撸码测试了一下静态代码块、构造代码块、构造方法的执行顺序及需要注意的问题 当然,首先大家得知道静态代码块是跟着类的加载而加载的,而构造代码块和构造方法是随着对象的加载而加载的,相比这个...
  • VSCode代码修改延迟的问题

    万次阅读 2017-09-10 16:16:44
    VSCode在修改完代码后,会根据配置在指定的延时之后才将文件自动保存到硬盘;而且,其代码编译、解释...造成这个问题的原因实际是VSCode默认在用户使用Ctrl+Shift+N执行的时候并不会自动保存新的文件,因此实际运行的是
  • 解决VSCode没有代码提示的问题

    万次阅读 2020-03-07 13:45:29
    在使用vscode写代码的过程中,有时候会遇到代码提示没有了,还有自己定义的常用的代码片段,比如console 或者是const等等; // 自定义的代码片段 "Print to console": { "prefix": "cl", "body": [ "console.log...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,373,188
精华内容 2,549,275
关键字:

代码问题