ARTICLE DETAIL

资讯详情

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

Git全流程操作指南:从安装配置到分支合并与SSH认证

Git全流程操作指南:从安装配置到分支合并与SSH认证 1. 为什么Git操作总是踩坑先搞清楚它到底解决了什么问题干这行越久越发现Git操作就像游泳会的人觉得理所当然不会的人看着命令行一头雾水。不管你是刚学开发的在校学生还是已经带项目的技术负责人每天几乎都要跟Git打交道。拉代码、提交、合并分支、处理冲突这套流程一旦不熟轻则浪费大半天时间重则把同事的代码搞乱让整个项目无法构建。这篇内容不打算讲空泛的大道理而是按我自己的实操路径把git安装、初始配置、日常命令、分支合并、SSH认证失败处理、以及IDEA创建新项目拉取Git这些场景完整走一遍能让你直接照着抄。很多人第一次接触Git下意识会把它当成“网盘同步工具”觉得只要把文件拖进去就能自动备份、自动共享。这个认知是所有后续痛苦的总根源。Git不是备份工具它是一个分布式的版本追踪系统。所谓分布式指的是每个开发者的本地仓库里都有一份完整的提交历史而不是只有最新代码。这意味着即使远程服务器挂了你仍然可以继续提交、继续查看历史记录甚至可以把别人的仓库直接clone下来当作新的远程仓库。这种设计带来的好处是容错能力极强但也带来了一个学习门槛你必须学会在一个“看起来只是普通文件夹”的本地目录里理解到底哪些内容被Git管理、哪些内容暂时没被追踪。1.1 它不是文件夹备份Git的版本模型我见过不少同事把项目文件夹复制一份改名“xxx_final”再复制一份“xxx_final_最终版”最后变成“xxx_final_最终版_再也不改”。这种工作方式的本质问题是你只能看到某个时刻的静态快照却完全不知道版本之间改了什么、是谁改的、为什么改。Git用提交记录commit来保存每一次变更的快照每条提交都带着作者、时间、说明信息还可以随时对比任意两个版本之间的差异。这个能力在团队协作里是决定性的。Git的版本模型可以简单理解为一条有方向的时间线。每个commit都至少有一个父提交这样Git就能沿着历史往前回溯。分支的本质其实是一个可移动的指针指向某条时间线上的最新提交。听起来抽象但你把“分支”想象成一根贴在不同提交上的标签就很好懂了。checkout一个分支本质上就是把当前工作目录切换到那根标签所指向的快照。理解了这一层后面所有的Git操作都会变得顺理成章而不是靠死记硬背命令。1.2 工作区、暂存区、版本库三个区域想不明白就别谈Git操作很多Git操作报错都是因为没搞清楚文件到底处在哪个状态。Git项目里有三个核心区域工作区Working Directory、暂存区Staging Area / Index、版本库Repository / History。工作区就是你在磁盘上直接看到的那些文件暂存区是一个中间状态表示“我打算把这些改动放进下一次提交”版本库则是已经提交的历史记录。日常流程通常是在工作区改文件用git add把改动放进暂存区再用git commit把暂存区的内容固化到版本库。为什么要多一道暂存区因为现实中的修改往往是零散的比如一个项目里同时改了bug、加了新功能、调了配置文件你未必想把它们全部揉进一条提交里。有了暂存区就可以有选择地提交一条提交只描述一件事后面出问题回溯时才能精准定位。这个设计初看多余实际用起来会发现真香。2. Git安装与配置教程从下载到第一行命令跑通不管你是Windows用户、macOS用户还是Linux用户git安装的难点从来不是“下载安装包”本身而是装完之后不知道怎么验证、不知道怎么配置出可用的环境。这里我把三个平台的git下载安装教程一起说清楚然后重点讲装完必须做的初始配置。2.1 git下载安装教程Windows、macOS、Linux三平台完整说明Windows上最常见的安装方式有两种。第一种是直接去Git官网下载安装包一路Next即可。但我不建议你全程无脑Next有两个选项值得手动调整一个是默认编辑器如果你平时用VS Code就选“Use Visual Studio Code as Gits default editor”否则后面写合并信息时会弹出一个你不熟悉的vim编辑器新手很容易卡在里面不知道怎么退出另一个是PATH环境变量建议选“Git from the command line and also from 3rd-party software”这样以后在PowerShell或CMD里都能直接敲git命令。第二种方式是用Windows自带的包管理工具winget一条命令就能完成git下载和安装winget install --id Git.Git -e --source wingetmacOS上最简单的是通过Homebrew安装命令就一行brew install git也可以用Xcode Command Line Tools里面有自带Git但版本可能比较旧。我建议还是独立安装一份新版Git特别是在公司项目要求最低Git版本的情况下系统自带的那份可能不满足要求。Linux用户就没什么好纠结的Debian系用sudo apt install gitRedHat系用sudo yum install gitCentOS 7这种老系统可能需要先装EPEL源才能装到较新版本。装完统一验证版本git --version这一步能输出类似git version 2.40.0就说明安装成功。如果命令提示找不到git多半是安装时没把可执行文件加入PATH重装时仔细看安装选项或者检查一下环境变量。2.2 git安装及配置教程装完后必做的三个初始化设置Git安装完成只是第一步真正决定你好不好用的是配置。所谓配置最终会写进三个不同的配置文件里系统级/etc/gitconfig、用户级~/.gitconfig、项目级.git/config。优先级从低到高是系统级、用户级、项目级。我平时用的基本都是用户级配置因为不同机器同步迁移最方便。第一个必须配置的是用户名和邮箱。有人会随便填结果提交记录里显示的是“user_123”远程平台也认不出是谁提交的。正确做法是使用和远程仓库平台账号匹配的邮箱git config --global user.name 你的名字 git config --global user.email 你的邮箱第二个建议配置的是默认分支名。新版Git默认用master但很多团队已经切换到main。如果你不想每次初始化都修改可以直接git config --global init.defaultBranch main第三个容易踩坑的是换行符处理。Windows和Linux/macOS对换行符的处理不一样Git默认会做自动转换。如果你的团队跨平台协作建议把core.autocrlf设置清楚。Windows上一般设成true提交到仓库时自动转成LFmacOS/Linux上设成input提交时不额外转换检出时也不转。不同团队官网文档给的建议可能有差异但长期经验下来统一用input更不容易出现“整个文件被标成已修改”的诡异情况git config --global core.autocrlf input还有一个我很推荐的配置是别名。比如git st代替git status、git lg代替复杂的一行日志命令能显著提高日常操作效率git config --global alias.st status git config --global alias.lg log --oneline --graph --all --decorate如果你想检查当前所有配置用git config --list就能全部看一遍。每次换新电脑把这几个配置重新敲一遍Git操作手感就回来了。2.3 验证配置第一次提交的完整流程配置完成后最好马上在一个临时目录里跑通完整流程验证环境真的可用。我自己面试新人时也喜欢让他们现场走一遍这个“三连操作”初始化、添加文件、提交。mkdir git-test cd git-test git init echo hello git readme.txt git add readme.txt git commit -m first commit git log这里有个细节git init是初始化当前目录为Git仓库但它不会自动创建分支。虽然你执行commit之后Git会默认生成一个分支根据上面的init.defaultBranch配置可能是main或master但如果你在执行commit前想先创建一个指定名字的分支可以用git branch -M main这行命令的意思是强制把当前分支重命名为main。初次使用Git的人不需要理解太深知道-M能改名、能避免“分支名不对导致推送失败”就够了。3. 日常高频Git操作拉取、提交、回滚一次讲透安装配置完成后真正的主体是日常工作流。我发现很多人对git clone、git pull、git fetch的区别一直模模糊糊对git reset和git revert也分不清。这一章就把这些高频Git操作按场景讲透。3.1 git clone与git pull拉取远程代码的两种方式不要混用最开始的拉取通常用git clone。它会把远程仓库的完整内容复制到本地包括所有历史提交、所有分支标签并且自动建立本地与远程的追踪关系。比如git clone gitgithub.com:some-org/your-project.git这个操作只需要做一次。如果项目已经存在本地只是需要把远程最新的提交同步下来那就用git pull。这里有个非常常见的误区git pull实际上等于git fetch加git merge。git fetch只更新本地的“远程分支指针”比如origin/main不修改你的工作区git pull则会尝试把这些更新合并到当前分支。正因为自带合并这一步所以如果在本地有未提交的修改git pull可能产生冲突或者报错。我自己的习惯是在大型项目里尽量用git fetch先看一眼远程有什么新东西确认不会破坏本地状态后再执行git merge origin/main或git rebase origin/main。这样可以避免git pull默认的merge策略打乱提交历史。但在小团队、单分支快速迭代的项目里git pull够用没必要搞得那么复杂。关键看你是在维护长期分支还是在功能分支上频繁同步主分支。3.2 新项目接入Git服务器init、remote、push的完整链路很多人在“在本地建好项目后推送到远程”这一步卡住因为远程平台GitHub、GitLab、Gitee这些上通常是先创建了一个空仓库再让你把本地代码推上去。空仓库都会给出提示命令但很多人不知道其中的原理遇到报错就只能一个个搜。完整的本地项目推送到远程的步骤如下。先进入项目目录初始化git init git branch -M main把当前目录所有文件加入暂存区并提交git add . git commit -m init project添加远程仓库地址。注意这里的名字可以任意取只是约定俗成用origin。git remote add origin 仓库地址的作用就是给这个远程地址起个简短别名后面推送、拉取时就不用敲一长串URLgit remote add origin gitgithub.com:some-org/your-project.git首次推送时需要指定上游分支git push -u origin main-u参数是--set-upstream的简写。它会把当前分支和远程分支绑定之后直接敲git push或git pull就能自动匹配。每次新建分支后第一次推送也要加-u否则Git不知道要推到哪里。这里有个细节容易被忽略如果远程仓库已经有文件比如README、.gitignore或者你在平台上勾选了自动生成License那么本地commit和远程仓库的历史就不相关直接git pull会报“refusing to merge unrelated histories”。解决办法有两种正规一点的是先把远程的修改拉下来合并用git pull --allow-unrelated-histories简单粗暴的是直接把本地当唯一事实源用git push -f强推覆盖。我强烈建议不要一上来就强推尤其是多人项目强推会把别人的提交干掉属于高危Git操作。3.3 提交与回滚reset和revert怎么选提交本身很简单git add需要注意。git add .会把当前目录所有未跟踪和已修改的文件全部加入暂存区省事但危险。更精细的写法是git add src/或者git add file1 file2只添加你想提交的部分。git add -p甚至可以让你分块选择文件内的改动这个操作熟练后会让人上瘾因为它能保证每条提交都很干净。如果提交后发现写错了很多人第一反应是git reset。git reset有三种模式威力不同命令影响范围使用场景git reset --soft HEAD~1撤销提交记录保留暂存区和工作区上一条提交漏了文件想重新整理再提交git reset --mixed HEAD~1撤销提交记录和暂存区保留工作区上一条提交不该提交但代码修改要保留git reset --hard HEAD~1全部清空回到上一个提交快照上一条提交的代码彻底不要了--hard是核按钮慎用尤其在没把本地状态同步到远程之前。如果你已经把提交推送到了远程最好别用reset因为会改写历史再强推会引发团队问题。这种情况应该用git revert commit它不会删除原提交而是生成一条新的反操作提交安全且可以追溯。git log --oneline git revert 3a2b1c4你可以在log里挑一条具体commit来revertGit会自动倒置它的变更。团队协作场景下凡是远程已存在的提交我几乎只用revert只有在本地还没推出去的提交才放心用reset。4. Git分支合并从新建分支到解决冲突的完整演练分支操作是Git比SVN这类集中式版本控制强太多的地方。也是很多“会用Git但用不好”的人最薄弱的环节。分支合并处理得好不好直接决定团队协作的顺畅程度。4.1 为什么需要分支团队协作的核心思维分支存在的意义是隔离。开发新功能时你不想把半成品直接推到主干分支影响其他人于是基于main切出一个feature分支。在这个分支上可以随心所欲地提交甚至可以推翻重来都不影响主干。等功能稳定、代码审查通过后再把feature分支合并回main。这个模型听起来简单实际落地时最怕的是分支太多、太久不合并最后主线已经走得很远回头合并时冲突多到让人崩溃。我建议的原则很简单做一件事就开一个分支做完马上合并合并完及时删除远程分支。分支名要么对应需求编号要么对应功能描述比如feature/login-page、fix/order-time-bug。这样在查看Git提交图时你能一眼看出每条线在干嘛。很多团队喜欢长期保留自己的开发分支我觉得不是好习惯长期分支一旦和main拉开距离后续的每一次同步都是一场噩梦。4.2 新建分支与切换branch、checkout、switch的正确用法新建分支并切换传统写法是git branch feature/demo git checkout feature/demo新版Git推荐用git switch语义更清晰切换时不会跟“恢复文件”搞混git switch -c feature/demo-c是create也就是“立即创建并切换过去”。列出当前所有分支用git branch -a-a会显示本地和远程的所有分支。如果要从远程某个分支拉取并建立对应本地分支git switch -c feature/demo origin/feature/demo还有一个常用操作是重命名分支git branch -m old-name new-name以及删除分支git branch -d feature/demo注意-d只删除已经合并过的分支如果没合并完会被拒绝这时需要-D强制删除。我建议别为了图省事直接用-D先检查分支有没有未合并的提交毕竟有价的代码往往就藏在这些“忘了合并”的角落里。4.3 分支合并实战merge、rebase与冲突解决最常规的合并方式就是git merge。切到目标分支比如main执行git switch main git merge feature/demoGit会自动找两个分支的共同祖先然后把差异合并进来。如果没冲突它会自动生成一个merge commit如果冲突会中断合并告诉你哪些文件要手动处理。处理冲突的步骤是固定的先用git status看哪些文件是both modified打开这些文件里面会用 HEAD、、 feature/demo把冲突区域标出来你的任务是把这些标记删掉保留想要的代码然后git add这些文件最后执行git commit完成合并。这里最容易犯的错误是只保存了本地或对方的版本而没有认真理解双方代码各自想解决什么问题。冲突不是零和博弈往往两边都有要留的东西。git rebase是另一套思路。它会把当前分支上所有的提交“摘下来”在目标分支的最新提交之上重新应用一遍。好处是提交历史是一条干净的直线没有“分叉再合并”的网状图形代价是改写提交记录如果分支已经推送到远程并被别人使用rebase会产生危险。我总结的经验是尚未推送的本地功能分支可以用rebase把历史理干净已经推到远程的分支老老实实用merge。不管是merge还是rebase我在合并前一定会先看差异git diff main...feature/demo三个点的意思是“从main和feature/demo分叉的点开始看feature/demo相对这个点改了什么”。这样你能把即将合并的所有改动提前过一遍搭配代码审查能拦下很多低级问题。5. SSH认证失败 git远程操作里最头疼的拦路虎如果你的Git操作在最后推送阶段挂掉大概率是认证问题。尤其ssh认证失败 git这个关键词我见过的报错频率极高。报错信息五花八门但排查思路其实很固定。5.1 连不上的典型报错与排查顺序常见报错包括Permission denied (publickey). Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.也可能是gitgithub.com: Permission denied (publickey).这个问题的原因几乎都是本地没有配置SSH Key或者配置了但对应的密钥没有被远程平台识别。排查顺序我建议从简到难第一确认用的是SSH地址而不是HTTPS地址。远程仓库在clone时给的链接有两种如果当时用的是HTTPS认证走的是账号密码或Token不会触发SSH的publickey流程。如果地址没问题再看第二项。第二检查本地是否生成了公钥。执行下面的命令如果没有任何输出说明还没生成过SSH Keyls -al ~/.ssh正常的目录里会有id_ed25519、id_ed25519.pub或id_rsa、id_rsa.pub这类文件。没有的话就需要先生成。第三确认SSH agent里加载了密钥。有些系统即使生成了密钥也要通过ssh-add加入缓存才能被识别。第四把公钥内容正确复制到远程平台的SSH Keys管理页面。这一步最容易出问题很多人复制时多了换行或者复制了私钥导致认证失败。5.2 生成SSH Key并完成认证生成密钥的推荐命令是ssh-keygen -t ed25519 -C 你的邮箱比老的RSA 2048更安全、更短现代Git平台基本都支持。执行后一路回车即可也可以设置passphrase密钥口令提高安全性。注意设置passphrase后你每次使用密钥都需要输入口令不想麻烦就留空但密钥文件安全风险会高一点。我自己是留空的因为本地电脑已有磁盘加密能够接受这个风险。生成后把公钥内容复制出来cat ~/.ssh/id_ed25519.pub输出的一整行就是公钥。到远程平台的个人设置里找到“SSH and GPG keys”或“SSH Keys”把它粘贴进去保存。然后在本地验证ssh -T gitgithub.com如果返回类似“Hi username! Youve successfully authenticated”的信息就说明认证已经通了。如果返回Permission denied (publickey)最可能是远程平台没有你这个公钥或者公钥复制少了内容。还有一个隐蔽问题多个SSH密钥共存在一台机器上Git不知道怎么选就会随机试一个最后失败。解决方法是编辑~/.ssh/config为不同的主机配置不同的密钥Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github这里可以给不同平台各生成一套密钥文件通过IdentityFile指定。加了这个配置后ssh -T gitgithub.com就能精准选对钥匙。5.3 HTTPS与SSH两种连接方式怎么选很多新项目我建议直接用SSH因为SSH配置好之后一劳永逸不需要每次推送都输入账号密码。但HTTPS也有自己的优势不需要配置密钥如果公司网络对22端口有限制改用HTTPS的443端口反而更稳。如果走HTTPS认证Github这些平台现在不允许用账号密码直接push得用Personal Access Token。这个Token要自己在设置里生成复制到粘贴密码的位置。很多人在这一步会困惑“我密码填对了为什么失败”就是因为没意识到要用Token而不是密码。企业内部GitLab可能还是走用户名密码认证但也会越来越倾向于SSH。我的最终建议是个人开发、小团队项目无脑SSH配置一次舒服三年受网络环境限制、或在公共电脑上用HTTPS临时操作也行但注意别把Token存到浏览器或IDE里避免泄露。6. IDEA创建新项目拉取GitIDE里的实际操作与避坑命令行熟悉之后用IDEA这类图形化工具会轻松很多。但很多人在IDEA里拉取项目也会遇到各种莫名其妙的问题其实大部分都是命令行环境没配好导致的。6.1 从IDEA拉取远程项目的完整步骤打开IDEA如果还在欢迎界面选择“Get from VCS”如果已经打开了项目用菜单File - New - Project from Version Control。在URL栏粘贴远程仓库地址选择存放目录点Clone。IDEA会调用本地的Git客户端来完成clone如果弹出“Git isnt installed”或“Cannot run program git”说明IDEA没有找到Git可执行文件需要到Settings - Version Control - Git的Path to Git executable里手动指定。拉取下来之后IDEA右下角会显示当前分支名。这里有个新手容易困惑的点IDEA底层用的是一个专用的Git执行逻辑很多报错比命令行的更模糊。如果clone失败我建议先去命令行手动执行一下git clone 地址。命令行能通过IDEA大概率也能通过IDEA拉不下来命令行多半也会报同样的错。这样能快速把问题范围缩小到“认证问题”还是“IDEA配置问题”。6.2 IDEA里的常用Git操作与分支合并在IDEA里提交代码路径是右键项目 -Git - Commit Directory或者直接按快捷键CtrlK。提交面板会展示所有改动文件文件颜色有含义红色是新增未跟踪绿色是新增已暂存蓝色是已修改。勾选你想提交的文件写清楚Commit Message点Commit即可。如果同时勾选了“Commit and Push”那提交后会自动推送我建议新手不要勾分开操作更稳。推送是CtrlShiftK弹出的窗口里选好远程分支点Push。IDEA默认会提示代码分析和格式检查这些配置可以留着能提前发现明显问题。分支操作在IDEA右下角的分支菜单里可以完成New Branch会基于当前分支创建并自动切换Checkout Tag or Revision可以查看历史版本合并时切到目标分支右键当前分支选择Merge into Current。如果产生了冲突IDEA会弹出一个三栏合并窗口左边是本地版本右边是远程版本中间是合并结果。你可以逐行选择保留哪边代码比在命令行里手动编辑标记符号直观很多。合并完成别忘了CommitIDEA不会帮你自动生成commit需要你手动提交一次。6.3 IDEA里的常见问题与我的操作习惯IDEA里我见过最多的问题是提交时把.idea这个目录一起提交了。.idea是IDEA的项目配置目录不同人的IDEA版本、插件配置都不一样提交到仓库后会不断产生冲突甚至导致团队成员打开项目时加载错误。解决办法是在项目根部添加.gitignore文件把.idea、target、node_modules、build这些目录统统忽略掉。命令行里很多人也知道要写.gitignore但IDEA因为是图形界面点得更快容易把忽略文件也顺手加了。另一个常见问题是IDEA的Git窗口显示“Uncommitted Changes”但点提交时发现什么文件都选不上。这是因为项目根目录和Git仓库根目录不一致。在IDEA里打开多模块项目时如果git仓库建在上一级目录IDEA可能没有正确识别仓库边界。这时可以通过File - New - Module from Existing Sources重新关联或者在Settings - Version Control里查看目录映射是否正确。最后说一个我自己的习惯不管在命令行还是IDEA里提交之前一定先看一眼变更内容命令行用git diffIDEA用提交面板右侧的Diff预览确保提交的确实是你要提交的改动。很多线上事故都是因为一时手快用了git add .把无关文件、甚至含密码的配置文件一起提交了。宁可多花三十秒检查也不要事后花三小时回滚。这个习惯养成了Git操作才算真正过关。
返回列表