首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在用黑色重新格式化整个python代码库之后,解决git冲突的最佳方法是什么?

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

Stack Overflow用户
提问于 2020-12-15 11:22:40
回答 1查看 348关注 0票数 3

假设有一个大型项目不遵守特定的python格式标准,并且您希望使用python 黑色重新格式化所有python代码,并且假设大型项目相当大(假设大约有2,000个python文件),并且大约有30人在处理该项目,每个人在多个分支上处理多个特性。此外,还可以有不同的半冻结“主”分支,这些分支偶尔会与较新的代码合并。

在整个代码库上使用黑色会导致与任何打开分支的超级冲突.你将如何做这个过程和尽量减少冲突?

EN

回答 1

Stack Overflow用户

发布于 2022-10-07 05:35:09

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

假设您有一个主分支和一个分离主多提交的特性分支。在某个时候,您在主分支上配置了预承诺,使用黑色、isort和其他自动格式化器。现在,您希望重新建立功能分支或将其合并到主分支中,并避免所有冲突。

这里的主要思想是用新的格式化程序在特性分支中重写提交,这样分支之间的任何差异就不会与格式相关。

首先,我们需要找到功能与主功能分离的点:

代码语言:javascript
运行
复制
git merge-base feature master

我们可以给它起一个名字,用一些壳的诡计:

代码语言:javascript
运行
复制
git branch feature_base $(git merge-base feature master)

现在,让我们将格式化程序应用于feature_base。对我来说,这只需要从主分支复制. pyproject.toml config.yaml和pyproject.toml。

代码语言:javascript
运行
复制
git checkout feature_base
git checkout master -- .pre-commit-config.yaml pyproject.toml
pre-commit run --all-files
git commit -nam "Applied formatting"

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

现在我们已经准备好重新基地了。为了方便起见,让我们给基于重命名的特性分支一个新名称,这样我们就可以很容易地获得旧的名称,以防出了什么问题:

代码语言:javascript
运行
复制
git branch feature_formatted feature

现在要重写feature_formatted分支:

代码语言:javascript
运行
复制
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分支的顶部。

通常,这将导致许多合并冲突,所有这些冲突都是由我们上面执行的格式更改引起的。-Xtheirs选项告诉git不要费心地尝试合并任何东西,只需使用原始特性分支中的文件即可。

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

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

pre-commit run -由于一切都是为了提交而进行的,运行预提交钩子只会将格式应用于所有更改的文件。

git add -u -这个命令添加了对临时区域进行的预提交运行所做的任何更改。

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

就这样!我们说完了。现在,可以将feature_formatted分支合并到主服务器中,而无需任何格式化的相关冲突。如果您想要重基到主服务器上,您应该避免使用功能库中的“应用格式”提交,因此您应该使用以下命令:

代码语言:javascript
运行
复制
git rebase feature_base feature_formatted --onto master
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65304887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档