gpt4 book ai didi

Git - 糟糕的 merge 永久忽略子分支中的文件更改

转载 作者:太空狗 更新时间:2023-10-29 13:59:28 26 4
gpt4 key购买 nike

给定两个分支,一个是另一个的子集 - 在 merge 中,第一个分支中的文件更改在第二个分支中被永久忽略,开发人员取消暂存文件,然后提交 merge 的其余部分。

AKA - 由于 merge 不佳,应该在子分支中的代码片段被忽略。这是最近才在大型开发环境中发现的,由于重复使用此错误,子分支中的文件丢失。如何找到缺少主分支更改的提交/文件?或者至少尝试解决问题(超过 4 个月的时间和数百次提交)。我们已尝试挑选我们可以找到的提交,但无疑无法找到所有提交。

这里有详细的复现方法

  1. create two files - write two lines in each file
  2. commit them to master
  3. create second branch
  4. switch to second branch - modify file line in second file
    1. stage and commit
  5. switch to first branch - modify same file line for conflict
  6. on first branch - on file that wasn’t modified before, change a line
  7. switch to second branch and merge first branch
  8. fix conflict and stage file -> then unstage non-conflicted file
  9. commit second branch
  10. switch to first branch and discard local changes
  11. do some new code that doesn’t affect step 6.
  12. stage and commit new code
  13. switch to second branch and merge first branch

请注意,第 10 步发生了变化,而第 6 步仍然缺失。所有后续 merge 将忽略步骤 6 中的更改,因为 git 认为他们的提交已被 merge (尽管在 git 眼中是正确的 - 它对开发人员不起作用,因为 merge 是错误的并且不应该被提交)

最佳答案

不幸的是,对于没有 git 经验的人来说,这是一种常见的情况,因为他们在索引中看到他们没有修改的文件,并因此丢弃它们。我编写了一个脚本来检测这些拙劣的 merge 并报告哪些文件未暂存。它以引用规范作为参数(例如 masterHEAD^7..HEAD--since=2.weeks 等。 ) 并默认为 --all 如果没有提供参数。它不是最有效的脚本(我真的需要改进计算两个文件列表差异的位);我有一个更快的 .exe 版本,但我不能随意分享我为雇主编写的版本。无论如何,它在这里:

 isChangeInBaseChanges() {
for element in ${baseChanges[@]}; do
if [ $element == $change ]
then
return 1
fi
done
return 0
}

revopts=`git rev-parse --revs-only $*`

if ! [[ $revopts ]]
then
revopts="--all"
fi

exitCode=0

for merge in `git rev-list --min-parents=2 $revopts`; do
mergeChanges=`git log -m -1 --name-only --pretty="format:" $merge | sort -u`
mergeBase=`git merge-base $merge^ $merge^2`
baseChanges=`git diff --name-only $merge $mergeBase`

lostFiles=()
for change in ${mergeChanges[@]}; do
isChangeInBaseChanges
if [ $? -ne 1 ]
then
lostFiles+=($change)
fi
done

if [ ${#lostFiles[@]} -ne 0 ]
then
exitCode=1
echo -n "Possible botched merge at "
echo $merge
echo "files with lost changes are: "
for lostFile in ${lostFiles[@]}; do
echo $lostFile
done
echo --------------------------------------------
fi

done

exit $exitCode

请注意,为了减少将来发生这种情况,您可以做的一件事(除了教育您的开发人员之外)是让每个人都在功能分支上工作,然后将其 merge 到 master 中。这样,他们在临时区域中看到的唯一文件就是他们更改的文件,而不是其他人更改的文件。

关于Git - 糟糕的 merge 永久忽略子分支中的文件更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35510541/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com