ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Git实战操作大全:从安装配置到分支合并与SSH认证排查

2026/10/5 2:43:30 拓冰建站 浏览量
Git实战操作大全:从安装配置到分支合并与SSH认证排查 后端、前端、测试但凡写代码基本绕不开Git。我在团队里经常扮演“Git救火队员”被问得最多的就是为什么push被拒、分支怎么合并、换电脑后SSH连不上、IDEA里拉不到项目。这些问题翻来覆去就那么几个但网上的答案东一句西一句新手很难串成一套打通的逻辑。这篇“Git操作大全”就是我整理出来的实操版汇总从Git安装及配置教程开始把日常git命令、分支合并、SSH认证失败排查、IDEA创建新项目拉取Git、历史回滚这几个模块全部串起来不扯理论直接告诉你每一步怎么点、每一条命令怎么敲。刚入门的小白可以跟着操作用了一两年Git但经常被细节卡住的老朋友也能把它当速查手册。1. 从零开始Git安装与初始配置1.1 各平台Git安装与版本选择先解决“有没有Git”的问题。Windows用户强烈建议直接去Git官网下载Git for Windows安装包一路下一步就行但我提醒几个关键选项PATH环境变量一定要选“Git from the command line and also from 3rd-party software”否则IDEA、VS Code这类工具可能找不到git命令换行符处理那一步建议选“Checkout as-is, commit as-is”也就是不自动转换换行符后面再单独控制避免做个简单的功能却把整个文件的CRLF/LF差异全带进去。如果你不想开浏览器也可以直接Windows Terminal里敲winget install --id Git.Git -e --source winget几分钟就装完。Linux用户最简单Ubuntu/Debian系用sudo apt install gitCentOS/RHEL系用sudo dnf install git。macOS用户可以用brew install git如果装了Xcode Command Line Tools系统也会自动带一个Git版本。装完之后一定先跑一下git --version确认输出不是“command not found”。版本不用追新但也别用太老的2.30.0以上的版本在兼容性和SSH认证方面都省心不少。我见过有同学本地还是1.8的老古董连git switch这种命令都不认识跟远程平台交互也经常出怪问题这就是给自己埋坑。1.2 用户名、邮箱和换行符最容易踩的初始配置安装完成后第一件事不是急着clone而是先把身份配置好。很多人第一次commit直接撞上“Author identity unknown”的报错就是漏了这两句git config --global user.name Your Name git config --global user.email youexample.comuser.name会出现在提交记录里user.email用来和代码托管平台的账号关联。如果邮箱乱填你的提交在GitHub/Gitee上就不会显示到头像上团队做代码统计时也会对不上人。我处理过的真实案例里有人把邮箱填成自己的QQ昵称结果平台推送提醒全乱了最后只能靠改历史提交去补救相当麻烦。换行符配置是另一个隐藏炸弹。Windows和Linux/macOS的换行符不一样Git默认在checkout时会帮你转。我建议Windows用户设置git config --global core.autocrlf truemacOS/Linux用户设置git config --global core.autocrlf input让仓库里统一保存LF本地再按系统差异切换。这样既能避免整个文件因为换行符变成红绿一片也不会在多人协作时把不必要的diff搞到PR里。另外我习惯顺手执行git config --global init.defaultBranch main这样本地新建仓库就不会默认叫master和当前主流的main保持一致。1.3 一次性配置好编辑器与凭据缓存如果不用-m参数提交Git会打开一个编辑器让你写提交信息。默认是vim很多新手完全不知道怎么退出最后干脆CtrlZ关终端留下一个锁sh文件。与其受苦不如直接用VS Code当编辑器前提是已经安装了VS Code并把它加入了系统PATHgit config --global core.editor code --wait后面再提交的时候漏了-mGit会打开VS Code让你写信息保存关闭后自动完成提交。凭据缓存也建议顺手配一下。Windows下安装Git时自带的Git Credential Manager通常会自动生效macOS可以用osxkeychainLinux可以用git config --global credential.helper store。配置完之后HTTPS方式第一次push会要求输入账号密码之后就不用了。不过如果想彻底不走密码流程更推荐第4节讲的SSH方式一次配置长期舒服。1.4 快速验证整套配置是否就绪配置完之后不知道生效没有可以用下面几条命令检查git config --global --list git config user.name git config user.email--list会把全局配置全部列出来包括上面说的换行符、默认分支、编辑器。如果想看每条配置来自哪个文件可以加--show-origingit config --global --list --show-origin这对排查“明明配置了却不生效”特别有用。不同项目可能需要不同邮箱比如公司项目用公司邮箱开源项目用个人邮箱这时候不要改全局配置直接在项目目录里执行git config --local user.email personalexample.com项目内的local配置会覆盖global。记住配置的优先级是local global system这个顺序排错时非常关键。2. 日常高频操作从克隆到提交的完整链路2.1 克隆仓库的几种姿势与场景日常项目进场第一步就是clone。最常用的是HTTPS和SSH两种地址功能没有区别区别只在认证方式。简单场景直接git clone https://xxx/your-repo.git就能拉下来SSH方式需要先配好密钥后面push就不需要输密码。我只在一次性试用别人的开源项目时才用HTTPS clone自己长期维护的仓库全走SSH。如果仓库特别大或者你只想拉某个分支可以这么干git clone -b dev --single-branch gitgithub.com:user/repo.git--single-branch只取远程仓库的dev分支速度会快不少代价是其他分支不会出现在本地后续需要时再fetch。对微服务大仓、游戏资产仓这类动辄几个G的仓库我还会配合浅克隆git clone --depth 1只拉最近一次提交避免把整段历史都下载下来。等需要完整历史时再git fetch --unshallow。稀疏检出也值得了解git sparse-checkout init --cone加git sparse-checkout set modules/order可以先只装某个子目录需要更多时再补充这招在超大仓库里能省大量磁盘和网络时间。2.2 工作区、暂存区与提交理解Git的“三个盒子”很多Git问题不是命令不会敲而是对“文件在哪”没概念。我习惯把Git拆成三个盒子工作区是你写代码的桌面文件改动出现在这里暂存区是整理好的“待提交清单”git add就是往清单里放文件版本库是保存所有历史版本的保险柜git commit把清单正式存进去。日常看状态全看git status它明确告诉你哪些文件在工作区、哪些在暂存区。git add有几种写法容易混git add -A所有改动全部加入暂存区包括新增、修改、删除。git add .加入当前目录下的所有改动效果基本同上但如果在子目录执行要小心范围。git add -u只加入已经跟踪过的文件改动新增文件不会被加入适合不想临时把新文件带进提交的场景。提交命令上最简单的就是git commit -m feat: add login API。git commit -am xxx能合并“add已跟踪文件commit”两步但对新文件无效新文件必须先add。我在团队里强推提交信息写清楚类型feat表示新功能fix表示修bugdocs表示文档refactor表示重构后面跟一个简短的说明。提交前养成习惯跑一下git diff --cached看看刚才add进暂存区的改动到底是什么避免把.env、密钥、日志等敏感文件不小心提交进去了。2.3 push与pull本地与远程的同步套路两个命令合起来看git pull其实是“fetch merge”git pull --rebase是“fetch rebase”。我绝大多数时候都推荐用--rebase因为普通pull的方式会产生大量多余的“Merge remote-tracking branch origin/main”提交时间一长历史图就是一团毛线。日常标准操作git pull --rebase git pushpush被拒最常见的原因就是本地分支落后于远程分支git会根据“non-fast-forward”的说法告诉你“你这边缺了别人最新的提交不能直接覆盖”。这时候先git pull --rebase把本地提交放到远程最新提交后面然后再push。新分支首次推送要用git push -u origin feature-u会把本地分支和远程分支建立跟踪关系之后这个分支上直接git push就行。强制推送是新手最容易玩火的操作。有些场景需要git push --force-with-lease它比--force安全因为它会先比对远程引用是不是你预期的最新状态万一有人在你上次拉取后又推了新提交它会拒绝执行避免“用我的代码覆盖掉别人的代码”。--force这个选项除非你很确定自己的操作是在独占分支上否则别用。2.4 IDEA创建新项目拉取Git仓库对应不少新人搜的“IDEA创建新项目拉取Git”其实操作比命令行更直观。打开IntelliJ IDEA到欢迎页左侧选择“Get from VCS”或者从顶部菜单File - New - Project from Version Control打开同一个窗口。仓库地址栏填HTTPS或SSH的clone地址Directory选本地存放路径确认后点CloneIDEA就会自动把代码拉下来。clone完成后有几步不能忽略。如果是Maven/Gradle项目IDEA会弹“Trust Project”建议直接选择Trust否则后续导入依赖、运行插件可能被限制。依赖扫描结束后右下角的状态栏能看到当前分支名点开后可以切换分支、基于当前分支创建新分支相当于图形化的git checkout。如果IDEA提示找不到Git进入Settings - Version Control - Git把Path to Git executable改成Git安装目录下的git.exeWindows常见路径是C:\Program Files\Git\bin\git.exemacOS/Linux一般直接填git就行点Test出现“Git executed successfully”就说明没问题。IDE里最容易踩的坑是Terminal的默认Shell路径。Windows下建议把Terminal的Shell path设置成Git自带的bash避免CMD里执行curl等命令因为编码问题报错。另外项目目录尽量别带中文或特殊符号Git本身能处理但IDEA、Maven、某些插件碰到中文路径会出现莫名其妙的编译或索引问题。还有一点clone完代码之后记得先设置Project SDK否则打开Java/Kotlin项目会满屏红。3. 分支管理合并、冲突与保护策略3.1 分支模型与常用分支操作分支是一种非常便宜的移动指针创建分支几乎不占空间所以别怕多开分支。一个合理的协作方式是主分支始终保留可发布状态新功能从主分支拉出开发分支开发完成后通过Pull Request/Merge Request合回主分支而不是任何人直接往main上推代码。常用分支命令快速过一遍git branch # 查看本地分支 git branch -r # 查看远程分支 git branch -a # 查看所有分支 git checkout -b feature # 基于当前分支创建并切换 git switch -c feature # 同样功能的新版写法 git branch -d feature # 删除已合并的分支 git push origin --delete feature # 删除远程分支 git branch -vv # 查看本地分支跟踪的远程分支git branch -d和-D的区别要记住-d只允许删除已经合并过的分支-D是强制删除。正常人应该多用-d如果真遇到需要-D的情况先确认分支里的提交是不是已经合并到其他分支了不然辛辛苦苦写的东西就没了。删除远程分支用git push origin --delete feature这句话虽然长但很好记。3.2 merge、rebase、cherry-pick三种合并思路分支合并不是只有git merge一条路。对同一个目标工具选错了会影响整个团队的可读性。git merge会保留两条分支的分叉轨迹并生成一个合并提交。优点是最接近真实发生的历史适合公共分支合入比如把feature合并到main。git rebase是把当前分支的提交“搬”到目标分支的最新提交之后历史呈现为一条直线看起来非常干净。它适合在本地功能分支里整理自己的提交等代码还没推到远程之前梳理成一个个有意义的commit。核心禁忌是已经推送到远程并且说不定别人已经拉过的分支绝对不要rebase否则重写历史会让所有拉过这个分支的人陷入“为什么我的提交和你的对不上”的混乱。日常我推荐这样走本地功能分支做完后先rebase一下最新的main处理完冲突再推到远程最后在平台提PR合并。命令就是git checkout main git pull --rebase git checkout feature git rebase main git push -u origin feature如果只需要把另一个分支上的某个提交拿过来用git cherry-pick commit-sha。比如线上版本需要单独修复某个bug而这个修复已经在develop分支上完成了就可以cherry-pick到hotfix分支而不必合并整个develop。提交号可以通过git log --oneline查看。3.3 一次真实的冲突解决从标记到continue冲突是很多人的心理阴影其实它只是一种正常的协作现象。当两个人改了同一份文件同一块区域Git不知道怎么替你决定时它会停下来让人类做判断。冲突文件里会出现类似这样的标记 HEAD 这是当前分支里的内容 这是另一个分支带来的内容 feature/login和之间是当前分支HEAD的内容和之间是被合并分支的内容。解决冲突不是“删掉一边”那么简单而是要根据实际需求决定保留哪边、是否两边都要、或者重新写一段新逻辑。正确步骤是git status查看冲突清单。手动打开每个冲突文件修改好并删除所有标记符号。git add file标记为“已解决”。如果是在git merge过程中直接git commit提交合并如果是在git rebase过程中则执行git rebase --continue不要单独commit。如果发现冲突太乱、处理不了想要反悔merge场景执行git merge --abortrebase场景执行git rebase --abort就能回到操作之前的状态。我自己的经验是能不用命令行处理就别硬来IDEA里右键文件 - Git - Resolve Conflicts打开三栏合并工具左中右分别显示当前分支、合并结果、另一分支每个冲突可以单独选择取左、取右、或手动编辑比肉眼盯一堆高效得多。还有个细节冲突标记本身是普通文本不是代码解决完必须全删留着任何一个都会让git认为文件还没解决提交会被卡住。3.4 分支合并后的清理与回滚分支合并完成后习惯性清理可以避免本地积累几十个旧分支。本地删除用git branch -d feature远程删除用git push origin --delete feature。如果合并后还没push到远程发现合并错了可以用git reset --hard 合并前commit直接回到合并前的状态但前提是你那个合并前commit没有被其他需要留住的改动覆盖。更常见的场景是合并已经push到了共享分支发现不对劲。这种时候不要用reset再强推正确做法是用git revert生成一个反向提交把这次合并造成的改动撤销掉。这样做的好处是不改写已经公开的历史团队其他人pull下来后不会被强制要求重新拉取。对应到merge commitrevert时可能要加-m 1来表示保留主分支的方向具体看提示操作。普通feature分支的提交revert通常不需要-m但实时观察git log确认撤销范围总是稳妥的。4. SSH认证失败排查实录4.1 生成密钥并完成免密登录SSH认证失败的排查是Git使用里最让人头疼的问题之一。先讲为什么要用SSH相比HTTPS每次push要输账号密码SSH通过一对公钥和密钥免密认证私钥保存自己电脑上公钥放在GitHub/Gitee/GitLab之类平台的账号里。后续push、pull、clone全程不再问密码体验提升一大截。生成密钥用这条命令ssh-keygen -t ed25519 -C youexample.com-t ed25519指定加密算法ed25519生成的密钥更短、更安全新版GitHub、Gitee都支持。如果某些老旧的内部Git服务只支持RSA就改成ssh-keygen -t rsa -b 4096。生成时一路回车文件会默认放在~/.ssh/id_ed25519和~/.ssh/id_ed25519.pub。私钥文件名千万不要发给别人公钥.pub结尾才是可以放到服务器上的那一个。查看公钥内容并复制cat ~/.ssh/id_ed25519.pubWindows用户可以用clip ~/.ssh/id_ed25519.pub直接复制到剪贴板。然后登录代码托管平台进入Settings - SSH KeysGitee叫公钥管理把公钥粘贴进去保存。测试是否通GitHub执行ssh -T gitgithub.comGitee执行ssh -T gitgitee.com第一次连接会询问是否信任主机指纹输入yes看到“Hi usernameYouve successfully authenticated”就说明成功了。之后把仓库remote地址改成SSH形式即可git remote set-url origin gitgithub.com:user/repo.git。4.2 SSH认证失败的常见原因链条式排查一旦认证失败报错通常表现为“Permission denied (publickey)”或“Could not resolve hostname”或连接超时。我习惯按链条排查每一步都能缩小范围。第一步确认公钥真的已经加到远程平台。重新登录后台看一眼有时候你贴的是另一台电脑的密钥自己这台根本没传上去。第二步确认本地密钥存在且路径正确ls -l ~/.ssh/id_ed25519.pub如果自定义过文件名还需要在~/.ssh/config里用IdentityFile指出来否则ssh默认只找id_rsa或id_ed25519找不到就报Permission denied。第三步确认ssh-agent里有没有载入私钥eval $(ssh-agent -s) ssh-add -l如果列表里没有执行ssh-add ~/.ssh/id_ed25519把私钥加进去。macOS还常遇到重启后agent丢失的情况可以在~/.ssh/config中加AddKeysToAgent yes让每次连接自动加入。第四步查看详细调试信息ssh -vT gitgithub.com输出会显示尝试了哪些认证方式、读取哪个密钥文件、远程返回什么信息。这比猜原因管用得多。如果报“Host key verification failed”说明本地known_hosts记录和当前服务器指纹不一致可能服务器做过迁移或重装执行ssh-keygen -R github.com再重新连接并确认新指纹。第五步检查密钥文件权限。OpenSSH很讲究权限私钥文件不能被其他用户可读。在Git Bash或Linux下执行chmod 600 ~/.ssh/id_ed25519、chmod 700 ~/.ssh解决很多“密钥明明在但认证失败”的诡异问题。第六步网络层面。公司或校园网络可能屏蔽了22端口表现是连接长时间卡住最后超时。GitHub官方提供了443端口SSH方案配置在~/.ssh/config里Host github.com HostName ssh.github.com Port 443 User git配置完再测ssh -T gitgithub.com一般就能通。这种问题不是密钥错误但容易被误判成“SSH认证失败”先分清报错类型再动手。4.3 多账号与真实踩坑记录很多人会同时使用GitHub、Gitee、公司内部GitLab如果所有平台都用同一个密钥经常出现“A平台能pushB平台报Permission denied”的尴尬。原因是平台是根据公钥识别身份的不同平台应该用不同密钥。做法是生成不同密钥文件然后在~/.ssh/config里分别指定Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github Host gitee.com HostName gitee.com User git IdentityFile ~/.ssh/id_ed25519_gitee每个密钥生成后分别添加到对应平台测试ssh -T gitgithub.com和ssh -T gitgitee.com都能看到不同用户名即可。我踩过几个比较典型的坑一是换电脑之后把旧的.pub贴到新电脑平台后台但新电脑的私钥其实没配对怎么测都不通二是公司的安全软件把.ssh目录权限改成了777OpenSSH直接拒绝加载私钥三是Windows用户目录是中文用户名某些Git Bash旧版本在解析路径时出问题表现也是“找不到密钥”。这些问题的共性是先看具体报错再带着ssh -vT的输出去找原因别一上来就把远程仓库地址换掉。5. 历史撤销与回滚别把代码搞丢5.1 reset、revert、restore三个容易混淆的概念Git提供三套看起来很接近的撤销机制实际用途完全不同。git restore主要操作文件和暂存区git reset移动HEAD指针git revert生成一次新的反向提交。用表格区分最清楚命令默认影响范围典型使用场景git restore --staged file暂存区撤销刚才的git addgit restore file工作区丢弃工作区对已跟踪文件的修改git reset --soft HEAD~1HEAD撤销提交但保留暂存区可用于重新提交git reset --mixed HEAD~1HEAD和暂存区撤销提交并保留工作区改动git reset --hard HEAD~1HEAD、暂存区、工作区丢弃本地全部改动非常危险git revert commit新增一次反向提交撤销已经推送到远程的提交对初学者来说最需要刻在脑子里的就是reset --hard会把工作区改动也一并消失虽然可以用reflog找回但如果没有及时处理风险很大。我一般只在明确“本地这一段我不要了”时才用hard其它情况都用更温和的方式。5.2 撤销add、撤销commit、找回误删文件的实际命令场景化一下遇到问题时直接对号入座。如果git add加多了想撤销某个文件git restore --staged file。这个操作不会动工作区内容只是把文件从暂存区挪出来回到“已修改未暂存”状态。如果已经commit了但提交信息写错了而且还没有pushgit commit --amend -m correct message。--amend会把上一次提交替换成新的提交。注意如果你已经把那次提交push到了远程再amend就是改写公开历史会让协作者拉取时产生冲突。所以已经push的提交不要amend。如果commit后发现还漏了文件同样用git commit --amend先git add漏掉的文件再执行git commit --amend --no-edit保留原来的提交信息并补充文件。误删文件分两种情况文件已经被Git跟踪过那直接git restore file或者git checkout -- file就能从版本库恢复文件是新建的、还从来没提交过那Git帮不了你只能靠IDE的Local History或者文件系统回收站所以重要文件请及时commit不要赌自己的运气。如果已经commit并push了想撤销这次改动推荐git revert HEAD。它会新开一个提交把HEAD所指提交的改动反向应用一遍历史依然是线性的别人pull时也不会有压力。git reset在“还没push”时可以用一旦push给团队共享分支了就改走revert。还有一个隐藏救星git reflog。它就是本地HEAD移动的完整日记就算执行了reset --hard把提交弄丢了只要在本地操作过git reflog里还能看到那个commit的哈希用git reset --hard sha就能找回。我救过很多次误删分支的现场每次先让当事人别慌git reflog一查东西还都在。5.3 stash临时保存工作现场“我正在开发分支上写了一半突然线上出了bug必须切到release分支但是我改动还没提交切不过去。”这个经典场景就是git stash的主场。git stash push -m wip: user profile page git stash list git stash popstash会把当前工作区和暂存区的改动保存到一个临时堆里然后把工作区恢复成干净状态这样就能自由切换分支了。处理完紧急问题再切回来git stash pop把改动恢复。注意pop默认会删除堆顶的那条保存记录如果你只想恢复但还保留stash用git stash apply。stash默认不包含未跟踪的新文件需要加-ugit stash push -u -m xxx。恢复stash时也可能产生冲突原因和普通合并冲突一样解决流程也一样编辑冲突文件git add然后继续。如果临时保存了很多条stash可以用git stash list查看编号stash{0}、stash{1}指定恢复某一条就写git stash apply stash{1}。最后记得清理不要的stashgit stash drop stash{1}防止堆里的旧改动越来越多。6. 常见问题速查与实操心得6.1 高频问题速查表把文章里出现的典型问题整理成速查表方便卡壳时直接找答案。现象大概率原因处理命令/方法push提示non-fast-forward本地落后远程git pull --rebase后再git push每次push都要输密码使用HTTPS且没配凭据缓存配置credential.helper或改用SSHcommit报缺用户名/邮箱漏了全局配置git config --global user.name/email文件内容被误改修改未被提交git restore filecommit后发现还想改还没pushgit commit --amend已push的提交想撤销历史已共享git revert HEADSSH连接Permission denied公钥未添加或私钥未加载按4.2链条排查IDEA显示找不到GitGit可执行文件路径没设置Settings - Version Control - Git切换分支时改动放不下半成品不想提交git stash push找不到之前丢掉的提交本地操作可追溯git refloggit reset --hard sha这张表不是银弹但它能覆盖我日常被问到的八成问题。Git的好处在于几乎每一步都有可查的状态命令先执行git status再结合报错定位基本不会跑偏。6.2 让命令少敲一半一组实用别名Git支持配置命令别名这是很多老手离不开的效率工具。我自己的常用别名如下git config --global alias.st status git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit最推荐的是下面这个log别名能让提交历史变成漂亮的图形git config --global alias.lg log --graph --prettyformat:%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset --abbrev-commit配置完直接执行git lg你会看到一条条带分支关系的彩色提交历史比默认的git log直观太多。别名配置会写进~/.gitconfig换电脑时把这行配置带过去或者直接把整个.gitconfig备份到个人私有仓库新环境一两分钟就能恢复全部习惯。6.3 新人的一条“最小可用”练习路径看再多教程不如本地亲手跑一遍。我建议刚学Git的人按这个顺序做一个下午的小实验建一个空目录git init创建a.txt并提交第一次commit。再改a.txt第二次提交感受“工作区修改 - add - commit”的流程。执行git checkout -b dev在dev上改文件并提交切回master。在master上改同一文件的同一行并提交然后执行git merge dev故意制造冲突。按第3.3节的流程解决冲突完成合并。执行几次git reset --hard再用git reflog找回丢掉的提交。这套动作做完你对Git的掌握程度会超过很多实际工作了两三年但一直用图形界面点来点去的人。我个人最大的体会是Git命令多但真正常用的就二三十个完全不需要背。你只要在心里把“工作区、暂存区、版本库、远程仓库”四个位置的关系想清楚任何一条命令都可以理解为“在哪个位置之间移动了什么”。遇到报错先读英文提示再看git status和git log大部分问题都能自己定位。真到了要靠git reflog救人的时刻你也已经不再是新手了。