ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Git实战指南:从安装、SSH认证到分支合并与IDEA操作

Git实战指南:从安装、SSH认证到分支合并与IDEA操作 1. 先说清楚Git到底是干什么的为什么很多人学了又忘我先给你一个结论Git不是“代码备份工具”而是一个内容寻址的分布式版本控制系统。很多人学Git学得痛苦是因为一开始就拿它跟SVN比脑子里的模型全是错的。Git把每一次提交都看成一个完整的快照每个快照之间有父子关系形成一条或多条提交链。每次提交时Git会计算整个项目文件的校验和并存储为树对象、提交对象、作者信息、提交信息等。你不需要知道太深的内部原理但有一个概念必须建立——Git大部分操作都在本地完成只有push和pull才真正接触到远程仓库。这意味着你可以在断网状态下任意提交、回滚、创建分支网络恢复之后再同步。这一点跟SVN那种“每步操作都必须连服务器”的模式完全不同也是Git高效的核心原因。那么这篇东西适合谁适合三种人刚把Git装好但不知道从哪里下手的初学者已经用了一段时间但遇到“回滚错了”“合并冲突不会解”等具体问题的人以及在IDE里点按钮点得顺但想知道那些按钮背后到底执行了哪些Git命令的人。我会尽量按实操链路讲尽量不堆积术语。热点里提到的“git安装”“ssh认证失败”“idea创建新项目拉取git”“git分支合并”这些关键词都会一个个拆开讲。我曾经带过不少新人发现一个规律真正阻碍新手学Git的不是命令记不住而是脑子里没有“工作区、暂存区、本地仓库、远程仓库”这四层模型。这四个词我后面会反复用先在这里立住工作区你本地磁盘上能看到的文件。暂存区执行git add之后文件进入的一块临时区域。本地仓库git commit之后提交落到的地方。远程仓库git push之后代码上传到的地方比如GitLab、GitHub、Gitee等。你只要把这四个区域的关系理顺大部分Git操作就不再是背命令而是“把数据从一个区域挪到另一个区域”而已。2. 环境准备安装、全局配置、SSH认证这三个环节一次讲透2.1 各平台的Git安装方式与验证方法先说安装。Windows用户最常见的安装包是Git for Windows官网下载exe直接安装一路Next即可。需要注意三个选项一是默认编辑器建议选Vim也行但新手更建议选Notepad或者VS Code不然以后处理冲突时可能被Vim卡住二是“调整PATH环境变量”那一步务必选“Git from the command line and also from 3rd-party software”这样后续很多工具才能正确找到Git三是行尾转换设置默认的“Checkout Windows-style, commit Unix-style line endings”最稳妥遇到跨平台项目也不容易出乱子。macOS用户我建议直接装Homebrew然后执行brew install git。Linux的话Debian/Ubuntu用apt-get install gitCentOS/RHEL用yum install git。装完统一验证git --version能输出类似git version 2.39.2这样的版本信息说明安装成功。这里埋一个大多数人都踩过的坑Windows下你新开一个CMD或PowerShell窗口时如果提示git不是内部或外部命令基本是刚才提到的PATH选项没选对或者装完之后没重开终端。重启终端再试一次这一步能让很多新手少走两小时弯路。2.2 三行全局配置一次搞定以后再也不用碰安装完成后一定先做全局配置。这步很多人跳过直到第一次提交时报错Please tell me who you are然后一脸懵。Git每次提交都要记录作者和邮箱这个信息就来自全局配置。git config --global user.name 你的名字 git config --global user.email youexample.com git config --global init.defaultBranch main第三行是我后来才养成的习惯。Git早期版本默认创建master分支现在主流仓库和平台都推荐main提前把默认分支改好能省掉后面改分支名的麻烦。验证配置是否写入用git config --list你会看到所有生效配置项。另外提醒一点--global写的是用户级配置存到用户目录下的.gitconfig文件里如果不加--global配置只对当前仓库生效写在仓库的.git/config里。两者优先级不同仓库级配置会覆盖全局配置。如果你遇到“明明配了user.name为什么提交还是报错”多半就是仓库级配置里写了一个空值把那个仓库的.git/config打开看一眼就能发现问题。2.3 SSH认证失败从生成密钥到最终排查的完整链路热搜里“ssh认证失败 git”这个关键词我敢说至少一半的人遇到过。这里把完整链路拆开讲。第一步生成密钥对ssh-keygen -t ed25519 -C youexample.com用ed25519算法是现在的主流推荐比传统的RSA 2048更安全、更短。执行后会提示保存路径默认是~/.ssh/id_ed25519我建议直接回车用默认值。接着会问你是不是设置passphrase这个看个人需求设了的话每次使用密钥都要输入一次口令安全性高但略麻烦不设也能用前提是你的电脑本身足够安全。第二步把公钥添加到远程平台。公钥文件是~/.ssh/id_ed25519.pub用编辑器打开复制全部内容然后登录你的GitLab/GitHub/Gitee在设置里找到“SSH Keys”粘贴保存。这一步的核心是私钥留在本地公钥给平台平台拿公钥来验证你的身份。第三步验证是否连通ssh -T gitgithub.com如果是GitHub成功会提示Hi 用户名! Youve successfully authenticated, but GitHub does not provide shell access.如果是Gitee通常提示Hi 用户名! Youve successfully authenticated, but GITEE.COM does not provide shell access.我见过的SSH认证失败集中在下面几个原因公钥没复制完整。.pub文件末尾可能有个换行或空格复制时容易漏粘贴后看起来是断的就会认证失败。Agent没加载私钥。有些情况下密钥路径比较特殊系统找不到可以手动添加ssh-add ~/.ssh/id_ed25519多密钥环境下匹配了错误的密钥。如果你一个电脑配置了多个平台的密钥需要手动指定ssh -T -i ~/.ssh/id_ed25519 gitgithub.com代理或网络问题。公司内网访问外网Git平台通常需要配置代理但企业自建GitLab一般不需要代理这点要看环境说话。最后还有一个排查手段看详细日志ssh -vT gitgithub.com它会输出整个连接过程中每个阶段的调试信息耐心看最后几十行几乎都能定位到问题出在哪一步。3. 核心操作链路提交、查看、回滚你的日常就这几件事3.1 一个仓库从初始化到首次提交的完整流程环境配置好之后进入实操。如果你是从零开始的项目先在项目目录里初始化仓库git init这会在当前目录生成一个隐藏的.git文件夹里面装的就是这个仓库的全部历史数据。注意不要删它删了等于毁了所有提交历史。接着添加远程仓库地址git remote add origin gitgithub.com:username/repo.gitorigin是远程仓库的默认别名你可以理解为“远程仓库的快捷方式”。一个本地仓库可以配置多个远程比如一个自己代码备份的仓库、一个给团队提交的仓库多人协作场景并不少见。之后就是标准的提交三步曲git add . git commit -m feat: 初始化项目结构 git push -u origin maingit add .把当前目录所有改动放入暂存区。这个命令有两个变体值得掌握git add 文件名精确添加某个文件git add -p进入交互模式逐个文件确认是否添加。git commit -m 提交说明把暂存区内容提交到本地仓库。-u参数的意思是关联远程分支首次推送时用一次以后push就不需要再指定远程和分支名了。git add和git commit为什么要分开两步因为不是所有改动都应该进同一个提交。把“修复了登录bug”和“调整了首页样式”混在一个提交里以后回溯历史时你会很痛苦。分步add让你有机会把改动拆成多个逻辑清晰的提交。3.2 查看状态的四个命令排查问题的入口新手最容易不知道“现在仓库发生了什么”而慌。日常观察窗口就是下面这四个git status git log git diff git stash listgit status告诉你工作区、暂存区当前各有什么改动。git log --oneline --graph --all以精简形式显示提交历史用--oneline让每条提交只占一行--graph显示分支图--all显示所有分支。git diff显示未暂存的改动细节git diff --staged则显示已暂存但尚未提交的内容。git stash list查看暂存队列这个是后话但排查“我刚改的代码哪去了”时非常好用。这里有个真实的崩溃现场一个同事改了半天的代码忽然发现工作区文件内容跟昨天一样以为全丢了差点哭出来。结果是我帮他执行git stash list后发现改动被之前的某个操作放进了stash临时区一条git stash pop全部恢复。Git的设计逻辑是“几乎不主动删除数据”你的改动总有地方找得到关键是你知道去哪里找。3.3 回滚操作git reset、git revert、git checkout到底怎么选“回滚”是所有人都会遇到、但最容易被网上碎片化教程搞晕的地方。回滚的本质是让HEAD指针或工作区内容回到某个历史状态但不同命令的行为完全不同。git reset是移动HEAD指针。它有三个模式--soft只动指针不动暂存区和工作区--mixed默认动指针和暂存区不动工作区--hard三个区域一起重置。举例git reset --hard HEAD~1意思是把当前分支丢回到前一个提交所有未提交的改动全部消失。这条路风险最大因为那些改动和提交真的找不回来了。所以对不熟悉的人我的建议是不要对已推送到远程的提交使用reset --hard不要对包含他人合作内容的提交使用reset --hard。git revert走的是另一条路它不移动历史指针而是生成一个“反向提交”把某个提交的改动“撤销”掉但历史记录依然保留。这在团队协作里更安全因为历史没有被改写。命令git revert HEAD它会创建一个新提交内容等于把HEAD这次提交的改动倒回去。git checkout和git switch则主要用于切换分支和恢复工作区文件。git checkout -- 文件名可以把某个文件恢复到上次提交的状态丢弃工作区改动——这也是个容易误操作的地方执行前看清楚有没有需要保留的修改。选型建议放在这里如果你回滚的是还没提交的改动用git checkout -- 文件或者git restore 文件如果回滚的是本地未推送的提交用git reset如果回滚的是已经推送到远程的提交优先用git revert。这个选择逻辑是我踩过几次坑之后归纳的按它走基本不会出事。4. 分支合并全解merge、rebase、cherry-pick以及冲突解决实战4.1 三条分支操作命令的适用场景对比热搜里“git分支合并”这个关键词背后是一整片操作场景。先把分支的底层逻辑说清楚分支本质上是一个指向某次提交的可移动指针创建分支的代价极低。你可以把分支理解成“基于同一个项目历史的平行时空”每个时空改动互不干扰最后通过合并来汇总成果。日常分支操作就三条命令git branch feature/login git checkout feature/login git merge feature/login也可以一简到底git checkout -b feature/login新建并切换分支一步完成。合并一个分支回到主分支时有两种主流方式。git merge把另一条分支的提交历史合并到当前分支会生成一个“合并提交”。它的特点是保留两条分支的完整历史适合团队协作因为历史是“真实的流水账”。缺点是提交图看起来会有分叉和合流新手看着会有点乱。git rebase把当前分支的提交“重新放”到目标分支的最前面。效果是提交历史变成一条直线非常整洁。但它会改写提交哈希等于重写了历史如果这条分支已经推送到远程且被其他人使用rebase会产生灾难性的冲突。我个人的使用准则是仅在本地分支且尚未推送时使用rebase推送过的分支一律用merge。还有一种合并不是“整个分支合并”而是“挑一个提交”过来叫cherry-pickgit cherry-pick abc1234它会把abc1234这个提交的改动应用到当前分支生成一个新提交。这个工具在“功能A分支上有一个热修复B分支也要”这种场景非常高效不需要把整个分支都拉过来。三种方式选哪个直接看场景追求历史清晰且分支只有自己用用rebase多人协作不追求历史直线用merge只要某个特定提交用cherry-pick。没有绝对的对错但用错场景会出事故这个一定要记住。4.2 合并冲突到底是怎么产生的又如何解得干净先说冲突产生的机制。Git合并时会对两条分支的共同基础版本、当前分支版本、目标分支版本做三方比较。如果当前分支和目标分支在同一文件的同一行附近都做了不同修改Git就无法自动判断哪个是对的于是停下来询问用户。遇到冲突时Git会在文件里插入冲突标记类似这样 HEAD 这是当前分支的内容 这是被合并分支的内容 feature/login你需要在两个版本之间做选择只留当前分支的、只留被合并分支的、或者两个都留并做整合修改。手工改完文件后删除标记行保存然后依次执行git add 冲突文件 git commit这样就完成了冲突解决。在IDE里冲突标记会被更友好的可视化面板替代。以IntelliJ IDEA为例冲突文件会显示为红色打开后左边是当前分支版本右边是对方分支版本中间是合并结果通过点击箭头按钮可以选取某一侧的内容。右键还可以选择接受左侧、接受右侧或两边都包含。IDE帮了很大的忙但底层逻辑还是“在双方改动中做人工仲裁”。解冲突这件事经验远比技巧重要。我总结过几条实操心得合并前先看一眼对方改了什么。git log看看提交说明git diff main feature/login看看差异冲突可预判时心里就有底。涉及大量冲突时不要硬解优先沟通。很多时候冲突双方改的是同一处逻辑谁对谁错需要业务判断而不是技术判断。解完冲突后用git status确认所有冲突文件都已add否则会出现“已经解完了但提交不上去”的错觉。大型合并前先建一个备份分支比如git branch backup-before-merge一旦解到一半发现无法收场切回备份分支是最后的逃生舱。4.3 让合并更少出问题的三个前置习惯与其学一堆解冲突技巧不如在冲突产生之前就把它扼杀掉。我这些年总结的三个习惯第一特性分支尽量短命。分支存活时间越短和主线之间的差异越小冲突自然越少。一个功能分支几天内就合回主线远比拖两三周之后再合并安全。第二频繁从主线更新自己的分支。在你开发期间主分支可能已经被别人合入了新代码。每周、甚至每天做一次git checkout feature/login git merge main提前把主线的改动合进自己分支把冲突在开发期就解决掉。这样到最终合并时主线分支反而不用处理冲突痛苦最小化。第三提交粒度要细提交信息要清楚。冲突出现时你如果看到fix bug这种信息根本不知道对方改了什么无从判断保留哪边如果看到的提交信息是fix: 修复登录接口在token过期时返回500的错误你就能快速判断这段改动的意图。这看起来跟“冲突解决”没有直接关系实际上影响巨大。5. 实战场景IntelliJ IDEA里创建新项目并拉取远程仓库热搜里有一条“idea创建新项目拉取git”这说明很多人在IDE里操作是有点懵的。我以IntelliJ IDEA为例讲一遍最后再把它背后的Git命令对应起来你就能做到“既能用按钮也能用命令”。5.1 有远程仓库在IDEA里拉下来的完整路径场景一远程已经建好了空仓库比如Gitee或GitLab上建了一个新项目你想把它拉下来作为本地工程。最干净的方式是直接用IDEA的“Get from VCS”功能打开IDEA欢迎界面点击“Get from VCS”或者顶部菜单File - New - Project from Version Control。在URL栏粘贴远程仓库地址选择Git。点“Clone”IDEA自动执行git clone然后弹出窗口让你信任项目并打开。这是最直接的方式。背后的命令其实就是git clone gitgithub.com:username/repo.gitgit clone会做三件事下载远程仓库完整历史到本地、创建本地仓库、自动把远程地址配置为origin并切到默认分支。所以克隆之后你通常不需要再执行git remote add除非用了“新建文件夹再手动关联”的复杂方式。5.2 在IDEA里新建本地项目再把它推到远程仓库场景二更常见你本地有一个项目想把它变成一个带Git历史的仓库推送到远程。IDEA里的操作如下打开已有项目顶部菜单VCS - Enable Version Control Integration选择Git等价于执行git init。菜单Git - Commit打开提交面板勾选要提交的文件填写提交信息点Commit等价于git addgit commit。在Gitee/GitLab上建一个空仓库拿到远程地址。菜单Git - Push第一次推送时IDEA会要求填写远程仓库地址粘贴进去点Push等价于git remote add origin 地址git push -u origin main。这里有三个IDE使用中的常见坑我逐个说明。第一IDEA左下角的“Git”面板用来干什么它展示的是本地分支、远程分支、暂存区文件双击任意文件可以看diff。很多人忽略它但当前分支显示、历史回看、上下文切换都靠这个面板。建议每次开IDE先扫一眼当前在哪个分支这是防止提交错分支的最简单办法。第二IDEA的“Commit”按钮旁边有个小三角展开后有“Commit and Push”。新手常点错了把还没准备上传的代码直接推到远程。这个算小坑对团队影响不大但如果是把包含密钥文件的代码提交并推送就会变成信息安全事故。提交前看一下提交面板里有哪些文件确认没有.env、密钥等敏感文件。第三IDEA里拉取远程更新按钮是Git - Update Project快捷键CtrlT。它等价于git pull而git pull的本质是git fetch加git merge。很多人不理解为什么IDEA里更新后偶尔会把本地的提交合并掉原因就在这里。如果你想自己控制合并策略就先执行git fetch看一下远程发生了什么再决定怎么合并。5.3 IDE操作无法替代命令行的地方虽然IDEA解决了90%的日常操作我还是建议你保住命令行能力。原因有三类一是合并且出现大量冲突时IDE的界面反而设计得繁琐命令行状态下你能更直接地控制合并过程。二是写脚本、自动化流程时必然要用命令只会在IDE里点点点遇到CI/CD流水线你会手足无措。三是远程故障排查比如网络中断后仓库处于中间状态命令能帮你看到git status的详细提示IDE可能只显示一个笼统的错误弹窗。我不主张“必须命令行优先”但主张“两条腿走路”日常开发用IDE提升效率遇到异常状况切到命令行定位问题。两者结合才是一个合格开发者的常规状态。6. 写一个实用的Git配置与工作流我目前最顺手的一套经验6.1 几个能明显提升效率的Git内置配置前面的章节解决“怎么用”这一节解决“用得顺手”。这几条配置是我在真实工作中验证过、强烈建议直接抄走的。git config --global alias.st status git config --global alias.co checkout git config --global alias.cm commit git config --global alias.br branch git config --global alias.unstage reset HEAD -- git config --global alias.last log -1 HEAD --stat git config --global pull.rebase false别名配置很好理解把长命令缩短减少日常打字量。关键的是最后一行pull.rebase false很多新人执行git pull后遇到奇怪的提交历史就是因为Git在不同版本下对pull的合并策略不一致显式指定“用merge方式拉取更新”可以避免意外rebase带来的历史改动。还有一个配置强烈建议加上git config --global core.autocrlf true这会影响跨平台换行符处理。Windows下如果发现文件diff显示整文件都变了极可能是换行符问题这个配置能统一处理极大减少无意义diff。6.2 我常用的一个分支模型适合中小团队的主干功能分支团队协作没有一个万能的分支模型但对大多数中小团队我推荐一个简单稳妥的main主干分支长期稳定永远是可发布状态功能分支从main切出命名带类型前缀比如feature/login、fix/payment-timeout、docs/readme-update。开发完成后发Merge Request让队友评审评审通过合入main。发布时从main切release/版本号分支发布后如果线上有紧急问题在release分支修复并合回main。这个模型的优势在于约束少、易理解、不需要维护大量长期分支。曾经某团队用了复杂的GitFlow一堆develop、release、hotfix分支并存结果新人根本分不清该从哪里切分支迟到半天的原因永远是在理分支。后来我帮他们简化成上面这套效率反而提升了。模型没有对错跟团队规模、发版节奏匹配才是关键。6.3 遇到不懂的操作时我最推荐的一套排查路径最后分享一个遇事不决的通用排查路径。Git报错时不要急着复制粘贴去搜索先执行这三件事git status看当前处于什么状态Git自己会提示你现在该怎么做。它的提示比绝大多数网上的帖子准确。git log --oneline -5看最近几条提交确认你预期的历史是否在。看看.git目录有没有一个叫MERGE_HEAD或CHERRY_PICK_HEAD或REVERT_HEAD的文件。这个隐藏文件的存在意味着有一个未完成的操作正在挂起比如合并到一半、cherry-pick到一半。如果发现这类文件Git会在status里告诉你“继续”continue还是“终止”abort。比如我之前遇到一个同事执行cherry-pick时发现冲突他不知道这是一个“未完成状态”直接又改了文件commit结果提交信息变成了一个临时生成的# This is a combination of 2 commits历史非常难看。正确的做法是先git cherry-pick --abort回到操作前状态或者解决冲突后git cherry-pick --continue正常完成。这里也是我经常跟人强调的Git的命令设计者早已为各种异常状态设计好了“进入”和“退出”路径你只需要在status里认真读那些提示。90%的报错文本Git都直接告诉了你解决办法。6.4 关于“git push被拒绝”的几种真实场景和处理办法推送被拒绝是高频问题我把常见场景列全。第一种远程分支有更新本地落后。Git报non-fast-forward。解决先git pull处理冲突后再次push。第二种远程分支被强制推送过历史不匹配。报rejected - non-fast-forward。解决确认这个远程分支是否允许强推如果确认要覆盖用git push --force-with-lease而不是--force。注意--force-with-lease会先检查远程是否保持在你上次看到的状态如果期间有其他人推过会拒绝推送安全性高得多。这个命令在重写历史时确实有用但别形成习惯。第三种权限问题。报Permission denied。如果用的是HTTPS地址多半是账号密码过时如果用的是SSH回到第2节的SSH排查路径。第四种推送被拒绝说“You are not allowed to push code to protected branches”。这是平台保护了主干分支通常需要走Merge Request。这种场景就别硬推了按团队流程提MR更稳妥。每个场景的拒绝原因、报错文本和解决方式不同但核心思路是一致的先读报错判断是“内容落后”“权限不足”还是“历史不一致”再对症下药。这套操作链路走到这里已经覆盖了一个开发者从安装到日常使用、再到协作合并的完整路径。最后说一句实在话Git这东西看十篇教程不如亲手提交一百次遇到问题不要慌记住git status永远是第一助手。把高频命令练成肌肉记忆之后你会觉得它完全配得上“开发者的基本盘”这个称呼。
返回列表