本文精简涵盖了 Git 工作、笔试、面试的重要知识点,旨在为有复习需求的同学提供全方位、无死角的内容,不适合零基础的同学。原创不易,欢迎关注。
Git
一、基础知识
-
集中式版本控制工具:SVN、CVS
-
分布式版本控制工具:Git
-
Git 工作流程图
暂存区可以用来解耦,如果没有暂存区,会造成很多次提交
二、Git 指令
指令 | 功能 |
---|---|
git add 文件名/通配符 | 将文件放入暂存区 |
git ls-files | 查看暂存区中的文件 |
git rm --cached 文件名 | 将该文件取消暂存,之后该文件会变为未跟踪状态 |
git commit -m "注释" | 将所有文件从暂存区提交到仓库(-m 即 message),提交后并不会清除暂存区 |
git status [-s] | 查看所有文件的状态,-s 简略状态(第一列是暂存区状态,第二列是工作区状态) |
git log [--oneline] | 查看提交日志(-oneline 以一行的方式简略输出) |
git reset --soft 版本号 | 回滚版本 |
git reset --hard 版本号 | 回滚版本(常用) |
git reset [--mixed] 版本号 | 回滚版本(可以省略 --mixed ,效果一样) |
git reflog [--oneline] | 所有操作记录 |
touch .gitignore | 创建 .gitignore 以添加要忽略的文件,添加后该文件不会被版本控制(如要 ignore.a 文件,可编辑 *.a ) |
rm 文件名 | 删除单个文件(操作无法撤销) |
rm -rf 目录名 | 用递归的方式删除整个目录(操作无法撤销) |
mv 文件1 文件2 | 将文件1移动到本目录,命名为文件2(可以用来完成重命名操作,如 mv .gitingnore .gitignore ) |
git branch | 查看所有分支 |
git branch 分支名 | 创建分支 |
git merge 待合并分支 | 合并其他分支到当前分支 |
git checkout 分支名 | 切换分支 |
git checkout -b 分支名 | 创建并切换分支 |
git branch -d 分支名 | 删除分支(需要做各种检查) |
git branch -D 分支名 | 强制删除分支 |
git remote | 查看远程仓库 |
git push [-f] [-u] [远端名称 [本地分支名][:远端分支名]] | -f 表示强制覆盖,一般不用-u 推送到远端的同时与远端分支关联如果本地分支已经关联远端分支,则可以简写为 git push |
git branch -vv | 查看本地分支和远端分支的关联 |
三、其他知识
-
文件状态
状态 说明 未跟踪 U 从未被 Git 管理过 新添加 A 第一次被 Git 暂存 未修改 ‘’ add
并commit
后会进入该状态,三个区域统一已修改 M 工作区内容变化 -
三种 reset 方式
-
合并冲突
核心思路:处理文件中有冲突的地方、手动
add
并commit
注意几种特殊情况:
-
先创建
test.txt
,再创建分支dev
,修改dev
中的test.txt
后进行冲突合并时,会发生Fast-forward
合并,此时不会发生冲突,它会直接将目标分支(master
)的指针移动到源分支(dev
)的指针位置(也就是快进),而不会创建新的合并提交。在这种情况下,master
上test.txt
的内容将被dev
分支上的版本覆盖。 -
会产生新的合并提交的情况
-
A 先在本地修改了 file.txt 中的内容,并 add、commit、push;之后 B 也在本地修改了 file.txt 的内容,两个人修改的内容处于同一行,B 也 add、commit 了,此时 B 发现 A 已经在他之前修改过 file.txt 的内容并已经 push 到远程仓库,
- 情况一:如果 B 执意 push 上远程仓库,会报错
- 情况二:B 先将远程仓库中的 file.txt 拉下来,此时拉取会出现冲突,B 将冲突内容修改后再进行 push 则不会报错。之后,如果 A 再从远程仓库中 pull 下来 file.txt,不会报错,因为 A 在之前 push 后到最后 pull 这段时间,没有修改过本地的 file.txt
-
-
忽略文件
通过
.gitignore
文件可以让 git 彻底忽略跟踪指定文件(在 VsCode 中,这些文件会被标记为灰色)例如,系统或软件自动生成的文件,编译产生的结果文件,运行时生成的日志文件、缓存文件、临时文件,涉及文件、密码、密钥等文件,都需要进行忽略
// 忽略 npm 下载的第三方包 node_modules // 忽略分发文件夹 dist // 忽略 VsCode 配置文件 .vscode // 忽略密钥文件 *.pem *.cer // 忽略日志文件 *.log
如果某些需要忽略的文件已经被暂存区跟踪过,可以先从暂存区中移除
-
推送到远程仓库
-
本地配置全局
name
和email
$ git config --global user.name '杨紫瑞' $ git config --global user.email '12777993+yzr-kito@user.noreply.gitee.com'
-
两种不同方式进行远端仓库连接
-
SSH 免密方式(通过 SSH 进行绑定,无需验证 gitee 账号密码)
-
生成
ssh
公钥$ ssh-keygen -t ed25519 -C "Gitee SSH Key"
-
查看公钥
$ cat ~/.ssh/id_ed25519.pub
-
将生成的
ssh
公钥添加至 gitee -
测试连接
$ ssh -T git@gitee.com
-
对接仓库:通过远程仓库的
ssh
,将本地仓库与远程仓库对接(将远程仓库命名为origin
)$ git remote add origin git@gitee.com:yzr-kito/notes.git
-
-
HTTPS 方式(需要验证 gitee 账号密码)
-
对接仓库
$ git remote add origin https://gitee.com/yzr-kito/notes.git
-
输入 gitee 账号密码验证
-
-
-
如果是非空仓库(如远端仓库中有 readme.md 等初始化文件),需要先
pull
才能push
(不 pull 会报错)但直接 pull 也会报错,需要使用**变基(
--rebase
)**进行强制拉取$ git pull --rebase origin master
-
将本地仓库的主分支
master
推送至远程仓库$ git push origin master
-
将本地分支
master
和远端分支master
建立关联(--set-upstream
也可以写成-u
)$ git push --set-upstream origin master:master
-
以后推送只需要
git push
即可(每次修改本地代码之前,先 pull 一下,确保本地代码始终最新) -
克隆远程仓库至本地
$ git clone git@gitee.com:yzr-kito/notes.git [克隆后的本地名称]
-
抓取:将远程仓库中的更新内容(也就是
git log
)都抓取到本地,不会进行合并$ git fetch origin [要抓取的分支,如果不指定,则会抓取所有分支]
-
将远程仓库更新的内容合并到本地
$ git merge origin/master
-
拉取:将远程仓库中的更新拉到本地并合并,等同于
fetch
+merge
$ git pull origin [要抓取的分支,如果不指定,则会抓取所有分支]
-
-
Gitee Pages 服务
如果想用 gitee 的服务器免费部署静态网页,可以使用 Gitee Pages 进行部署