Git 基本使用

📅 2026/7/5 8:44:27
Git 基本使用
学习之前可以先看看这两个Git 工作流程Git 工作区、暂存区和版本库Git 介绍一个免费开源的分布式版本控制系统安装安装 | 官网直接去官网安装即可这里我是 mac 电脑直接用 homebrew 安装就可以brewinstallgitmac 直接打开终端就可以使用了windows 需要通过右键打开 git bash 来使用基础配置gitconfig--globaluser.namexxxgitconfig--globaluser.email xxxexample.com这两个命令用于配置 Git 的提交者身份信息user.name 设置提交记录中显示的用户名user.email 设置提交记录中显示的邮箱加上 --global 表示这套配置对当前电脑用户下的所有 Git 仓库都生效。它们不会用于登录 GitHub也跟 GitHub 账号没关系只是用来标记每次代码提交是谁提交的方便在 GitHub、Gitee、GitLab 等平台上关联提交记录和账号。{% note info %}你填啥都没有问题只是对你提交身份的一个说明你写名字是二狗都没问题{% endnote %}Git 命令创建仓库在一个文件夹(你的项目文件夹)中执行gitinit执行完之后就创建了一个本地 Git 仓库本质上是多了一个隐藏的.git目录这个仓库完全在本机所以不联网也能使用大部分功能比如提交到本地或在回滚之类的。只有推送到远程仓库或从远程仓库拉取代码时才需要联网。克隆仓库gitclone https://github.com/torvalds/linux.git通过这个命令来克隆网络上的一个 Git 项目但是我们通常没有权限直接push到原仓库我们只能推送到自己有权限的远程仓库。Git 文件状态和提交版本创建仓库后仓库中的新文件默认是未被 Git 跟踪的。如果没有通过git add把这些文件加入暂存区那么执行git commit生成新版本时这些文件不会被记录到该版本中。既然文件本身都没有进入版本记录那么它之前的内容状态和修改过程也不会被 Git 保存。{% note warning %}创建 Git 仓库后仓库中的新文件默认处于未跟踪状态。未跟踪文件在没有执行git add之前只是普通文件Git 不会记录它的内容变化如果直接提交这些文件不会进入版本记录。只有当文件被git add加入暂存区并通过git commit提交后Git 才会从该次提交时的文件内容开始进行版本管理之前的修改过程 Git 是不知道的。{% endnote %}跟踪通过下面的命令来跟踪一个文件或者目录gitaddnamegitaddfilename# 将单个文件添加到暂存区gitadd.# 将工作区中的所有修改添加到暂存区取消跟踪如果你不想跟踪这个文件或者目录来你可以用下面的命令gitrmnamegitrm--cachename# 可以将项目保存在目录中只删除跟踪标志{% note info %}git rm name是 从 Git 仓库和本地工作区都删除文件git rm --cached name是 只从 Git 仓库的跟踪记录中删除文件但本地文件还保留。{% endnote %}文件状态修改当你修改完了之后你想把变更放到暂存区那就要再次执行git add也就是说你改动的东西只要没git addGit 就不知道你变更了文件就只会提交你上次git add时的内容gitaddfile-name# 设置缓存状态放入暂存区如果你后悔了不想提交了可以执行gitreset HEADname取消缓存状态从暂存区撤回来不进入下一次提交了暂存区的该文件回退到你上次git commit时的文件版本(你工作区的还是不变还是你改动后的内容)。{% note info %}也就是说即使你中间git add了 5 次但是没提交那这 5 次git add都失效了。但是本地文件还是你改动后的没影响。{% endnote %}提交/取消修改之后你想提交修改的内容就用下面的命令gitcommit-m修改xxx# 提交命令如果你提交之后又不想提交了可以进行撤回gitreset head~--soft# 撤销提交无法撤销第一次查看文件状态gitstatus# 查询文件状态如果想看更细致的文件修改前后的区别可以用下面的命令gitdiff# 查看文件与修改前区别如果想查看之前历史的提交gitlog# 查看日志文件gitlog--pretty# 美化输出可以格式化输出%h 简化哈希# 提交记录的一个哈希值可以通过哈希值找到我们本次的提交%an 作者名字 %ar 修订日期距今 %ad 修订日期 %s 提交说明# 比如gitlog--prettyformat:%h-%an, %ar:%sgitlog--graph# 以图形化形式显现Git 远程仓库我们可以在 GitHub 上自己创建一个仓库也就是远程仓库了链接远程仓库gitremoteaddorigin https://xxx.git# origin 是给远程仓库起的别名一般就叫 origin名字只在本地仓库有效gitremoterename原远程仓库别名 新远程仓库别名gitremote# 查看当前本地仓库配置了哪些远程仓库别名gitremote-v# 如果还想看对应的 URL# 显示如下origin https://github.com/xxx/test.git(fetch)# 从这个远程仓库拉取代码origin https://github.com/xxx/test.git(push)# 向这个远程仓库推送代码推送gitpush origin master# 向 origin 仓库推送 master 分支推送需要认证身份github 无法使用用户名密码认证方式进入官网生成 token然后设置有效期名字仓库权限这里是权限全打开然后生成这样输入用户名你就用用户名密码就用这个 token 就可以了但是这种比较麻烦有更方便的方式通过 SSH 协议生成密钥进行认证用来本机和 GitHub、Gitee、GitLab 建立免密连接首先进入用户的 ssh 目录中cd~/.ssh生成 SSH 密钥ssh-keygen-trsa-b4096-Cxxxqq.com-t rsa是生成密钥的算法-b 4096选择生成的大小-C xxxqq.com推荐写个人邮箱执行后要求输入密钥名比如mac-git然后设置一个密码查看并复制密钥文件内容复制公钥的内容进入 github 的 SSH and GPG keys 页面添加密钥完整的复制过来就可以包括结尾的邮箱和开头的 ssh-rsa这样之后我们克隆项目就可以不用再验证身份之类的了之后我们再克隆就git clone SSH链接就可以了Git 分支Git 每次提交都会生成一个 commit 对象这个对象有唯一的哈希值。通过这个 commit 对象可以找到本次提交对应的项目快照也就能恢复到这个版本的代码。每个 commit 对象还会记录它的上一个提交对象也就是 parent所以多个提交对象会通过 parent 串成一条历史链。分支本质上是一个只记录“最新一次 commit 哈希值”的指针文件。Git 通过这个最新提交再沿着每个 commit 的 parent 往前找就能找到这个分支的完整提交历史。HEAD 指向我们当前所在的分支(你不能一次操作两个分支吧)而当前分支再指向某个最新的 commit 对象。master/main保存线上稳定版本develop用于日常功能集成开发新功能时从develop拉出feature分支来完整不同的功能模块完成后合并回develop准备发布时从develop拉出release分支进行测试和修复完成后合并到master/main并打 tag线上版本出现紧急问题时从master/main拉出hotfix分支修复修完后同时合并回master/main和develop。使用分支我们可以通过下面的指令看到当前的分支gitloggitstatus也可以通过这个命令查看所有的分支gitbranch--list前面带*的就是当前分支想创建、切换分支就可以用下面的命令gitbranch 新分支名gitcheckout-b新分支名# 创建并切换到新分支gitcheckout 分支名# 切换分支显示提交日志gitlog--allgitlog--all--graph# 显示更加直观的日志分支合并gitmerge 融合分支# 合并分支也就是把当前分支和某个分支文件内容合并如果要合并的两个分支都修改了同一个地方就会报错因为不知道要保留哪一个gitstatus# 查看哪里有冲突比如这里说都修改了test_file进入到冲突文件中, 选择一个分支的内容保留下来, 保存退出这里它会给你标注上冲突的地方我们只需要选择某一块保留的就可以比如想留下来feature2分支的内容就是把红色标注的地方都去掉然后保存即可冲突解决后就可以提交了gitadd文件名gitcommit-m提交描述gitlog--all--graph查看合并状态推送、拉取、跟踪远程分支gitpush 仓库名 分支名# 比如gitpush origin master但是每次都要写仓库名和分支名也挺麻烦我们可以gitpush-u仓库名 分支名这样第一次使用-u指定推送目标后后面可以直接使用git push就等价于git push origin mastergitpush-uorigin master# 第一次推送gitpush# 第二次推送如果想拉取远程仓库的分支gitfetch# 拉取分支远程分支拉取到本地后并不一定会自动变成本地分支。它通常会先以origin/分支名的形式存在表示“远程分支在本地的跟踪记录”。如果想基于远程分支创建一个本地分支可以先通过git branch -r查看远程分支名再创建对应的本地分支。# 查看远程分支gitbranch-r# 查看本地分支和远程分支gitbranch-a# 基于远程分支创建本地分支gitcheckout-b本地分支名 远程分支名# 自动创建本地分支并跟踪对应远程分支gitcheckout--track远程分支名# 比如gitcheckout-bdev origin/dev# 或者gitcheckout--trackorigin/dev贮藏功能用于功能写一半了但是我们又需要切到别的分支上去修改内容这个时候也不适合去提交来保持我们的修改我们就可以贮藏一下我们当前分支修改的内容然后再去切换分支gitstash# 等价于gitstash push当前分支修改到一半想要切换分支不允许可以用此命令将当前分支修改的东西储藏起来再切换gitstash apply# 恢复暂存内容stash 记录仍保留切换回来后恢复之前存储的内容gitstash list文件可以多次存储所以我们可以查看存储记录列表可以通过gitstash apply stash{记录号}恢复到指定记录gitstash pop恢复并删除最近一次记录gitstash drop stash{记录号}删除指定记录重置、变基重置撤销我们某次 commit 的操作gitreset--softHEAD~{% note waning %}注意HEAD 就是当前提交所以git reset --soft HEAD基本没什么效果。因为本来就在当前提交上没有往回退。所以一般用HEAD~或者HEAD~数字{% endnote %}HEAD当前提交。HEAD~当前提交的上一个提交。HEAD~2从当前提交往前数两个提交不是简单说“倒数第二次提交”。--soft只回退提交记录代码修改还保留在暂存区相当于取消了 commit但没有取消 git add。默认不加参数时相当于--mixed例如git reset HEAD~会回退提交记录并取消暂存状态修改内容还在工作区。--hard回退提交记录同时重置暂存区和工作区代码修改也会被丢弃彻底回到目标提交的状态不推荐随便用。变基还不太懂这个如果用到再学习gitcheckout Bgitrebase A上述命令将 B 分支的修改移动到 A 分支{% note danger %}注意其他人在远程分支二次开发时慎用变基{% endnote %}