当git重新提交很多提交时如何防止大量的git冲突?

equ*_*nt8 39 git rebase git-rebase

故事:在一个项目的中间,我的同事从大师那里创建了一个新的分支,并开始进行繁重的重新分解工作.我从master创建了我的分支,并开始在页面上做新的东西.我们经常提交,但只有我可以修改代码才能掌握(因为同事的更改太重,无法从主服务器部署).不幸的是,我们的一些工作依赖于相同的文件.因此,经过几天的工作,她终于想要改变主人的变化,她有很多git冲突.

my_branch    #---#----#-#-------#----#--#-----#---#----#----#
            /     \              \   \   \              \    \
master     *-------*--------------*---*---*--------------*----*----*
            \                                                     /
her branch   #------#-------#-----------#-----------#------------#
Run Code Online (Sandbox Code Playgroud)

问题1是:当我们处理相同的文件时,如何防止大量的git冲突?(或者在这种情况下最佳做法是什么?)

但这不是我们问题的结束,...绝对正确她试图从主人到她的分支进行变基(为了进行我所做的更改),所以提交映射应该看起来像这样

my_branch    #---#----#-#-------#----#--#-----#---#----#----#
            /     \              \   \   \              \    \
master     *-------*--------------*---*---*--------------*----*----*
            \                   \            \                    /
her branch   #------#-------#----*------#-----*-----#------------#
Run Code Online (Sandbox Code Playgroud)

这就是困扰我们的事情.在这些改变期间,她正在解决这些冲突.但是git不记得她关于冲突修复的决定,所以当她从主人她的分支做另一个git rebase时,她不得不再次修复同样的git冲突,以至于她在以前的rebase 中修复了.

问题2是:如何告诉git在分支git rebase之后记住git冲突修复,那么在下一个rebase之后我们不必再次修复相同的冲突了?

Mar*_*air 51

幸运的是,git有一个机制来处理这个被称为的问题git rerere- 基本上,如果你已经git rerere启用了,那么每次你解决冲突时,就会记住你以特定方式解决了确切冲突的事实.如果再次出现相同的冲突,则会自动使用相同的分辨率.下面有一些有用的文章:

......但基本上你可以这样做:

git config --global rerere.enabled 1
Run Code Online (Sandbox Code Playgroud)

......忘记它,同时享受更容易的变基/合并:)

  • 只是为了补充你可能也想要'git config --global rerere.autoupdate true`.此外,如果您希望团队中的其他人使用这些记录的分辨率,您可以与他们共享.git/rr-cache文件夹.干杯. (3认同)
  • @bryanbraun:是的,因为如果你以特定的方式记录冲突的解决方案,那么下次当你看到确切的冲突时它会被自动解决 - 如果你以错误的方式解决它(无论那可能是什么) )有一次,你可能甚至没有注意到它将来会再次以这种方式自动解决...... (3认同)
  • 启用全局配置设置有什么缺点吗? (2认同)

bau*_*aur 16

让我分享一种解决变基冲突的可能方法。我称之为通过合并变基。如果您想要对具有许多提交并且预计会出现许多冲突的分支进行变基,它会有所帮助。

首先,让我们创建一个temp分支并强制所有冲突通过常规合并显示

git checkout -b temp
git merge origin/master
Run Code Online (Sandbox Code Playgroud)

按常规方式解决所有冲突并完成合并。

所以temp分支现在显示了正确解决所有冲突后项目的外观。

现在让我们检查一下未受影响的分支(就这样吧alpha)。

git checkout alpha
Run Code Online (Sandbox Code Playgroud)

并通过机械冲突自动解决方案进行变基以支持当前分支。

git rebase origin/master -X theirs
Run Code Online (Sandbox Code Playgroud)

此时项目代码可能已损坏或无效。没关系,最后一步是temp通过一次额外提交从分支恢复项目状态

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)
Run Code Online (Sandbox Code Playgroud)

基本上,此步骤使用低级 git 命令创建一个新的提交,其项目状态(树)与temp分支中完全相同。新的提交将立即被合并。

就是这样。我们刚刚通过隐藏合并进行了变基。并且temp分支可以删除。

git branch -D temp
Run Code Online (Sandbox Code Playgroud)

此外,还有一个脚本可以交互地执行相同的操作。在这里能找到它。


Let*_*_Be 6

确保始终使用该--onto开关进行变基操作。

为了防止冲突,请使用浮动开发分支。每个开发人员都会不断地重新调整他们的开发分支。这很容易,因为开发人员知道他刚刚实现了什么,并且在解决冲突时不应该遇到问题。无需重新设置基础,只需合并最终版本(它已经被重新设置基础)。