如何在一个多分支的项目中,避免因代码格式化导致的 git 冲突? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
Kamitora
V2EX    git

如何在一个多分支的项目中,避免因代码格式化导致的 git 冲突?

  •  
  •   Kamitora 2021-05-24 15:08:33 +08:00 4945 次点击
    这是一个创建于 1603 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如说,插件把 Foo someBar=fooBar() 转换为 Foo someBar = fooBar()

    28 条回复    2021-05-29 21:08:33 +08:00
    justseemore
        1
    justseemore  
       2021-05-24 15:11:17 +08:00   3
    加钩子 强制格式化
    luckyrayyy
        2
    luckyrayyy  
       2021-05-24 15:11:45 +08:00
    没懂,代码格式化为什么会导致代码冲突?别人也改了这行?
    wzxlovesy
        3
    wzxlovesy  
       2021-05-24 15:12:17 +08:00 via Android   1
    加一些 format check 到 pre commit hook 中?
    x66
        4
    x66  
       2021-05-24 15:18:38 +08:00   1
    idea 可以在提交之前 reformat code, 保持大家的设置一致即可
    Kamitora
        5
    Kamitora  
    OP
       2021-05-24 15:20:12 +08:00
    @luckyrayyy
    如果别人的代码没有格式化,插件就会修改那些行。虽然内容没有变,但是空格、换行之类的仍然会导致冲突。
    scxiazi
       
    scxiazi  
       2021-05-24 15:27:00 +08:00   1
    统一格式化方式 强制格式化
    BeautifulSoap
        7
    BeautifulSoap  
       2021-05-24 15:27:04 +08:00 via Android   2
    lz 的这个问题的根本原因在于,代码作者提交的新代码没有经过格式化,这新代码合并到主干分支后,如果别人再格式化的话容易导致合并冲突

    解决办法就是从根本上禁止提交没有经过格式化的代码,这样就能保证所有人提交的新代码都格式化过

    首先强制每个人使用统一个代码格式化风格,然后在每次提 pull request 或 pr 有新提交的候用 GitHub action 强制校验代码风格,如果校验失败(比如 pr 提交的代码没有没格式化或不符合风格)的话,直接禁止 pr 合并,只有代码风格检验通过才行
    BeautifulSoap
        8
    BeautifulSoap  
       2021-05-24 15:29:28 +08:00 via Android   1
    @luckyrayyy 格式化经常性动的不止是一行,可能整个文件都动了,大括号的位置,空行的调整之类的。整个文件都改了的话,这提交上去非常大几率会合并冲突。
    Zhuzhuchenyan
        9
    Zhuzhuchenyan  
       2021-05-24 15:37:01 +08:00   1
    楼上已经说得很好,可以用 pre commit hook 来做格式化的琐碎事情,或者 jetbrains 系的 ide 都可以设置在 commit 之前做 code cleanup

    建议专门找个时间按照统一标准把整个 repo 都按照统一的标准格式化了,以绝后患
    unco020511
        10
    unco020511  
       2021-05-24 15:53:33 +08:00   1
    首先团队内要统一格式化的配置文件,然后 git hook 强制格式化检测
    wellsc
        11
    wellsc  
       2021-05-24 16:08:58 +08:00
    ci, fmt
    fzzf230
        12
    fzzf230  
       2021-05-24 16:20:14 +08:00
    提交之前统一格式化代码
    wzxlovesy
        13
    wzxlovesy  
       2021-05-24 16:47:17 +08:00 via Android   1
    @Kamitora 也有脚本可以只 format 当前 commit 修改过的代码,不 format 其他已有代码
    www5070504
        14
    www5070504  
       2021-05-24 17:05:01 +08:00
    从刚开始就统一用 flake8 检查
    efaun
        15
    efaun  
       2021-05-24 17:35:41 +08:00
    代码格式化应该就是编程规范
    tomkliyes
        16
    tomkliyes  
       2021-05-24 18:01:56 +08:00
    这个首先应当从流程上杜绝,不允许未格式化的代码提交。其次需要统一团队所有人的格式化工具和方法
    SorcererXW
        17
    SorcererXW  
       2021-05-24 18:16:29 +08:00
    加 linter, 不格式化不准合并
    Mutoo
        18
    Mutoo  
       2021-05-24 20:25:51 +08:00   4
    前端项目有很成熟的工具链完成这个保障:
    husky + lint-staged + eslint + prettier

    husky 负责 git hook
    lint-staged 负责使用指定 linter 对有变更的文件进行检查
    eslint 负责代码检查
    prettier 负责代码风格管理

    启用后基本可以杜绝格式化导致的冲突。
    Al0rid4l
        19
    Al0rid4l  
       2021-05-24 20:39:47 +08:00
    linter + git hook 呀, 不符合规范不让提交
    abc612008
        20
    abc612008  
       2021-05-24 22:18:20 +08:00
    建议做个宏,把 ctrl+s 变成格式化+保存
    raaaaaar
        21
    raaaaaar  
       2021-05-24 22:43:18 +08:00 via Android
    从管理上解决问题,技术是第二个要做的。我合作的时候也遇到过和别人格式不同,拉下来一个快捷键格式化就全变了
    dumbass
        22
    dumbass  
       2021-05-24 22:46:36 +08:00 via iPhone
    我用的 prettier 提供的一套方案,还挺好,再也没有每次提交一堆没用的格式化 diff 信息。
    ooops
        23
    ooops  
       2021-05-24 22:47:52 +08:00 via iPhone
    我提一点:有时候冲突是避免不了的(格式以外的),你也可以从解冲突工具入手,比如 beyond compare,jetbrains IDE 基本都有自动解冲突功能,省时省力。
    acmore
        24
    acmore  
       2021-05-24 23:50:15 +08:00   1
    风格和格式的统一是项目开发的基础,就像要准备好 .gitignore 一样。不同的语言会有对应的格式配置文件,在项目初始化的时候就要带进去。
    strawberryBug
        25
    strawberryBug  
       2021-05-25 00:01:45 +08:00 via Android
    checkstyle 了解一下?可以做格式化以及代码检查
    zjq07
        26
    zjq07  
       2021-05-25 09:34:57 +08:00   1
    @luckyrayyy 我实习的时候就这么干过,我用 idea 习惯性的使用格式化代码的快捷键,一个类的代码就会被格式化,缩进的变动也会有记录。然后结果就是提交的时候一个类全是修改,被主管一通骂,自那以后再也不敢直接全局格式化,都是选中自己写的代码块之后再格式化。
    kingzeus
        27
    kingzeus  
       2021-05-25 10:46:24 +08:00   1
    @zjq07 项目团队应该共用统一的配置,这样代码格式才能一致。
    反过来,修改 code style,最好也是团队投票的结果。
    先确定下来 code style,然后完成对应的 lint,最后同步给所有人
    MarioLuo
        28
    MarioLuo  
       2021-05-29 21:08:33 +08:00 via Android
    1.统一团队代码风格, 建议基于 google 风格提供的 idea 配置文件定制(4 空格缩进, 120 行宽)
    2.在项目没有开发分支是全局格式化掉
    这样以后怎么格式化大家都一样了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     951 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 383ms UTC 20:05 PVG 04:05 LAX 13:05 JFK 16:05
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86