YAOTU INSIGHTS

IDEA Git 实战指南:从配置提交到分支合并与排查

IDEA Git 实战指南:从配置提交到分支合并与排查
在 IDEA 里写代码久了你会发现真正让人头疼的往往不是业务逻辑而是 Git 这一摊子事。命令行敲得再溜切到图形界面就懵为什么文件是红的、为什么 commit 之后 push 没反应、为什么合并完代码少了一半。我带了几年团队见过太多人把 IDEA 当成高级记事本用Git 只在终端里敲白白浪费了 IDE 里那套相当能打的版本控制集成。这篇就把 IDEA 中 Git 的使用从安装配置、日常提交、分支合并到疑难排查完整捋一遍包含大量只有踩过坑才知道的细节。无论你是刚装完 IDEA 和 Git 的新手还是用了两三年但一直能用就行的老手都能从里面抄到能直接落地的配置和操作流程。1. 地基先打牢Git 安装与 IDEA 关联配置很多人卡在第一步不是不会用是环境没配对。IDEA 本身不自带完整 Git 实现它只是调用你系统里装好的 Git 可执行文件。这一层关系如果没理清后面所有按钮点了没反应的问题都会找上门。1.1 Git 安装时那几个容易被忽略的选项Windows 下装 Git一路 Next 不是不行但有两个界面值得停下来看一眼。第一个是默认编辑器选择安装程序会问你想用哪个编辑器做提交信息编辑默认 Vim 对不熟的人不太友好可以改成 Notepad 或者干脆选 Nano。第二个是换行符处理选项通常叫 Checkout Windows-style, commit Unix-style line endings这是给跨平台协作准备的。如果你只在 Windows 上单人开发选哪个都不会立刻出问题但只要团队里有 macOS 或 Linux 同事换行符选错就会导致每次拉取都显示整个文件被修改。安装完成后在任意目录右键应该能看到 Git Bash Here。打开它敲一行命令验证git --version能打印出版本号说明 Git 本体没问题了。顺手把身份信息写进去这一步后面会反复用到git config --global user.name 你的名字或工号 git config --global user.email youexample.com这里有个细节user.email最好和你代码托管平台上注册的邮箱保持一致。很多平台是靠邮箱把提交记录归属到账号上的邮箱填错你在贡献者列表里就隐身了代码明明是你写的图上却没有你的头像。团队协作时这事挺尴尬的尤其是要做提交量统计的时候。1.2 让 IDEA 找到 Git路径、终端与版本确认Git 装好后打开 IDEA进File → Settings → Version Control → GitmacOS 是IntelliJ IDEA → Settings。这个页面只有一个核心输入框Path to Git executable。正常情况下 IDEA 会自动探测到路径大概长这样C:\Program Files\Git\cmd\git.exe如果输入框是空的或者显示红色感叹号点右边的文件夹图标手动选到git.exe就行。注意是cmd目录下的git.exe不是bin目录下的两者都能用但cmd那个是官方推荐的入口。选好之后点一下 Test弹出 Git 版本号就说明打通了。同一页面上还有个容易被无视的设置Enable Version Control Integration。这个开关决定新建项目时 IDEA 会不会主动提示你初始化仓库。我个人的习惯是把它开着因为新项目开工第一件事本来就该是git init让 IDE 提醒一下反而省事。还有一处值得改的地方是终端。IDEA 内置的 Terminal 默认在 Windows 上用的是系统 CMD 或 PowerShell如果你更习惯 Git Bash可以在Settings → Tools → Terminal里把 Shell path 改成bash.exe的路径。改完重启终端git log --graph --oneline这类命令的输出会好看很多颜色和分支线都正常显示。1.3 全局配置里我强烈建议加上的几条除了用户名邮箱还有几条全局配置能省掉大量后续麻烦直接一次配好git config --global core.quotepath false git config --global core.autocrlf input git config --global credential.helper store git config --global pull.rebase false逐条解释为什么。core.quotepath false是让 Git 直接输出中文文件名而不是转义成\344\275\240这种八进制码。不加这条git status里中文文件名全是乱码看着就头大。有意思的是 IDEA 自己在调用 Git 时也会主动加上这个参数你如果去看 IDEA 的 Git 控制台会看到类似这样一条命令git -c diff.mnemonicprefixfalse -c core.quotepathfalse --no-optional-locks status --porcelain ...这里三个参数各有用途。core.quotepathfalse就是我们刚说的中文显示问题。diff.mnemonicprefixfalse是把 diff 输出里的前缀统一成a/和b/默认情况下 Git 会根据比较对象不同生成i/index、w/worktree、c/commit、o/object等不同前缀统一之后生成补丁、贴给别人复现问题会方便很多。--no-optional-locks是最容易被忽略但最实用的一个它告诉 Git 不要去做那些可选的文件锁操作比如自动刷新索引。IDEA 内部会并行跑多个 Git 命令不加这个参数两个命令同时想更新索引就可能撞上index.lock冲突报出 Another git process seems to be running 的错误。core.autocrlf input的意思是提交时把 CRLF 转成 LF检出时不转换。这个配置在 Windows 上略偏为别人考虑适合团队里有非 Windows 同事的情况。如果你是纯 Windows 团队用true也可以但绝对不要一半人true一半人input那是灾难的开端。提示pull.rebase false是明确告诉 Git执行 pull 时用 merge 而不是 rebase。新版本 Git 会因为没有显式配置而在每次 pull 时打印警告配好这条就清静了。至于到底该用 merge 还是 rebase第 4 节会详细讲。2. 读得懂界面IDEA 里的 Git 三态模型与核心窗口命令行党转到图形界面最大的障碍其实是不知道 IDE 把 Git 的概念画到哪儿去了。搞明白下面这几个窗口你会发现 IDEA 的 Git 集成比终端直观得多。2.1 工作区、暂存区、本地仓库IDEA 怎么表达这三个概念Git 的核心模型是三个区域工作区你正在编辑的文件、暂存区Index准备提交的内容、本地仓库已经 commit 的历史。命令行里靠git add和git commit两步走IDEA 里则是靠颜色和分组。打开一个已经纳入版本控制的项目左侧项目树的文件名颜色就是状态指示器。不同版本配色略有差异大致的对应关系是颜色含义对应命令行状态红色新文件尚未纳入版本控制Untracked绿色新文件已加入暂存区Added / Staged蓝色已有文件被修改未暂存Modified深蓝或灰蓝已修改且已暂存Staged Modified灰色已忽略或已删除Ignored / Deleted这套配色刚上手时容易看晕尤其蓝色和深蓝的差别。我的建议是别死记颜色直接看提交窗口的分组。在较新的版本里提交工具窗口把文件分成 Changes未暂存和 Staged Changes已暂存两组勾选文件就相当于git add取消勾选就是git restore --staged。这个映射关系一旦建立操作起来比命令行还顺手。注意IDEA 不同大版本的界面名称变化比较大。2020.1 之前叫 Default Changelist2020.1 到 2022 叫 Local Changes2023 之后逐渐改成 Commit 工具窗口配合 Changes 分组。看到别人教程里说 Default Changelist 找不到先确认一下自己的版本号。2.2 四个必须常开的窗口第一个是 Git 工具窗口默认快捷键Alt9。它下面有几个标签页Log提交历史图、ConsoleGit 命令输出、Branches分支列表。Log 标签是我用得最多的它以图形方式画出分支的分叉与合并比git log --graph的输出漂亮太多。想找某个提交是谁改的、什么时候合的直接在这里搜关键词就行。第二个是提交窗口默认CtrlK。这个窗口做三件事勾选要提交的文件、写提交信息、点 Commit 或 Commit and Push。它旁边还有个齿轮设置可以控制提交前是否自动执行代码格式化、优化导入、跑分析相当实用。第三个是 Git Console藏在 Git 工具窗口的一个标签里。所有你在图形界面点的操作IDEA 都会翻译成具体命令显示在这里。这是学 Git 最好的教材——你想知道某个按钮底层做了什么点之前先看一眼 Console比翻文档快得多。第四个是右键菜单里的 Annotate。在编辑器左侧行号区域右键选 Annotate with Git Blame每一行代码旁边会显示最后一次修改它的人和提交信息。排查这行诡异的代码是谁写的时这个功能能救命。点进去还能继续追溯到那次提交的完整 diff。2.3 编辑器里的行内标记怎么用IDEA 编辑器右侧的滚动条旁边有一条彩色细带叫 Change Markers绿色代表新增行蓝色代表修改行灰色代表删除行。鼠标悬停在上面会浮出具体改动点击能直接跳到对应位置。更实用的是左侧行号区的变化标记绿色三角表示这块是新增蓝色方块表示修改。点一下这个小标记会弹出一个浮层里面有 Rollback 按钮可以只回滚这一小块改动不用撤销整个文件。这个功能在改了一大堆东西之后只想放弃其中一处的时候特别好用命令行得靠git restore -p交互式挑选IDEA 里点两下就完事。3. 日常流程全打通从 Clone 到提交推送环境配好、界面看懂接下来就是每天都要走一遍的流程。这一段我把标准动作拆开顺便说说哪些地方最容易翻车。3.1 两种起手式Clone 已有仓库 vs 初始化新项目拿到一个已有仓库走File → New → Project from Version Control粘贴仓库地址选好本地目录点 Clone。IDEA 会自动完成克隆并询问是否打开项目。这里有个小坑如果你的仓库用 SSH 地址而本地还没配密钥克隆会失败报 Permission denied (publickey)。新手第一次遇到会以为是网络问题其实是认证没配。密钥配置在第 6 节讲。如果是全新项目先建好工程再初始化仓库。菜单VCS → Enable Version Control Integration选 GitIDEA 会在项目根目录执行git init。此时目录下会多出一个隐藏的.idea文件夹这是 IDEA 自己的项目配置目录里面有编译器设置、模块信息、代码风格等。这些文件该不该提交是个老生常谈的问题。我的做法是分情况。如果是单人项目或者团队都用 IDEA提交.idea里的部分文件比如codeStyles、inspectionProfiles能让团队风格统一其他个人相关的workspace.xml、usage.statistics.xml、shelf/必须忽略。如果是开源项目、成员用的 IDE 五花八门那就整个.idea都不提交靠.gitignore挡掉。无论哪种情况workspace.xml都不该进仓库它记录的是你个人的窗口布局和最近打开的文件提交了只会制造无意义的冲突。3.2 提交的颗粒度怎么把一堆改动切成几个提交新手最常见的坏习惯是攒一整天改动晚上一次性提交提交信息写update或者修改bug。这种提交历史过一周自己都看不懂更别说 code review 了。IDEA 提供了比命令行更顺手的切分工具。假设你同时改了三个不相关的功能想分成三个提交。打开提交窗口先把所有文件取消勾选然后只勾第一个功能的文件写信息提交。接着勾第二批再提交。这是最粗的切分方式。更细的粒度在文件内部。在提交窗口选中某个文件右侧会显示这个文件的 diff每一块改动旁边有个复选框可以只勾选部分改动块。这相当于git add -p但可视化程度高得多不用在命令行里一个个回答 y/n。我经常用这个功能把顺手改的格式调整和真正的逻辑修改分开提交前者单独一个 commit后者单独一个回顾历史时特别清爽。提交信息的写法团队里最好统一。我的习惯是用一行简短的祈使句做标题控制在 50 字符内比如 修复订单金额计算精度问题如果改动复杂空一行再写详细说明。别写 fix、update 这种词等于没写。3.3 推送、拉取以及那个首次推送的坑本地提交完点CtrlShiftK推送。第一次推送新建分支时很可能遇到这个报错fatal: The current branch xxx has no upstream branch.意思是本地这个分支还没有和远端建立追踪关系。IDEA 的推送对话框里会有一个 Define remote 的按钮或者更简单的做法是在推送确认窗口里把 Push tags 附近那个 origin 的映射配好。命令行等价操作是git push -u origin 分支名-u就是设置上游分支设过一次之后以后这个分支直接git push就行。拉取方面CtrlT是 Update Project它默认的行为可以通过Settings → Version Control → Git → Update method调整选项有 Merge、Rebase、Branch Default。这里先记住一件事fetch 和 pull 不是一回事。fetch 只是把远端的更新下载到本地不动你的工作区pull 等于 fetch 加 merge或 rebase。IDEA 的 Update Project 默认做的是 pull 的动作。如果你想先看看远端有什么变化再决定要不要合可以在 Git 工具窗口的 Log 里点 Fetch All Remotes看完对比之后再手动 merge。4. 分支管理创建、切换、合并与冲突解决分支是 Git 真正的价值所在也是 IDEA 集成做得最舒服的部分。这一段结合最常见的场景——把 dev 分支的代码合并到 test 分支——把流程走完整。4.1 分支的基本操作与命名习惯右下角状态栏上永远显示着当前分支名点它就能打开分支菜单。菜单里能做的事包括New Branch新建、Checkout切换、Merge into Current合并到当前、Rebase Current onto Selected、Delete、Compare with Current 等。新建分支时有个选项值得留意IDEA 会在分支列表里用小图标区分本地分支和远端分支Remote 分组下的origin/xxx。直接在远端分支上点 CheckoutIDEA 会自动创建一个同名的本地分支并建立追踪关系这个体验比命令行顺畅。命令行需要git checkout -b 本地名 origin/远端名。命名上我的习惯是用feature/、fix/、hotfix/、release/做前缀后面接简短描述。不是为了好看是因为 IDEA 的分支列表支持输入过滤敲feature/就能筛出所有功能分支分支多了之后这个效率优势非常明显。4.2 把 dev 分支代码合并到 test完整实操这是团队里最高频的操作之一。假设当前 test 分支需要同步 dev 上的改动标准流程是这样第一步先切到 test 分支然后拉取最新代码确保本地 test 和远端一致。这一步别省我见过太多次因为本地 test 落后于远端合并完推上去把别人的改动覆盖了虽然 Git 会拒绝非快进推送但冲突解决起来更麻烦。第二步确认 dev 分支也是最新的。如果 dev 是别人推的先 fetch 一下或者在 Log 窗口里看origin/dev的位置对不对。第三步在 test 分支上从分支菜单选origin/dev注意选远端的别选本地可能过期的 dev点 Merge into Current。IDEA 会弹出一个合并预览窗口列出这次合并会带来哪些提交、哪些文件变化。这个预览窗口可以关掉直接合也可以先看看有没有意外文件混进来。第四步如果没冲突合并会自动完成工作区出现一个新提交。此时检查一下改动然后推送。第五步有冲突的话IDEA 会弹出冲突解决界面这个下一小节专门讲。还有一种情况你其实不想把 dev 上所有提交都合过来只想合其中某几个。这时候用 cherry-pick。在 Log 窗口里找到目标提交右键选 Cherry-PickIDEA 会把那个提交的改动应用到当前分支。注意 cherry-pick 会生成一个全新的提交和原提交的哈希不一样如果后续还要合并 dev 分支这些改动会以冲突的形式再次出现用得越少越好。4.3 冲突解决三栏合并工具的正确打开方式IDEA 的合并工具是它相对命令行的最大优势。冲突文件的编辑器会变成三栏左边是 Local Changes你本地的版本右边是 Changes from Server远端的版本中间是 Result合并结果。每个冲突块上方有和箭头点一下就能把某一边的内容采纳到中间。顶部的工具栏还有全部采用左边、全部采用右边的批量按钮。用这个工具时有三个坑必须提醒。第一个坑是ours 和 theirs 的方向会变。在 merge 操作里左边的 Local 就是 ours右边的 Server 就是 theirs符合直觉。但在 rebase 操作里Git 的定义是反过来的因为 rebase 是把你本地的提交一个个接到目标分支上此时 ours 反而变成了目标分支。如果你在 rebase 过程中看到左右方向和预期不符不是 IDEA 出 bug 了是 Git 的语义如此。这个坑我见过不少工作三五年的开发栽在上面解决冲突时选错了边。第二个坑是中间的 Result 栏可以手动编辑。很多人以为只能在左右两边二选一其实 Result 栏就是一个普通编辑器两边都不满意的时候完全可以直接手写最终结果。复杂冲突比如两边都改了同一段逻辑通常只能靠手写。第三个坑是解决完别忘了标记。在命令行里解决完冲突要git add一下IDEA 里点合并工具右上角的 Apply 之后文件状态会自动变为已暂存接着正常提交即可。如果你不小心关掉了合并工具文件会停在冲突状态此时在提交窗口里能看到一个红色的 Resolve 提示点开可以重新进入合并界面。中途想放弃整个合并可以从分支菜单里选 Abort Merge回到合并前的状态。4.4 rebase 和 cherry-pick 什么时候该用merge 会保留完整的分支历史产生一个合并节点rebase 则是把当前分支的提交摘下来重新接到目标分支后面历史是一条直线看起来很干净但会改写提交哈希。我的实际用法是本地分支同步主干更新时用 rebase保持自己的提交历史整洁分支正式合入主干时用 merge保留这个功能是一个整体的语义。团队协作的公共分支上永远不要用 rebase 加 force push那会改写别人已经拉取过的历史是引发事故的经典操作。IDEA 里对此是有保护的正常推送如果落后于远端会被拒绝但如果手动勾选了 Force Push 选项它照样会执行这个选项我建议只在确认自己一个人用这条分支时才点。5. 后悔药与进阶操作amend、stash、reset、revert、reflog真正拉开水平差距的往往不是日常提交而是出错之后怎么收拾。这一段全是实战里用得上的自救手段。5.1 修改最近一次提交amend 的正确用法刚提交完发现漏了一个文件或者提交信息打错了不用重新提交一次再 revert。在 Git 工具窗口的 Log 里选中最近那条提交右键选 Amend Commit或者直接勾选提交窗口里的 Amend 复选框。这样会打开提交界面并且把上一次的提交内容回填进来你可以修改信息、增补文件确认后生成一个新的提交替换掉旧的。注意amend 会改写提交哈希如果这条提交已经推送到远端再推送时需要强制推送。只有在自己独占的分支上才这么做。团队共享分支上宁可直接再提交一次补充遗漏文件也别 amend。5.2 stash临时存档比新建分支轻量场景很典型正在 dev 分支改代码改到一半线上出问题了要紧急切到 master 修 bug但当前改动还没写完不想提交。这时候用 stash。在 IDEA 里操作路径是Git → Stash Changes不同版本可能在右键菜单或 Git 工具窗口里弹出对话框让你输入一个描述。存好之后工作区就干净了可以自由切分支。修完 bug 回来选Unstash ChangesIDEA 会列出所有存档选中恢复。恢复时有个 Pop stash 的复选框勾上表示恢复后删除存档不勾则保留方便你在多个分支上试用同一份改动。这里必须澄清一个高频困惑IDEA 里同时存在 Stash 和 Shelve 两个功能它们不是一回事。Stash 是 Git 原生的存在.git目录里任何 Git 客户端都能看到。Shelve 是 IDEA 自己实现的功能存在.idea/shelf/目录下只有 IDEA 认识。以前很多版本里默认叫 Shelve导致换到命令行或者别的 IDE 就找不到这些改动白白丢失。现在版本默认走 Stash 了但如果你在老项目里看到 shelf 目录就知道是怎么回事。我的建议是统一用 Stash别用 Shelve。5.3 reset 和 revert删历史还是留痕迹需要撤销提交时在 Log 里右键某个提交会看到几个选项Reset Current Branch to Here把当前分支指针移回这个提交。点开后会让你选 Soft、Mixed、Hard。Soft 保留所有改动在暂存区Mixed 保留在工作区但不暂存Hard 直接丢弃所有改动。Hard 很危险但 IDEA 有个保护——如果你在设置里开启了 Local History即使 Hard 掉了代码改动还能从 IDEA 的本地历史里找回来这个后面讲。Revert Commit生成一个反向提交来抵消原来的改动历史保留适合已经推送出去的提交。选择逻辑很简单没推送过就用 reset推送过就用 revert。已经推送到共享分支的提交被 reset 掉再强推别人的本地仓库就会错乱。这个判断标准我在团队里反复强调新人踩坑基本都是踩这一条。5.4 reflog 加 Local History双保险就算你把提交 reset 掉了Git 也不会立刻删除那些对象。git reflog记录着 HEAD 的每一次移动包括被 reset 掉的提交。在 IDEA 里Git 工具窗口的 Log 有一个 Show all branches 之外的隐藏功能打开 Console 敲git reflog找到目标提交的哈希然后右键那个提交选 Reset Current Branch to Here 或者 New Branch from Here就能救回来。IDEA 还有一层独立于 Git 的保护叫 Local History路径是右键项目 → Local History → Show History。它由 IDE 自己定期快照跟 Git 无关能记录文件的每一次保存。也就是说就算你代码根本没提交过 Git误删了文件也能从这里找回来。这个功能的默认保留期是几天可以在Settings → Advanced Settings里调整。我遇到过一次误删整个模块目录的情况就是靠它救回来的那时候 Git 里根本没这些新文件。6. 远程仓库连接与凭证管理本地玩得再熟练代码终究要推到远端。这一段的配置做一次能用很久。6.1 生成 SSH 密钥并对接代码托管平台HTTPS 和 SSH 两种协议我推荐 SSH配一次之后不用反复输密码。生成密钥用ssh-keygen -t ed25519 -C youexample.com一路回车会在用户目录的.ssh文件夹下生成两个文件id_ed25519是私钥绝对不能外传id_ed25519.pub是公钥内容就是要粘贴到代码托管平台的那一串。打开平台设置里的 SSH Keys 页面新建一个把.pub文件的全部内容贴进去保存。验证是否配好ssh -T git你的平台域名看到带 successfully authenticated 字样的欢迎信息就算通了。第一次连接会问你是否信任主机指纹输 yes 即可。有一个坑很多人踩生成密钥时如果一路回车默认路径会覆盖已有的id_rsa。如果你的机器上还有别的服务在用旧密钥覆盖之后那边就连不上了。所以我在生成时会指定一个新文件名然后在.ssh/config里针对不同域名配置用哪个密钥Host 平台A的域名 HostName 平台A的域名 User git IdentityFile ~/.ssh/id_ed25519_a这样多账号、多平台就能共存互不干扰。6.2 免密配置与凭证保存如果用 HTTPS 协议每次推送都要输账号密码现在多数平台要求用访问令牌代替密码。保存凭证的方式git config --global credential.helper store这条会把凭证明文存在用户目录的.git-credentials文件里。方便是方便但明文存储有安全风险公共电脑上不要这么干。更安全的方案是用系统级凭证管理器Windows 上是credential.helper managermacOS 上是osxkeychainIDEA 自身也提供了 Remember password 选项勾上之后走的是 IDE 自己的密码保险箱。6.3 多仓库并存时的隔离思路同时维护公司仓库和个人项目时最容易犯的错是全局配了公司的用户名邮箱结果个人项目的提交也带上了公司邮箱。解决办法是全局配置留空或配个人仓库级别单独覆盖。进入公司项目目录后执行git config user.name 工号 git config user.email 工号公司域名不带--global的参数只对当前仓库生效。IDEA 里也有对应入口Settings → Version Control → Git页面有个 Configure Git repository 之类的按钮可以改单个仓库的配置不过我发现命令行改更直接。7. 常见问题排查速查表下面这些是我在团队里被问得最多的问题整理成速查表遇到直接对号入座。现象大概率原因处理方式提交按钮灰色不可点没勾选文件或没写提交信息检查 Changes 分组里是否有勾选项提交信息框不能为空推送被拒non-fast-forward远端有你没有的提交先 Update Project 拉取合并再推送提示 index.lock 已存在上次 Git 进程异常中断确认没有 Git 进程在跑删除.git/index.lock中文文件名显示成八进制乱码未关 quotepathgit config --global core.quotepath false重启 IDEA每次拉取整个文件都显示被修改换行符配置不一致统一core.autocrlf或加.gitattributes强制指定提交后文件仍是红色文件未被加入版本控制或已被忽略检查.gitignore是否命中右键 Add to VCS改了 .gitignore 但不生效文件已被跟踪ignore 只对新文件有效用git rm --cached 文件取消跟踪后再提交合并后代码消失冲突解决时选错了边或误用 force push用 reflog 找回或在 Local History 里恢复7.1 找不到 Git、索引卡住、锁文件处理如果 IDEA 提示 Cannot identify version of git executable先确认路径指向的是cmd/git.exe其次检查系统 PATH 里有没有多个 Git 版本冲突。有些机器上装了 TortoiseGit、GitHub Desktop、独立 Git 三份PATH 顺序不对就会指向奇怪的位置。索引卡死通常表现为 Git 操作一直转圈或者报 Unable to create index.lock: File exists。处理办法是先关掉 IDEA打开任务管理器确认没有git.exe残留然后到项目根目录的.git文件夹里把index.lock删掉。如果反复出现说明有后台进程在频繁操作仓库检查一下有没有杀毒软件在实时扫描.git目录把项目目录加进白名单能明显缓解。7.2 换行符与中文乱码的组合拳换行符的问题在跨平台团队里几乎是必然出现的处理方案是加一个.gitattributes文件放在仓库根目录* textauto *.sh text eollf *.bat text eolcrlf *.png binary *.jar binarytextauto让 Git 自动判断文本文件并做规范化显式声明 shell 脚本用 LF 是因为它在 Linux 上执行带 CRLF 会报 bad interpreter。二进制文件必须标 binary否则 Git 会尝试转换把文件弄坏。中文乱码除了 quotepath还有个场景是 IDEA 的文件编码设置。Settings → Editor → File Encodings里把 Global Encoding、Project Encoding 都设成 UTF-8下面那个 BOM for new UTF-8 files 建议设成 with NO BOM因为带 BOM 的文件在某些构建工具里会出问题。改完编码之后如果仓库里已有文件是 GBK 编码的需要在.gitattributes里单独声明或者做一次批量转换否则会显示成乱码。7.3 部署安全别把 .git 目录放进生产环境这一点很重要但很多人不知道。如果你是用git clone的方式把代码拉到服务器上直接跑的那么网站根目录下会存在完整的.git文件夹。这个目录里包含全部历史提交有心人可以通过访问特定路径把整个仓库源码拉下来包括那些你以为已经删掉但其实还留在历史里的敏感配置比如数据库密码、密钥文件。正确做法有三种。一是用git archive导出干净代码包再部署git archive --formattar.gz --outputrelease.tar.gz HEAD二是在 Web 服务器配置里显式拒绝.git路径的访问请求。三是如果是容器化部署构建镜像时用多阶段构建只把编译产物复制进最终镜像源码和历史都留在构建阶段。顺带说一句IDEA 有 Docker 插件可以直接在 IDE 里把当前分支的代码构建成镜像推送配合 Git 分支做版本管理挺顺手但记得.dockerignore里一定要排除.git目录不然镜像层里会带上全部历史。7.4 其他高频小问题Git 目录或 IDE 配置不生效改完配置记得重启 IDEA很多设置是启动时读取的。大文件提交后仓库体积暴涨Git 对大文件很不友好一旦提交进历史即使后来删掉体积也不会减小。团队里最好提前配好.gitignore排除构建产物和依赖包比如target/、node_modules/、*.log。已经误提交的需要用历史重写工具处理动作比较大最好在团队里同步操作。IDEA 索引和 Git 状态不同步偶发的File → Invalidate Caches清一下缓存重启即可。8. 沉淀下来的实操心得讲完流程和排查最后分享几条这些年攒下来的习惯都是吃了亏之后改的。8.1 几个我离不开的快捷键和设置Alt9开 Git 窗口CtrlK提交CtrlShiftK推送CtrlT更新CtrlAltZ回滚。这五个键位基本覆盖了百分之九十的操作。刚换电脑或者换了键盘布局第一件事就是去Settings → Keymap里确认这几个键没被占用。插件方面.ignore插件值得装它提供.gitignore文件的语法高亮和模板新建规则时不会写错格式。GitToolBox 也很实用它在状态栏显示当前分支和远端分支的领先/落后提交数一眼就能看出本地是不是落后了。这两个插件在插件市场里搜索安装即可都是免费的。还有一个很多人没打开的功能Settings → Version Control → Git → Commit里的 Clear initial commit message 和 Force non-empty commit message。后者能防止你手滑提交空信息前者能在提交后自动清空输入框避免下一次提交时残留上一次的内容。8.2 提交粒度和分支习惯小步提交这件事说起来简单做起来难。我的经验是给自己定一条硬规则一个提交只做一件事能一句话说清的事。改一个 bug 就是一个提交顺手重构了别的代码就单独再来一个提交。这样做的好处是出问题要回滚时可以精准回滚某一个改动不用把无关的代码一起撤掉。分支习惯上功能分支别开太久。一个分支活过两周合并时的冲突量会指数级上升。我倾向于把一个功能拆成几个小分支做完一个合一个到 dev 上让集成持续发生。另外Pull Request 之前先自己把分支 rebase 到最新的主干跑一遍本地构建能省掉大量 review 时的往返。8.3 关于版本和授权的几句实在话最后说一个容易被忽略的点。IDEA 有社区版和商业版社区版是免费的对 Java、Kotlin、Maven、Gradle 以及 Git 集成的支持是完整的个人学习、做自己的项目完全够用。如果你需要的是 Web 开发、Spring 全家桶这些企业级功能那需要商业授权正规途径就是官方渠道购买或者申请开源项目授权。网上流传的那些来路不明的安装包和激活工具风险真的很大轻则被植入挖矿程序拖慢机器重则把你 Git 凭证、SSH 私钥、环境变量里的密钥全打包带走。这个损失远比一份授权的价格高。我个人在实际操作中的体会是Git 这件事工具只是外壳真正要练的是对三态模型和分支指针的理解。命令行也好IDEA 的图形界面也好按钮点下去无非是在移动几个指针。把git status、git log --graph、git reflog这三条命令的输出看熟再回来看 IDEA 的 Log 窗口你会发现那些花花绿绿的线条一下子就能读懂了。真遇到图形界面解决不了的复杂情况随时可以按AltF12调出终端用命令行把活干完两边并不冲突反而互补得很舒服。