前言
- 我们做项目的时候,经常会遇到一些讨厌的产品经理,让我们来来回回的改需求,这个时候项目占用电脑的内存越来越多,有时改着改着还得让我们回到之前某个版本,真的是烦死了。。。
- 咋子办?版本控制工具帮我忙
- 这个只为我的笔记和 cv 的工具,<>里的内容为变量(可变)
git 简介
git 是什么
- git是一个免费并且开源的分布式版本控制系统
什么是版本控制系统
- 保留文件所有的修改历史记录,可以方便地撤销之前对文件的修改操作
- 例如我们的编辑器,可以使用 ctrl+z 撤销操作一样,git 也可以保留过去的操作,不过编辑器是自动保存,不可控的,而我们的 git 需要进行手动保存
git 安装
提交对象
- git 保存的并不是文件的变化或者差异,而是一系列的不同时刻的文件快照
- 提交操作时 git 会保存一个提交对象,该对象中包含一个指向暂存内容快照的指针、作者姓名、邮箱、父对象指针以及提交输入信息
- 首次提交的对象没有父对象
- 普通的提交有一个父对象
- 多个分支合并的有多个父对象
分支
- git 的分支本质上仅仅是指向提交对象的可变指针
- git 默认分支名:master,它会在每一次的提交中自动前移
- git 的分支 master 并不是一个特殊分支,它和其他的分支完全没有区别,之所以每个分支都是有 master 是
git init命令默认创建,而大部分人又懒得去更改 - HEAD 是一个特殊指针,该指针指向当前所在分支
- HEAD是唯一的
初始化 git
- 初始化创建仓库
- 他会创建出一个隐藏的.git文件夹,所有的操作历史将存入这里
git init
查看
查看当前仓库所在目录的文件状态
git statusgit status -s||git status --short:简化文件状态打印内容
??:为追踪文件A .:已添加到暂存区. M:被修改但是为放入暂存区MM:修改后放入暂存区,又再次被修改M .:被修改后放入暂存区. D:被删除的R .:重命名的
打印日志
git loggit log -p:查看详细信息(包括diff)git log -n:查看最近的n条信息git log --stat:列出所有被修改的文件,以及简略的统计信息git log --pretty:设置打印内容的格式
=oneline:哈希和描述=short:哈希、作者、描述=full:哈希、作者、提交者、描述-fuller:哈希、作者、日期、提交者、提交日期、描述=format:'opt':定制要显示的记录格式(可选多个,空格隔开)
%H:提交对象(commit)的完整哈希字串
%h:提交对象的简短哈希字串
%T:树对象(tree)的完整哈希字串
%t:树对象的简短哈希字串
%P:父对象(parent)的完整哈希字串
%p:父对象的简短哈希字串
%an作者(author)的名字
%ae:作者的电子邮箱地址
%ad:作者修订日期(可以用--data=选项定制格式)
%ar:作者修订日期,按多久以前的方式显示
%cn:提交者(committer)的名字
%ce:提交者的电子邮箱地址
%cd:提交日期
%cr:提交日期,按多久以前的方式显示
%s:提交说明git log --oneline --decorate:查看分支指向 + 哈希git log --oneline --decorate --all --graph:包含了 所有分支的提交,以树形图形式展现
查看历史提交记录
git reflog
追踪文件、放入暂存区
-
git 的工作流程:
-
在工作目录中修改文件
-
暂存文件
-
找暂存区文件,提交更新
- 也就是 我们修改了文件 => 通过 add 将文件放入暂存区 => 通过 commit 将暂存区的文件进行提交,所以我们每次提交都需要 add
-
git add:使文件加入追踪/放入暂存区git add <filename>:添加 filenamegit add <filename1> <filename2> ...:添加 filename1、filename2...git add .:添加全部文件
提交
vim模式- i:插入(插入描述)
- esc:退出状态
- ZZ:保存并推出
vim模式
vim模式解决中文乱码问题(cmder):Win + Alt + P或者 右键顶部 进入设置(setting)environment中添加set LANG=zh_CN.UTF-8
git commit:提交->进入vim模式git commit -m '描述':合并提交和描述,不进入vim模式git commit -a -m '描述':从工作目录提交到暂存区后,直接提交(需要先追踪文件)git commit --amend:
- 上次提交之后没进行其他操作的情况下,修改提交信息
- 修正最近的一次提交与本次提交合并
git diff:查看当前文件的修改(对比工作区与暂存区)git diff --<>||git diff --staged:查看暂存区和提交的差异
配置项相关
git configgit config -l:查看配置项git config --global user.name '<userName>':设置用户名git config --global user.name '<userName>':设置 e-mailgit config --global core.quotepath false:解决中文乱码
删除
git rm <file>:删除git区域中记录的文件,并且不保留在工作目录中git rm --cache file:删除Git仓库中的,保留工作目录中的文件git rm -f(force) file:强制删除(git 防止误操作,修改未提交的文件不能直接 rm,如有需要,强制删除)
移动/重命名文件
git mv <file_from> <file_to>- 相当于
mv file_from file_to/ 直接在工作区修改名字git rm file_fromgit add file_to
分支
- master
- develop
- topic
- develop
创建、删除分支
- 创建出来的分支,并不会改变我们当前所在的位置
- HEAD所指分支无法删除
git branch <branch_name>:创建分支git branch -d <branch_name>:删除分支git branch -D <branch_name>:强制删除分支(从未合并的分支)
切换分支
- 签出指定commit,只会改变HEAD指向,并不会影响分支指向
- 将HEAD指向切换的分支
- 将工作目录恢复成当前分支的快照
git checkout <branch_name>:切换分支到 branch_name 上git checkout -b <branch_name>:简写 = 创建 + 切换
合并分支
- 将目标分支的内容合并到当前分支
- 当master和branch没有形成分叉,依旧是处于一条路径线,当HEAD落后于所要合并的分支,将会形成快速前移
git merge <branch_name>
--no-ff:禁止快速前移(可以commit记录描述为合并操作)--abort:取消合并分支(当合并冲突时)
变基
- 和merge同样都是进行合并操作的
- 将一个分支的内容都移至另一个分支上
- 工作流程
- 首先找到两个分支的共同祖先
- 然后对比当前分支与祖先的历次提交,进行提取相应修改,并保存为临时文件,将当前分支指向目标基底,最后将之前存为临时文件的修改依序应用
- 注意变基后的内容与原来的不是一个(Hash不同)
git rebase <branch_name>
撤销修改
git reset HEAD- 可以用来撤销commit,但实质行为上并不是撤销操作,而是移动HEAD并且带上所指向的分支,重置HEAD及分支
- 即在HEAD之后的提交,因为当前不在任何分支上,就不会出现在工作目录中,起到撤销效果
reset会带上master,checkout不会- 取消暂存
git reset "HEAD^":取消上一次提交(^有n个,就是取消上n条)git reset HEAD~n:取消上n次提交git reset HEAD Hash:回到指定哈希的状态--hard:重置工作目录,丢失暂存(尽量避免使用)--soft:保留工作目录,与原分支差异将放到暂存区--mixed(默认):保留工作目录,并且清空暂存区git checkout -- <file_name>:撤销已暂存文件的修改(未重新暂存)git checkout <Hash>:查看之前的内容(只改变 HEAD,不改变 master)
储存
- 存储暂存区及工作目录修改文件
- 存储:当在一个分支中向暂存区添加内容,切换到另一个分支时,提交commit会带上另一分支中的暂存内容。
git stashgit stash list:打印所有存储内容git stash apply [stashName]:将存储内容重新应用(默认不保留已暂存内容)git stash apply --index:将原暂存依旧以暂存进行取出git stash -u:在上面的基础上带上未追踪文件git stash drop:移除存储
tag标签
- 添加带有说明的标签
git tag v1.0:设置标签(默认在最新的commit提交上)git tag:查看标签git tag v0.1 <Hash>:给指定commit添加标签git tag -a v0.1 -m "描述信息" <Hash>:添加带有说明的标签git show v1.0:查看标签详细信息git tag -d v1.0:删除标签
忽略文件
- .gitignore 文件
#:该行都会被忽略**:表示匹配任意中间目录*:匹配零个或多个任意字符!:忽略指定文件意外的文件或目录[abc]:匹配任意一个在方括号内的字符[0-9]:在这个范围的都可以匹配?:只匹配一个任意字符
远程操作 GitHub
git remote add origin <HTTPS/SSH>:添加远程仓库地址git remote remove origin:删除远程仓库地址git push -u origin <master>:提交远程仓库git clone:克隆项目到本地git pull <远程主机名> <远程分支名>:<本地分支名>:拉取(合并冲突)git fetch origin <master>:<temp>:拉取远程仓库分支到临时分支git checkout -b <branch> origin/<branch>:克隆分支(创建/重置branch到引用的点origin/branch)git push origin :<branch>:删除远程仓库分支git push origin v1.0:推送标签到远程仓库
git push origin --tagsgit push origin :refs/tags/v1.0:删除远程仓库的标签ssh-keygen -t rsa -C "GitHubName":生成ssh密钥
- 在github上找到settings,设置SSH
- 将生成的文件填到对应的位置(生成的信息给到仓库的管理者)
别名
- 有时候觉得常用的命令字母多了点,例如:git checkout
git config --global alias.<co> <checkout>