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 · 4399 次点击
    这是一个创建于 1270 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    28 条回复    2021-05-29 21:08:33 +08:00
    zpfhbyx
        1
    zpfhbyx  
       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
        6
    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
    从管理上解决问题,技术是第二个要做的。我合作的时候也遇到过和别人格式不同,拉下来一个快捷键格式化就全变了
    bojackhorseman
        22
    bojackhorseman  
       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   ·   实用小工具   ·   5429 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:55 · PVG 13:55 · LAX 21:55 · JFK 00:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.