Git 基本使用
学习之前可以先看看这两个
Git 介绍
一个免费开源的分布式版本控制系统
安装
直接去官网安装即可,这里我是 mac 电脑,直接用 homebrew 安装就可以
brew install git
mac 直接打开终端就可以使用了,windows 需要通过右键打开 git bash 来使用
基础配置
git config --global user.name "xxx"
git config --global user.email xxx@example.com
这两个命令用于配置 Git 的提交者身份信息:user.name 设置提交记录中显示的用户名,user.email 设置提交记录中显示的邮箱;加上 --global 表示这套配置对当前电脑用户下的所有 Git 仓库都生效。它们不会用于登录 GitHub,也跟 GitHub 账号没关系,只是用来标记每次代码提交是谁提交的,方便在 GitHub、Gitee、GitLab 等平台上关联提交记录和账号。
{% note info %}
你填啥都没有问题,只是对你提交身份的一个说明,你写名字是二狗都没问题
{% endnote %}
Git 命令
创建仓库
在一个文件夹(你的项目文件夹)中执行
git init
执行完之后就创建了一个本地 Git 仓库,本质上是多了一个隐藏的 .git 目录,这个仓库完全在本机,所以不联网也能使用大部分功能,比如提交到本地或在回滚之类的。只有推送到远程仓库或从远程仓库拉取代码时,才需要联网。
克隆仓库
git clone 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 %}
跟踪
通过下面的命令来跟踪一个文件或者目录
git add <name>
git add filename # 将单个文件添加到暂存区
git add . # 将工作区中的所有修改添加到暂存区
取消跟踪
如果你不想跟踪这个文件或者目录来,你可以用下面的命令
git rm <name>
git rm --cache <name> # 可以将项目保存在目录中,只删除跟踪标志
{% note info %}git rm <name> 是 从 Git 仓库和本地工作区都删除文件;git rm --cached <name> 是 只从 Git 仓库的跟踪记录中删除文件,但本地文件还保留。
{% endnote %}
文件状态修改
当你修改完了之后,你想把变更放到暂存区,那就要再次执行 git add,也就是说你改动的东西只要没 git add,Git 就不知道你变更了文件,就只会提交你上次 git add 时的内容
git add <file-name> # 设置缓存状态,放入暂存区
如果你后悔了,不想提交了,可以执行
git reset HEAD <name>
取消缓存状态,从暂存区撤回来,不进入下一次提交了,暂存区的该文件回退到你上次 git commit 时的文件版本(你工作区的还是不变,还是你改动后的内容)。
{% note info %}
也就是说即使你中间 git add 了 5 次,但是没提交,那这 5 次 git add 都失效了。但是本地文件还是你改动后的,没影响。
{% endnote %}
提交/取消修改
之后你想提交修改的内容,就用下面的命令
git commit -m '修改xxx' # 提交命令
如果你提交之后又不想提交了,可以进行撤回
git reset head~ --soft # 撤销提交(无法撤销第一次)
查看文件状态
git status # 查询文件状态
如果想看更细致的,文件修改前后的区别,可以用下面的命令
git diff # 查看文件与修改前区别
如果想查看之前历史的提交
git log # 查看日志文件
git log --pretty # 美化输出,可以格式化输出
%h 简化哈希 # 提交记录的一个哈希值,可以通过哈希值找到我们本次的提交
%an 作者名字
%ar 修订日期(距今)
%ad 修订日期
%s 提交说明
# 比如
git log --pretty=format:"%h-%an, %ar:%s"
git log --graph # 以图形化形式显现
Git 远程仓库
我们可以在 GitHub 上自己创建一个仓库,也就是远程仓库了
链接远程仓库
git remote add origin https://xxx.git # origin 是给远程仓库起的别名,一般就叫 origin,名字只在本地仓库有效
git remote rename 原远程仓库别名 新远程仓库别名
git remote # 查看当前本地仓库配置了哪些远程仓库别名
git remote -v # 如果还想看对应的 URL
# 显示如下
origin https://github.com/xxx/test.git (fetch) # 从这个远程仓库拉取代码
origin https://github.com/xxx/test.git (push) # 向这个远程仓库推送代码
推送
git push origin master # 向 origin 仓库推送 master 分支
推送需要认证身份,github 无法使用用户名密码认证方式,进入官网生成 token
然后设置有效期,名字,仓库权限,这里是权限全打开,然后生成
这样输入用户名你就用用户名,密码就用这个 token 就可以了,但是这种比较麻烦,有更方便的方式
通过 SSH 协议生成密钥进行认证
- 用来本机和 GitHub、Gitee、GitLab 建立免密连接
首先进入用户的 ssh 目录中
cd ~/.ssh
生成 SSH 密钥
ssh-keygen -t rsa -b 4096 -C "xxx@qq.com"
-t rsa是生成密钥的算法-b 4096选择生成的大小-C "xxx@qq.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。
使用分支
我们可以通过下面的指令看到当前的分支
git log
git status
也可以通过这个命令查看所有的分支
git branch --list
前面带 * 的就是当前分支
想创建、切换分支就可以用下面的命令
git branch 新分支名
git checkout -b 新分支名 # 创建并切换到新分支
git checkout 分支名 # 切换分支
显示提交日志
git log --all
git log --all --graph # 显示更加直观的日志
分支合并
git merge 融合分支 # 合并分支
也就是把当前分支和某个分支文件内容合并
如果要合并的两个分支都修改了同一个地方就会报错,因为不知道要保留哪一个
git status # 查看哪里有冲突
比如这里说都修改了 test_file
进入到冲突文件中, 选择一个分支的内容保留下来, 保存退出
这里它会给你标注上冲突的地方,我们只需要选择某一块保留的就可以,比如想留下来 feature2 分支的内容,就是把红色标注的地方都去掉,然后保存即可
冲突解决后就可以提交了
git add 文件名
git commit -m '提交描述'
git log --all --graph 查看合并状态
推送、拉取、跟踪远程分支
git push 仓库名 分支名
# 比如
git push origin master
但是每次都要写仓库名和分支名也挺麻烦,我们可以
git push -u 仓库名 分支名
这样第一次使用 -u 指定推送目标后,后面可以直接使用 git push,就等价于 git push origin master
git push -u origin master # 第一次推送
git push # 第二次推送
如果想拉取远程仓库的分支
git fetch # 拉取分支
远程分支拉取到本地后,并不一定会自动变成本地分支。它通常会先以 origin/分支名 的形式存在,表示“远程分支在本地的跟踪记录”。如果想基于远程分支创建一个本地分支,可以先通过 git branch -r 查看远程分支名,再创建对应的本地分支。
# 查看远程分支
git branch -r
# 查看本地分支和远程分支
git branch -a
# 基于远程分支创建本地分支
git checkout -b 本地分支名 远程分支名
# 自动创建本地分支,并跟踪对应远程分支
git checkout --track 远程分支名
# 比如
git checkout -b dev origin/dev
# 或者
git checkout --track origin/dev
贮藏功能
用于功能写一半了,但是我们又需要切到别的分支上去修改内容,这个时候也不适合去提交来保持我们的修改,我们就可以贮藏一下我们当前分支修改的内容,然后再去切换分支
git stash
# 等价于
git stash push
当前分支修改到一半想要切换分支不允许,可以用此命令将当前分支修改的东西储藏起来再切换
git stash apply # 恢复暂存内容,stash 记录仍保留
切换回来后恢复之前存储的内容
git stash list
文件可以多次存储,所以我们可以查看存储记录列表,可以通过
git stash apply stash@{记录号}
恢复到指定记录
git stash pop
恢复并删除最近一次记录
git stash drop @stash{记录号}
删除指定记录
重置、变基
重置
撤销我们某次 commit 的操作
git reset --soft HEAD~
{% note waning %}
注意:HEAD 就是当前提交,所以 git reset --soft HEAD 基本没什么效果。因为本来就在当前提交上,没有往回退。所以一般用 HEAD~ 或者 HEAD~数字
{% endnote %}
- HEAD:当前提交。
- HEAD~:当前提交的上一个提交。
- HEAD~2:从当前提交往前数两个提交,不是简单说“倒数第二次提交”。
--soft:只回退提交记录,代码修改还保留在暂存区,相当于取消了 commit,但没有取消 git add。- 默认不加参数时,相当于
--mixed,例如git reset HEAD~,会回退提交记录,并取消暂存状态,修改内容还在工作区。 --hard:回退提交记录,同时重置暂存区和工作区,代码修改也会被丢弃,彻底回到目标提交的状态,不推荐随便用。
变基
还不太懂这个,如果用到再学习
git checkout B
git rebase A
上述命令将 B 分支的修改移动到 A 分支
{% note danger %}
注意其他人在远程分支二次开发时,慎用变基
{% endnote %}
更多推荐




所有评论(0)