十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Git与TortoiseGit使用教程:第二章 Git常用命令及TortoiseGit使用教程

Git与TortoiseGit使用教程:第二章 Git常用命令及TortoiseGit使用教程 Git与TortoiseGit使用教程第一章 Git的安装及SSH公钥配置第二章 Git常用命令及TortoiseGit使用教程第三章 Gitee仓库同步到GitHub文章目录Git与TortoiseGit使用教程[TOC](文章目录)前言一、先理清Git的工作流程二、Git常用命令及使用场景1.创建仓库2.日常提交三连用得最多3.查看状态与历史4.撤销与回滚重点也是最容易搞砸的5.分支操作6.远程仓库操作7.标签管理8.忽略文件.gitignore9.常用命令速查表三、TortoiseGit的安装与配置1.关于TortoiseGit2.下载与安装3.首次配置4.可选使用PuTTY方案时的密钥转换四、TortoiseGit的详细使用1.克隆远程仓库2.在本地创建仓库3.看懂文件图标4.提交代码add commit push5.更新代码pull / fetch6.查看提交日志7.版本回滚8.分支的创建、切换与合并9.解决冲突重点10.忽略文件11.设置外部比较工具Beyond Compare12.其他常用功能五、常见问题总结前言上一章介绍了Git的安装和SSH公钥配置环境已经准备好了。本章接着讲实际怎么用分两部分Git常用命令按使用场景整理重点是什么时候该用哪条而不是把手册抄一遍TortoiseGit小乌龟把上面这些命令换成右键菜单操作日常开发用它效率更高。个人的建议是命令行至少要能看懂图形界面用来提效。因为出问题的时候比如冲突、误回滚网上给的解决方案九成九是命令行的而日常提交、拉取这类重复操作右键点两下确实比敲命令快。本章环境同上一章Windows 10/11 64位远程仓库以Gitee为例。一、先理清Git的工作流程在敲命令之前把上一章提到的四个区域再过一遍所有命令都是在这四个区域之间搬运文件工作区 --git add-- 暂存区 --git commit-- 本地仓库 --git push-- 远程仓库文件在Git眼中有四种状态状态含义如何进入下一步Untracked未跟踪新建的文件Git还不管它git addModified已修改已跟踪的文件被改动了但没加入暂存区git addStaged已暂存已加入暂存区等待提交git commitCommitted已提交已保存到本地仓库git push推到远程git status这条命令的作用就是随时告诉你每个文件现在处于哪种状态。遇到不确定的情况先敲git status它的提示信息里通常就带着下一步该用什么命令。二、Git常用命令及使用场景1.创建仓库场景一本地已有项目想纳入版本管理在项目文件夹里右键 →Open Git Bash heregitinit# 初始化生成隐藏的.git目录执行后目录下会多出一个.git隐藏文件夹所有版本历史都存在这里不要手动去删改它。场景二从远程仓库拉一份到本地最常用gitclone gitgitee.com:用户名/仓库名.git# SSH方式推荐gitclone https://gitee.com/用户名/仓库名.git# HTTPS方式gitclone gitgitee.com:用户名/仓库名.git myproj# 指定本地文件夹名gitclone-bdev gitgitee.com:用户名/仓库名.git# 只克隆dev分支在这里插入图片描述2.日常提交三连用得最多gitadd.# 把当前目录所有改动加入暂存区gitcommit-m修复串口接收丢包问题# 提交到本地仓库-m后面是提交说明gitpush# 推送到远程仓库git add的几种用法gitadd文件名.c# 添加指定文件gitadd*.c# 添加所有.c文件gitaddsrc/# 添加整个目录gitadd.# 添加当前目录下所有改动含新增、修改、删除gitadd-A# 添加整个仓库的所有改动关于git commitgitcommit-m提交说明# 常规提交gitcommit-am提交说明# add commit 合并仅对已跟踪文件有效新文件不行gitcommit--amend# 修改上一次的提交说明还没push时用gitcommit--amend--no-edit# 把当前改动并入上一次提交说明不变提交说明怎么写写清楚改了什么、为什么改别写update“修改”1这种。团队里常用的格式是类型: 描述例如feat: 增加ADC采样滤波功能 fix: 修复I2C超时导致的死循环 docs: 补充寄存器配置说明3.查看状态与历史gitstatus# 查看当前状态最常用多敲没坏处gitstatus-s# 简洁模式输出gitlog# 查看提交历史gitlog--oneline# 一行一条看起来清爽gitlog--oneline--graph--all# 图形化显示分支走向很实用gitlog-3# 只看最近3条gitlog-p文件名# 查看某个文件的改动历史及具体内容gitdiff# 工作区 vs 暂存区 的差异gitdiff--cached# 暂存区 vs 最后一次提交 的差异gitdiffHEAD# 工作区 vs 最后一次提交 的差异gitdiff分支A 分支B# 比较两个分支4.撤销与回滚重点也是最容易搞砸的这部分建议单独记用错命令可能真的会丢代码。1改乱了工作区文件想恢复到上次提交的样子gitcheckout -- 文件名# 老写法gitrestore 文件名# 新写法Git 2.23推荐gitrestore.# 恢复所有文件⚠️这个操作不可恢复工作区的改动会直接丢失执行前确认清楚。2git add加错了想从暂存区撤出来但保留改动gitreset HEAD 文件名# 老写法gitrestore--staged文件名# 新写法推荐3已经commit了想撤销这次提交gitreset--softHEAD^# 撤销提交改动保留在暂存区最温和gitreset--mixedHEAD^# 撤销提交改动保留在工作区默认值gitreset--hardHEAD^# 撤销提交改动全部丢弃危险其中HEAD^表示上一个版本HEAD^^是上上个HEAD~5是往前5个。4回退到指定的某个历史版本gitlog--oneline# 先查到目标版本的commit id如 a1b2c3dgitreset--harda1b2c3d# 回退到该版本5reset过头了想再回来gitreflog# 查看所有操作记录包括被reset掉的提交gitreset--hard目标commitidgit reflog是后悔药只要没执行git gc几乎所有误操作都能靠它找回来。这条命令一定要记住。6撤销某次提交但保留历史记录已推送到远程时用gitrevert commit_id# 生成一个新提交来抵消指定提交的改动reset和revert怎么选提交还没push到远程 → 用reset直接抹掉历史干净提交已经push了别人可能拉过 → 用revert用一次新提交去抵消。强行reset后再push -f会把别人的记录搞乱。7临时保存现场写到一半要切分支救急gitstash# 把当前工作区改动暂存起来工作区变干净gitstash save说明# 带说明的暂存gitstash list# 查看暂存列表gitstash pop# 恢复最近一次暂存并从列表删除gitstash apply stash{1}# 恢复指定的暂存但不从列表删除gitstash drop stash{0}# 删除指定暂存gitstashclear# 清空所有暂存5.分支操作分支是Git的核心优势。开发新功能、修bug都应该开新分支避免污染主分支。gitbranch# 查看本地分支带*的是当前分支gitbranch-a# 查看所有分支含远程gitbranch-v# 查看分支及最后一次提交gitbranch dev# 创建dev分支gitcheckout dev# 切换到dev分支gitcheckout-bdev# 创建并切换常用等于上面两条gitswitch dev# 新写法切换分支gitswitch-cdev# 新写法创建并切换gitmerge dev# 把dev分支合并到当前分支gitbranch-ddev# 删除dev分支未合并的会拒绝删除gitbranch-Ddev# 强制删除gitpush origin--deletedev# 删除远程dev分支gitbranch-m旧名 新名# 重命名分支一个典型的功能开发流程gitcheckout main# 回到主分支gitpull# 拉取最新代码gitcheckout-bfeature-uart# 开一个功能分支# ...在这里写代码、多次commit...gitcheckout main# 功能完成回到主分支gitpull# 再拉一次防止别人有新提交gitmerge feature-uart# 合并功能分支gitpush# 推送gitbranch-dfeature-uart# 删除已合并的功能分支6.远程仓库操作gitremote-v# 查看已关联的远程仓库gitremoteaddorigin gitgitee.com:用户名/仓库名.git# 关联远程仓库gitremotermorigin# 解除关联gitremote set-url origin 新地址# 修改远程地址gitpush-uorigin main# 首次推送-u建立追踪关系之后直接git push即可gitpush# 推送当前分支gitpush origin dev# 推送指定分支gitpush--tags# 推送所有标签gitfetch# 只拉取远程更新不自动合并安全gitpull# 拉取并合并 fetch mergegitpull--rebase# 拉取并变基历史更线性本地已有项目关联到远程仓库完整流程是gitinitgitadd.gitcommit-m初始化提交gitremoteaddorigin gitgitee.com:用户名/仓库名.gitgitpull--rebaseorigin master# 远程若有README等文件先拉下来gitpush-uorigin master如果git remote add报错remote origin already exists先删掉再加gitremotermorigingitremoteaddorigin gitgitee.com:用户名/仓库名.git7.标签管理发版本的时候用比如给固件打个v1.0.0gittag# 查看所有标签gittag v1.0.0# 打轻量标签gittag-av1.0.0-m第一个正式版# 打附注标签推荐带说明和时间gittag-av1.0.0 a1b2c3d# 给历史某次提交补打标签gitpush origin v1.0.0# 推送单个标签gitpush origin--tags# 推送所有标签gittag-dv1.0.0# 删除本地标签gitpush origin :refs/tags/v1.0.0# 删除远程标签8.忽略文件.gitignore编译产生的中间文件、IDE配置、密钥文件等不应该提交到仓库。在项目根目录新建.gitignore文件# 编译输出*.o *.obj *.hex *.bin *.map *.lst Objects/ Listings/ build/ Debug/ Release/# Keil / IAR 用户配置文件*.uvguix.* *.uvoptx *.dep *.crf *.d settings/# IDE配置.vscode/ .idea/# 系统文件Thumbs.db .DS_Store# 敏感信息*.key config_local.h# 例外即使忽略了*.bin这个文件也要提交!bootloader.bin需要注意的是.gitignore只对还没被跟踪的文件生效。如果某个文件已经提交过再加进.gitignore是没用的需要先把它从版本控制中移除gitrm--cached文件名# 从仓库移除但保留本地文件gitrm-r--cached目录名/# 移除整个目录然后重新commit即可。9.常用命令速查表命令作用git init初始化本地仓库git clone url克隆远程仓库git status查看当前状态git add .添加所有改动到暂存区git commit -m 说明提交到本地仓库git push推送到远程git pull拉取并合并远程更新git fetch只拉取不合并git log --oneline --graph图形化查看提交历史git diff查看改动内容git branch查看分支git checkout -b name创建并切换分支git merge name合并分支git reset --hard id回退版本危险git revert id反做某次提交git reflog查看所有操作记录后悔药git stash/git stash pop暂存/恢复工作现场git tag -a v1.0 -m 说明打标签git rm --cached file从版本控制中移除但保留文件三、TortoiseGit的安装与配置1.关于TortoiseGitTortoiseGit小乌龟是Windows下的Git图形化客户端它把Git命令封装成了资源管理器右键菜单并且会在文件图标上叠加状态标记一眼就能看出哪些文件改动了。需要注意的是TortoiseGit只是一个界面外壳它本身不包含Git必须先安装Git见第一章才能使用。2.下载与安装官网https://tortoisegit.org/download/需要下载两个文件主程序TortoiseGit-2.x.x.x-64bit.msi中文语言包TortoiseGit-LanguagePack-2.x.x.x-64bit-zh_CN.msi页面下方 Language Packs 区域找Chinese, simplified先安装主程序一路Next其中有一步会让选择SSH客户端TortoiseGitPlink默认TortoiseGit自带的PuTTY方案密钥格式为.ppk需要额外转换OpenSSH, Git default SSH Client推荐直接复用第一章配置好的id_rsa密钥不用做任何转换。这一步很关键。如果第一章已经用ssh-keygen生成过密钥并配好了公钥这里务必选 OpenSSH可以直接省掉后面PuTTYgen转换密钥的所有麻烦。若选了默认的TortoiseGitPlink请看本节第4小节。其余步骤保持默认点击Install完成安装。再双击安装中文语言包一路Next即可主要中文语言包版本号要一致。3.首次配置安装完成后会自动弹出配置向导若没弹出可在桌面右键 →TortoiseGit→Settings1设置语言General页面的Language下拉框选择中文简体“点击应用”。2配置用户名和邮箱进入Git页面填写Name和Email。这里实际写入的就是.gitconfig和命令行的git config --global user.name是一回事如果第一章已经配过这里会自动显示无需重复填写。3确认Git.exe路径General页面下方有Git.exe Path正常会自动识别到C:\Program Files\Git\bin。若提示找不到手动指定到Git安装目录下的bin文件夹。4确认SSH客户端网络Network页面的SSH客户端一栏用OpenSSH方案 → 填C:\Program Files\Git\usr\bin\ssh.exe用PuTTY方案 → 填C:\Program Files\TortoiseGit\bin\TortoiseGitPlink.exe4.可选使用PuTTY方案时的密钥转换如果安装时选了默认的TortoiseGitPlink那么它不认识id_rsa需要转成.ppk格式开始菜单打开PuTTYgen随TortoiseGit一起安装点击Load文件类型选All Files (*.*)选择C:\Users\你的用户名\.ssh\id_rsa提示导入成功后点击Save private key忽略不设密码的警告保存为id_rsa.ppk打开Pageant同样随TortoiseGit安装运行后在任务栏托盘右键托盘图标 →Add Key加载刚才的.ppk文件。也可以直接用PuTTYgen新生成一对密钥把上方文本框里的公钥内容复制到Gitee私钥保存为.ppk。再强调一次图省事就在安装时选OpenSSH这一整节都可以跳过。四、TortoiseGit的详细使用安装完成后在任意文件夹空白处右键Win11需点显示更多选项就能看到TortoiseGit的菜单项。1.克隆远程仓库在想要存放代码的文件夹里空白处右键 →Git 克隆(Clone)URL填远程仓库地址从Gitee复制的SSH地址目录是本地存放路径会自动根据仓库名填好如果用PuTTY方案勾选加载 Putty 密钥并选择.ppk文件OpenSSH方案则不用管点击确定等待克隆完成。2.在本地创建仓库新建一个文件夹进去空白处右键 →在这里创建版本库(Create repository here)弹窗中的制作纯版本库不要勾选勾了就是bare仓库没有工作区点击确定文件夹里会生成.git隐藏目录。3.看懂文件图标TortoiseGit会在文件/文件夹图标左下角叠加小图标表示状态图标含义绿色对勾 ✔已提交本地与版本库一致没有改动红色感叹号 ❗已修改尚未提交蓝色加号 ➕新添加到暂存区等待提交灰色减号 ➖被删除的文件黄色问号 ❓未纳入版本控制Untracked黄色叹号冲突图标存在冲突需要手动解决如果图标不显示一般是图标缓存问题。可以重启资源管理器任务管理器 → 找到Windows 资源管理器 → 重新启动或在TortoiseGit设置 → 图标覆盖里检查配置。4.提交代码add commit push1提交到本地仓库修改或新增文件后在项目文件夹空白处右键 →Git 提交(Commit) - “master”上方日志信息框填写本次提交说明下方文件列表勾选要提交的文件未跟踪的文件默认不勾需手动勾上点击提交。也可以先右键单个文件 →TortoiseGit→添加(Add)把文件加入暂存区相当于git add再执行提交。不过在提交窗口里直接勾选更方便一步到位。2推送到远程仓库提交完成后的窗口里直接有推送按钮点它即可也可以右键 →TortoiseGit→推送(Push)本地分支和远程分支通常保持一致都是master或main远端选origin点击确定。推送成功后刷新Gitee仓库页面就能看到新提交的文件了。5.更新代码pull / fetch多人协作时每天开工第一件事就是拉取最新代码。右键 →TortoiseGit→拉取(Pull)→ 确定。如果只想看看远程有什么更新、暂时不合并到本地用获取(Fetch)对应git fetch。习惯每次开始写代码前先Pull一次写完提交前再Pull一次能避免大部分冲突。6.查看提交日志右键 →TortoiseGit→显示日志(Show log)。日志窗口的信息很全上半部分是提交列表时间、作者、提交说明、commit id左下是本次提交涉及的文件右下是该文件的具体改动内容双击某个文件可以打开对比窗口红绿高亮显示每一行的增删。7.版本回滚1撤销未提交的修改右键 →TortoiseGit→还原(Revert)勾选要还原的文件 → 确定。相当于git checkout -- 文件名。2回退到历史版本右键 →TortoiseGit→显示日志在列表中找到想回到的那个版本右键该条目→重置 “master” 到这个版本(Reset “master” to this)弹窗中有三种模式对应命令行的三种resetSoft只移动分支指针改动保留在暂存区Mixed移动指针改动保留在工作区默认较常用Hard彻底丢弃之后的所有改动危险操作前确认选择模式后点击确定。回滚后再去本地文件夹查看之前提交的文件已经恢复到对应版本的状态了。万一Hard回滚过头别慌。用命令行git reflog找到之前的commit id再reset回去就行。8.分支的创建、切换与合并1创建分支右键 →TortoiseGit→创建分支(Create Branch)分支填新分支名例如dev基于选择从哪个版本创建默认是当前HEAD勾选切换到新分支可以创建后直接切过去确定。2切换分支右键 →TortoiseGit→切换/检出(Switch/Checkout)在下拉框中选择目标分支 → 确定。切换后文件夹里的文件内容会立刻变成该分支的版本。3合并分支假设要把dev合并到master先切换到master分支右键 →TortoiseGit→合并(Merge)来源选择分支→dev确定。合并后如果没有冲突直接推送即可有冲突则参考下一节。9.解决冲突重点冲突产生的原因两个人或同一个人在两台电脑上修改了同一个文件的同一行Git无法判断该保留谁的就会报冲突。1复现一下冲突场景为了演示可以这样制造一次冲突把同一个远程仓库克隆到两个不同的本地目录比如repoA和repoB在repoA中修改测试文件01.txt的第一行提交并推送在repoB中也修改测试文件01.txt的第一行内容不同提交后推送这时repoB会推送失败提示rejected non-fast-forward的错误窗口提示需要先拉取。2拉取后出现冲突在repoB执行 Pull会提示合并冲突冲突文件的图标变成黄色感叹号。同时目录下会多出几个临时文件文件名.BASE.txt两边共同的祖先版本文件名.LOCAL.txt本地版本文件名.REMOTE.txt远程版本。打开冲突文件本身会看到Git插入的冲突标记 HEAD 这是我本地写的内容 这是别人推送到远程的内容 a1b2c3d43解决冲突不要慌右键该文件 →TortoiseGit→编辑冲突(Edit conflicts)会打开TortoiseGitMerge三栏对比窗口左侧Theirs远程/他人的版本右侧Mine本地/我的版本下方Merged最终合并结果在冲突处右键选择使用这个文本块Use this text block可以选择用他人的、用自己的或两者都保留也可以直接在下方合并结果区手动编辑成想要的样子。4标记为已解决改完保存右键文件 →TortoiseGit→解决(Resolved / Mark as resolved)几个.BASE.LOCAL.REMOTE临时文件会自动清理。最后正常执行提交、推送即可。解决冲突的原则搞不清对方为什么这么改的时候先去问一下别自作主张删掉别人的代码。10.忽略文件右键需要忽略的文件 →TortoiseGit→删除并添加到忽略列表(Delete and add to ignore list)可以选择忽略这个文件只忽略该文件*忽略.后缀忽略所有同类型文件作用范围可选在版本库根目录或仅在此目录。操作后会自动生成/更新.gitignore文件。也可以直接手动新建、编辑.gitignore写法参考本文第二节第8小节。.gitignore文件本身是需要提交到仓库的这样团队成员共用一套忽略规则。11.设置外部比较工具Beyond CompareTortoiseGit自带的TortoiseGitMerge够用但如果习惯Beyond Compare可以替换TortoiseGit设置→外部程序→差异查看器选择外部程序填入路径按实际安装位置修改C:\Program Files\Beyond Compare 4\BCompare.exe %base %mine同理合并工具页面填入C:\Program Files\Beyond Compare 4\BCompare.exe %mine %theirs %base %merged12.其他常用功能右键菜单项对应命令说明差异比较(Diff)git diff查看当前文件与上次提交的差异版本分支图(Revision graph)—图形化展示整个分支走向贮藏更改(Stash changes)git stash临时保存工作现场贮藏列表(Stash list)git stash list查看并恢复贮藏创建标签(Create Tag)git tag打版本标签清理(Clean up)git clean清除未跟踪的文件同步(Sync)—一个窗口里完成pull/push/fetch追溯(Blame)git blame查看每一行代码是谁、什么时候写的追溯(Blame)这个功能在排查问题时很好用能直接定位到某行代码的提交人和提交时间找相关同事确认改动原因效率很高。五、常见问题1推送时报rejected - non-fast-forward远程有你本地没有的提交。先 Pull 拉取合并有冲突就解决冲突再 Push。不要直接用push -f强推那会覆盖别人的提交。2推送时报Permission denied (publickey)SSH配置问题。参考第一章第四节第9小节排查确认远程地址是SSH格式、公钥已正确添加到平台、ssh -T gitgitee.com能验证通过。3TortoiseGit图标不显示重启资源管理器检查TortoiseGit设置 → 图标覆盖 → 状态缓存改为默认Windows的图标覆盖数量有上限15个如果同时装了OneDrive、坚果云等可能挤占了名额。可在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers中把不需要的项重命名前面加zz让TortoiseGit排到前面。4提交时中文乱码TortoiseGit设置 → Git → 编辑本地.git/config添加[gui] encoding utf-8 [i18n] commitencoding utf-8 logoutputencoding utf-85克隆速度极慢GitHub优先使用Gitee或用Gitee的导入仓库功能中转配置代理假设本地代理端口7890gitconfig--globalhttp.proxy http://127.0.0.1:7890gitconfig--globalhttps.proxy http://127.0.0.1:7890# 取消代理gitconfig--global--unsethttp.proxygitconfig--global--unsethttps.proxy6误删了分支/提交命令行执行git reflog找到对应的commit id然后git reset --hard id或git branch 分支名 id恢复。总结几点个人经验git status和git log多敲不确定状态时先看清楚再操作reset --hard之前先想三秒实在回滚错了就用git reflog找回来分支不要吝啬新功能、试验性改动都开新分支主分支保持随时可用提交说明认真写三个月后回来看日志你会感谢当时的自己图形界面提效但命令行必须能看懂因为出问题时的解决方案基本都是命令行的。教程中涉及的软件均可从官网下载Git官网、TortoiseGit官网、阿里镜像Git。参考文章TortoiseGit-使用教程图文详细版Git教程 SSH keys配置Git详细安装教程gitee上传代码生成SSH公钥
返回列表