ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Git零基础实战:仓库创建、提交、远程推送与分支管理

Git零基础实战:仓库创建、提交、远程推送与分支管理 刚装了Git客户端却发现不知道接下来该干嘛的人我见得太多了。很多人下载完Git、点开命令行面对一个光秃秃的$提示符脑子里全是所以呢——然后这个工具就被遗忘在硬盘的角落里。这篇东西就是写给这批人的。我不会从Git的历史和作者八卦讲起那些对实际写代码没有任何帮助。我会直接带你走一遍创建第一个Git仓库 → 完成第一次提交 → 推送到远程 → 日常分支操作的完整链路全程用最直白的语言解释每条命令到底干了什么、为什么要在那个时机干这件事。如果你已经上手了Git但总是卡在SSH认证、分支合并、VSCode或IDEA里那堆红绿状态上这篇同样能帮你把基础补扎实——90%的操作难题本质都是基础概念没理顺。1. 动手之前用生活场景理解Git仓库是什么1.1 没有Git时我们是怎么管理代码的要理解Git仓库的价值最好的办法是回想一下没有版本管理工具时你做过的事项目文件夹里堆满了final_v2.py、final_final.py、论文终稿_不要再改了.docx。每次改完代码就把旧文件复制一份重命名美其名曰备份。等到第三天要回想我到底在上一个版本里改了什么的时候只能打开两个文件逐行对比。遇到更棘手的情况就更崩溃了——两个同事同时改了同一个文件最后靠微信群发了个我更新了大家用这个然后所有人的本地版本开始互相覆盖。Git仓库解决的就是这两个核心问题完整记录每次变更的历史以及让多人并行修改同一份代码而不互相踩踏。1.2 Git仓库其实就是一个带时间旅行能力的文件夹从技术形态上说一个Git仓库就是一个普通的文件夹唯一区别是文件夹里多了一个隐藏的.git子目录。这个.git目录里躺着整个项目的完整历史快照每次你提交commit时是谁提交的、什么时候、改动了哪些文件、具体的修改内容是什么。它就像是给整个项目装了一个存档点系统你可以随时借助它退回到任何一个存档点查看当时的代码状态也可以从那个点拉出一条新分支去尝试不同的玩法。我经常用一个类比Git仓库就像游戏里的存档管理。你不存档游戏就永远只有一个当前进度一旦运行了git commit指令就相当于在某个关卡落下了存档。git checkout切分支、git reset回退本质都是读档和重开的不同操作方式。理解了这层关系后面所有命令的语义都会顺畅很多。1.3 三个区域工作区、暂存区、版本库这是新手最容易糊弄过去、但却是最核心的一块基础模型。用一句话串起它们的关系你在工作区改文件改完用add把改动放进暂存区最后用commit把暂存区的内容固化进版本库。工作区Working Directory就是你平时用VSCode、IDEA打开的那个文件夹里面是你能看到、能编辑的物理文件。暂存区Staging Area / Index一个临时存放你准备提交哪些改动的区域。为什么要有这个中间层因为一次commit应该是一个逻辑完整的变更单元——比如修复了登录页面的样式和重构了后端接口就不该混在同一个提交里。你可以先改十个文件然后只把其中三个add进暂存区代表本次只提交这三个文件的改动。版本库Repository由commit产生的不可变历史记录每次提交都会生成一个哈希值就是你常看见的那串commit 3f2a1b...连同作者、时间、说明信息一起永久保存。提示git status是你最该高频使用的命令没有之一。它会清清楚楚地告诉你每个文件处于哪个区域、哪些改了没暂存、哪些暂存了没提交。我见过太多新人因为懒得看status导致改错文件、提交错内容。2. 创建第一个Git仓库初始化、配置与首次提交2.1 git安装与全局身份配置跳过这一步后面全白搭在创建仓库之前Git环境本身必须就位。现在Windows下我建议直接去Git官网下载Windows版安装包装完打开Git Bash——它是一个模拟Linux环境的终端比系统自带的cmd对Git命令友好得多。macOS用户如果装了Homebrew执行brew install git就能搞定。装完以后在任意终端敲git --version能输出版本号就说明安装成功了。接下来是几乎所有教程都会提、但你不知道它为何如此重要的环节全局身份配置。git config --global user.name 你的名字 git config --global user.email 你的邮箱这两条命令的作用不是登录或验证身份而是为你的每一次提交贴上作者标签。Git在生成commit时会把user.name和user.email写进提交记录里。如果你不配Git会拒绝提交或者用系统主机名生成一个诡异的默认身份。很多人在提交到GitHub后发现我的账号怎么没显示Contributions或者提交者怎么是一串乱码十有八九就是这一步没做好或者邮箱跟GitHub账号对不上。--global表示对当前电脑上的所有仓库生效如果某个特定仓库想用不同身份可以在那个仓库里不带--global重新配一遍。2.2 初始化仓库git init之后发生了什么先建好一个空目录作为项目文件夹然后进入目录执行mkdir my-first-project cd my-first-project git init输出一行Initialized empty Git repository就代表仓库创建成功了。这时候用ls -a看一眼目录会发现多了一个.git文件夹。这就是仓库的核心。我见过有人把.git文件夹当垃圾删掉的——等于把整个历史存档都扬了只剩一堆未追踪的零散文件别干这种事。还有人问能不能直接用git clone而不用git init这是两条不同的路线。git init用于在本地把现有文件夹变成一个仓库项目是从零开始的git clone则是把远程已有仓库完整复制下来项目已存在于GitHub等平台。大部分创建第一个Git仓库的流程都是从git init起步的。2.3 第一个文件的完整提交链路add和commit为什么要分开现在往项目里创建一个README.md文件随便写点项目说明。然后依次运行git add README.md git commit -m init: 创建第一个项目文件先执行git status观察中间状态第一次运行会看到README.md出现在Untracked files区意思是Git认识到了这个新文件但还没开始追踪它add之后再运行status会变成Changes to be committed文件进入了暂存区commit之后会看到nothing to commit工作区干干净净版本库多了一条历史记录。-m后面的参数是提交说明这也是新手容易敷衍的地方。好的提交信息应该像一条清晰的微博——说清楚这次提交做了什么改动。写fix bug这种说明一百天以后你根本不知道修了什么bug写修复用户登录时验证码过期仍可提交的问题才是合格的提交说明。2.4 让Git只追踪该追踪的.gitignore的正确打开方式第一次创建仓库时很多人会发现git status列出了一堆自己根本不想提交的文件编译产生的node_modules、Python的__venv虚拟环境、IDE的.idea目录、macOS的.DS_Store。这些文件要么体积巨大、要么是从别人环境里复制过来的垃圾文件把它们提交进仓库既拖慢clone速度还会造成不同机器间的环境配置混乱。解决办法是在项目根目录创建一个.gitignore文件在里面写需要忽略的模式node_modules/ dist/ .idea/ .vscode/ *.log .DS_Store注意一个细节.gitignore只对尚未被Git追踪的文件生效。如果某个文件之前已经被git add提交过了之后才加进.gitignore该文件依然会被持续追踪。这种情况需要先运行git rm --cached 文件名把文件从Git的追踪列表里移除但保留物理文件然后再让.gitignore生效。这个操作我踩过两次坑特此提醒。3. 连接远程仓库推送到GitHub、SSH认证与第一道坎3.1 为什么本地仓库还不够远程仓库解决的真实问题本地仓库确实已经把历史记录和版本回退解决了但它有个硬伤代码只存在你这一台电脑上。硬盘坏了一切归零同事要一起开发也根本拿不到代码。远程仓库GitHub、GitLab、Gitee这些托管平台就是给本地仓库找了一个云端中心库它能做到三件事备份代码、多人协作、跨设备续接开发。选择哪个平台看你的网络情况和团队习惯。放全球开源项目GitHub是事实标准国内访问更快、中文界面更友好就选Gitee码云。本文后面的远程操作以GitHub为例但流程在Gitee上完全一致只是把域名换一下。3.2 两种连接方式HTTPS与SSH我推荐直接上SSH把本地和远程仓库对接有两种协议可选对比项HTTPSSSH克隆地址格式https://github.com/user/repo.gitgitgithub.com:user/repo.git认证方式用户名 个人访问令牌Token密钥对公钥放平台私钥留本地重复推送体验牢记凭据后流畅但之前经常要反复输密配置好后一次免密后续一路畅通安全性Token如果泄漏就需要去平台作废重发私钥不离开本机相对更安全适合场景临时克隆、公司内网长期个人开发、主力工作机我个人的建议是直接在主力开发机上配置SSH。虽然第一次配置要折腾十来分钟但之后每次push都不用再处理认证问题体验明显更顺。3.3 SSH密钥生成与配置一步步来首先确认本地是否已有SSH密钥避免重复生成覆盖旧密钥ls ~/.ssh如果看到id_rsa和id_rsa.pub这对文件说明之前生成过没有就执行ssh-keygen -t ed25519 -C 你的邮箱example.com一路回车即可如果想给私钥加访问口令可以在提示时输入不加也行。这条命令会生成一对密钥id_ed25519是私钥、id_ed25519.pub是公钥。私钥等同于你电脑的身份证绝不能泄漏给别人公钥是给服务器验证用的可以公开配置。然后把你电脑的SSH代理打开eval $(ssh-agent -s) ssh-add ~/.ssh/id_ed25519接着复制公钥内容cat ~/.ssh/id_ed25519.pub登录GitHub点头像进入Settings → SSH and GPG keys → New SSH key把公钥粘进去保存。3.4 SSH认证失败的完整排查链路我实测过的最常见问题这是搜索热度最高的痛点我按排查顺序列出你照着做基本就能解决验证密钥是否被平台接受运行ssh -T gitgithub.com。看到Hi 用户名! Youve successfully authenticated就是成功。如果报Permission denied (publickey)先确认公钥有没有贴对很多人把私钥内容复制过去了id_ed25519.pub和id_ed25519千万别搞混。检查SSH代理是否记住了密钥运行ssh-add -l如果输出The agent has no identities说明密钥没被加载重新执行上面的ssh-add流程。确认远程地址写对没有在项目里执行git remote -v如果remote地址是https://开头而你偏偏用了SSH协议去连接那肯定认证失败。改成SSH地址的正确命令是git remote set-url origin gitgithub.com:用户名/仓库名.git多密钥环境下的常见事故如果你电脑上同时配了多个平台的密钥比如工作用的GitLab和私人GitHubSSH默认会拿私钥去逐一尝试认证。这时候需要在~/.ssh/config里为不同域名指定不同的私钥文件否则GitHub会拒绝你的连接。3.5 第一次push的完整链路现在在GitHub上创建一个空仓库不要勾选初始化README否则后面要先pull合并拿到仓库地址后在本地项目里把远程源挂上git remote add origin gitgithub.com:用户名/仓库名.gitorigin是默认的远程仓库别名等价于那只远程仓库的遥控器名字。然后推送git push -u origin master如果分支名是main就把末尾改成main。-u参数的作用是建立本地分支与远程分支的追踪关系把本地master/main和远程master/main绑定在一起之后你就能直接输git push或git pull不用每次带上origin和分支名。首次push如果报error: src refspec master does not match any说明你还没有做出任何commit。远程仓库要求推送的必须是仓库里已有的提交记录你本地一次commit都没提交过自然没有东西可推。回去先完成一次add和commit再push。4. 分支操作与合并从默认分支到第一次冲突处理4.1 为什么默认分支叫master/main你该不该改每个Git仓库在创建后都会有一个默认分支。老版本Git默认叫master很多云平台现在默认叫main。本质上它们没有任何区别只是命名习惯。如果你本地初始化的仓库叫master而GitHub远程默认是main推送时就会出现两套分支名。最简单的办法是本地仓库直接对齐远程习惯git branch -m master main把当前master分支重命名为main这样本地和远程的默认分支名就一致了。4.2 分支到底是什么代码世界的平行宇宙分支在Git里是一个非常轻量且高效的设计。它本质上是指向某个提交的可移动指针创建新分支只是新建了一个指针成本几乎为零。因此Git社区的主流工作流是大胆开分支、频繁开分支——每做一个新功能、修一个新bug就单独拉一条分支出来干活不影响主分支的稳定性。新建并切换分支建议用组合命令git checkout -b feature/login它等同于git branch feature/login加git checkout feature/login两步。新分支会从当前所在的位置当前分支的最新提交复制出代码状态你在新分支里做的修改、产生的提交都不会影响原来的分支。注意Git新版还提供了git switch和git restore来分别负责切分支和还原文件语义更清晰。我平时git switch和git checkout都在用但理解checkout的两种职责切分支、恢复文件是有必要的因为你会读到大量旧版本教程。4.3 分支合并的两种结果快进合并与三方合并完成功能开发后把新分支的成果并回主分支的方式很直接git checkout main git merge feature/loginGit合并时有两种典型情况。如果主分支在分出feature/login之后一直没有新的提交合并就是一次快进fast-forward——直接把main指针挪到feature/login的最新提交上历史是一条直线干净利落。但如果主分支在你开发期间也被别人更新过比如同事提交了一个README修改Git就得做三方合并把两个分支的最新状态连同它们共同的分叉点一起融合产生一个合并提交。这时候git log --graph --oneline会看到历史出现分叉又汇合的形状这完全正常不是混乱——它如实记录了两条开发线曾经并行存在过。无论哪种合并没有产生冲突时Git会自动完成连你的手都不用动。冲突只有在两边改到了同一处内容且修改办法不一致时才会出现。4.4 合并冲突新手最怕、其实最有规律的事冲突出现时git status会显示both modified状态并列出冲突文件。打开文件就会看到冲突标记 HEAD 这里是当前分支main的内容 这里是待合并分支feature/login的内容 feature/login解决冲突的办法不是删掉标记那么简单而是要想清楚哪部分内容是对的、或者哪些内容应该保留融合。手动编辑文件到正确状态后把、、这些标记行删干净然后git add 冲突文件 git commitGit允许不带-m参数直接执行这次commit因为冲突解决完成后它会自动填入一条合并提交的默认说明。注意这一步用的是commit而不是merge --continue后者是个可选写法二者等价。我见过有人把标记行留下就直接提交的代码编译必炸提交历史里也留下了垃圾记录——所以每次冲突解决后都运行一次git status确认所有冲突文件都已经add进去了再提交。5. 把Git放进日常开发环境与VSCode/IDEA配合及高频操作5.1 VSCode里配置Git远程仓库这几点最容易忽略VSCode内置了Git面板日常的add、commit、push都能可视化完成但新手往往卡在从哪里设置远程仓库地址。顺序是这样的先在命令行完成git init、git add、git commit这时候左侧源代码管理栏会显示一个分支名比如master。点击分支名旁边更多的按钮...多了一个文本按钮里的推送VSCode会提示没有配置远程仓库是否添加你选择添加远程输入GitHub仓库的SSH或HTTPS地址就能直接推上去了。如果你用的SSH认证VSCode会直接调用本地SSH密钥不需要单独在VSCode里配置任何密码。VSCode里拉取远程仓库更简单打开VSCode直接选择克隆Git仓库粘贴远程地址选一个本地目录代码就全部下来了。常见的VSCode集成问题有两个一是git not found错误说明VSCode没找到Git可执行文件路径需要在设置里的git.path项指向Git安装目录的git.exe二是提交时VSCode提示没有配置user.name/user.email回到终端执行git config --global那两条命令即可。5.2 IDEA / 创建新项目时拉取Git仓库的操作路径与之类似在JetBrains系IDEIDEA、PyCharm、GoLand等里新建项目时直接选Get from VCS粘贴远程仓库地址就能把代码拉下来称为一个新项目。打开本地已有项目后如果项目目录本身就是Git仓库IDEA会自动识别右下角会出现分支标识如果不是需要通过VCS菜单 →Enable Version Control Integration选择Git来激活版本控制。IDEA里最值得记住的是几个常用快捷键对应的Git动作CtrlKmacOS上是CmdK提交等同git commitCtrlShiftK推送等同git pushCtrlT更新项目执行的是拉取加合并等同git pull。IDEA的冲突解决界面比命令行友好得多左边是本地版本、右边是远端版本、中间是合并结果你可以非常直观地在中间区域保留需要的行。遇到冲突时打开那个GUI比盯着命令行改标记省力太多。5.3 撤销与回退写错commit信息、add错文件怎么办高频操作里最让人发怵的是做错了怎么撤销这里把常见的几种场景一次说清。发现git add错误文件还没commit直接git reset不带参数把暂存区清空文件回到未暂存状态所有改动原样保留。commit完之后发现提交信息写错了git commit --amend -m 新的提交信息会改写最近一次提交。注意这会让提交哈希改变如果这次提交已经push到公共分支别用amend除非你清楚自己在做什么。commit完发现有个文件漏提交了git add 漏掉的文件 git commit --amend --no-edit--no-edit表示保留原有提交信息只在原提交上追加改动。想丢弃工作区某个文件的修改git checkout -- 文件名新版也可用git restore 文件名。这个操作不可逆确认你真的不需要那些改动了再执行。想把整个项目回退到前面某个提交git log --oneline git reset --hard 提交哈希前几位--hard是核弹级选项会同时重置暂存区和工作区所有未提交的改动全部丢失。用之前一定确认自己不需要这些内容了。我的习惯是reset前先跑git stash暂存一下可能要用的改动给后悔留个退路。5.4 我日常用得最顺手的Git高频命令速查目的命令查看状态git status暂存所有改动git add .暂存指定文件git add 文件名提交git commit -m 说明查看提交历史git log --oneline --graph新建并切换分支git checkout -b 分支名切换分支git checkout 分支名拉取远程代码git pull推送本地代码git push合并分支git merge 分支名暂存手头改动git stash恢复暂存内容git stash popgit add .其实是个双刃剑它很方便但会把当前目录下所有未忽略的改动一股脑都暂存进去。我倾向于在项目里配置好靠谱的.gitignore之后再频繁用它。5.5 新手最该养成的三个Git习惯第一提交之前先运行一次git status看看这次提交里都包含了哪些文件确认没有误添加或漏添加。很多人提交了一堆临时文件进仓库根子就在跳过了这一步。第二提交信息尽量写得像人话。控制在五十个字以内说明做了什么如修复周末无法登录的时区偏移问题而不是save。第三按逻辑拆分提交。功能A和功能B的代码混在同一个commit里会让你后面排查历史时非常痛苦——你改了几下git log都查不出原因。一次提交只包含一个逻辑单元这条原则坚持下来项目越到后期越值钱。6. 一些实际操作的体会以及一个顺手的小技巧从第一次git init到现在我自己配置过的工作流已经换了好几波从最早的记事本记命令到后来用GUI客户端又绕回命令行为主。现在的习惯是纯命令行加VSCode内置面板混用——日常add和commit直接在VSCode点按钮遇到分支合并、冲突处理、历史改写就切回命令行。两条路线各有擅长不用非要二选一。最后分享一个让我找错效率提升不少的小技巧给git log配置一个别名让它输出精炼图形视图。git config --global alias.tree log --graph --oneline --decorate --all配置之后在任何一个Git仓库里执行git tree就能看到全部分支的提交网络图。分支怎么分叉的、哪个提交在哪个分支上、合并点在哪一目了然。对新手来说这会比死记硬背命令更直观地建立起对Git工作流的整体感知——毕竟你在仓库里留下的每一笔历史都是在帮未来的自己省时间。
返回列表