gpt4 book ai didi

git - 用黑色重新格式化整个 python 代码库后解决 git 冲突的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-05 06:07:52 25 4
gpt4 key购买 nike

假设有一个大型项目不遵守特定的 python 格式化标准,并且您想使用 python 格式化程序black 重新格式化所有 python 代码,并且假设大型项目非常大(假设约 2,000 个 python 文件),以及约 30 名从事该项目的人员,每个人都在多个分支上从事多个功能。也可能有不同的半卡住“主”分支,偶尔会与较新的代码 merge 。

在整个代码库上使用黑色会导致与任何打开的分支发生 super 冲突...您将如何着手执行此过程并最大程度地减少冲突?

最佳答案

我只是需要做一些类似的事情,所以我想我应该分享对我有用的东西。

假设您有一个主分支和一个功能分支,它们在许多提交前从主分支中分离出来。在某些时候你配置了 pre-commit在主分支上有 black、isort 和其他自动格式化程序。现在您想将功能分支 rebase 或 merge 到主分支并避免所有冲突。

这里的主要想法是用新的格式化程序重写功能分支中的提交,这样分支之间的任何差异都不会与格式相关。

首先,我们需要找到feature从master中分离出来的点:

git merge-base feature master

我们可以用一些 shell 技巧给它起一个名字:

git branch feature_base $(git merge-base feature master)

现在让我们将格式化程序应用于 feature_base。对我来说,这只涉及从 master 分支复制 .pre-commit-config.yaml 和 pyproject.toml。

git checkout feature_base
git checkout master -- .pre-commit-config.yaml pyproject.toml
pre-commit run --all-files
git commit -nam "Applied formatting"

预提交步骤可能需要一段时间,因为它会自动格式化存储库中的每个文件。请注意,我向 git commit 命令添加了 -n 选项,它会跳过再次运行预提交 Hook 。这只是为了节省一些时间。

现在我们准备好进行 rebase 了。为方便起见,让我们为重新定位的功能分支起一个新名称,以便在出现问题时可以轻松使用旧名称:

git branch feature_formatted feature

现在重写 feature_formatted 分支:

git rebase feature_base feature_formatted -Xtheirs --exec 'git reset --soft HEAD^; pre-commit run; git add -u; git commit -C HEAD@{1}'

让我们回顾一下这个命令的细节:

git rebase feature_base feature_formatted 告诉 git 将 feature_formatted 分支中的提交重写到 feature_base 分支之上。

通常,这会导致许多 merge 冲突,都是由我们在上面执行的格式更改引起的。 -Xtheirs 选项告诉 git 不要费心尝试实际 merge 任何东西,而只使用原始功能分支中的文件。

--exec 选项告诉 git 在 rebased 分支中的每次提交后运行特定的 shell 命令。我们在这里要做的是再次应用格式,因为 -Xtheirs 选项给我们留下了未格式化的文件。为了做到这一点,我们“撤消”最后一次提交,应用预配置,然后再次提交。

git reset --soft HEAD^ - 您之前可能使用过 git reset 来撤消提交。 --soft 选项意味着代码更改保留在暂存区中,准备再次提交。

pre-commit run - 由于所有内容都已准备好提交,因此运行 pre-commit Hook 只会将格式应用于所有已更改的文件。

git add -u - 此命令将预提交运行所做的任何更改添加到暂存区。

git commit -C HEAD@{1} --no-edit - -C 参数告诉 git 从另一个提交复制提交细节。另一个提交是 HEAD@[1} ,意思是“HEAD 的最后一个地方”。在我们的例子中,这是我们在 git reset 命令之前进行的提交。

就是这样!我们完成了。现在 feature_formatted 分支可以 merge 到 master 中,而不会出现任何与格式相关的冲突。如果你想 rebase 到 master,你应该避免从功能库提交“Applied formatting”,所以你应该使用这个命令:

git rebase feature_base feature_formatted --onto master

关于git - 用黑色重新格式化整个 python 代码库后解决 git 冲突的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65304887/

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