Git
- 分布式的版本控制系统,SVN为集中式的版本控制系统
- 下载地址https://git-scm.com/
Git 基础
- 直接记录快照而非比较差异
- 近乎所有的操作都在本地执行
- 时刻保障数据的完整性
- 多数操作仅添加数据
- 文件的三种状态
- 已修改(modified)
- 已暂存(staged)
- 已提交(committed)
Git文件状态
- Git文件
- 已被版本库管理的文件
- 已修改
- 在工作目录中修改Git文件
- 已暂存
- 对已修改的文件执行Git缓存操作,将文件存入暂存区
- 已提交
- 将已暂存的文件执行Git提交操作,将文件存入版本库
Git基本命令
-
git init 初始化版本库,将该文件夹纳入版本库进行管理,这条命令会在文件夹中生成隐藏.git文件
-
git add 将文件纳入git管理,将文件纳入管理后windows下显示如下
git add text.txt
-
git rm --cached 将add到git的文件进行移除
git rm --cached test.txt
-
git status 查看git状态,如下图所示,将test.txt文件添加后,查看状态,显示有add的新文件
git status
-
git log 查看提交日志包括版本号及其他
git的提交id(commit id) 是一个摘要值,这个摘要值实际上是个sha1计算出来的,不可逆
-
对于user.name 和user.email来说,有三个地方可以设置
- config文件夹(几乎不会使用) git config --system
- ~/.gitconfig(很常用) git config --global
- 针对于特定项目,.git/config文件中 git config --local
- 删除使用git config --local --unset xxx
-
git rm xxx 删除文件,可以通过git reset HEAD xxx + git checkout – xxx两步来进行恢复,当未使用git rm而使用rm直接删除时可以使用git checkout – xxx 直接恢复
- git rm : 删除了一个文件,将删除的文件纳入暂存区(stage),所以恢复时先将文件恢复到工作区,再用checkout将修改丢弃
- rm: 将文件删除,并未纳入暂存区(stage),
git rm test2.txt git reset HEAD test2.txt 将文件从缓存区恢复到工作区 git checkout -- test2.txt 将修改丢弃 // 当使用rm命令直接删除时 git checkout -- test2.txt
-
git mv 原名称 新名称 可以给文件重新命名,git mv 与系统的mv之间的关系相当于 git rm 与rm的关系
-
git commit --amend -m ‘修正消息’ 修改上次提交的备注,与上次的提交是一次提交
-
git commit -am ‘xxxxxxx’ 将git add . 与git commit -m ‘xxxx’ 合二为一的命令
-
git log
-
-p 展开显示每次提交的内容差异
-
git log --graph --abbrev-commit 显示提交图形并以简略的方式显示日志
-
-n 仅显示最近的n次更新
-
–stat 仅显示简要的增改行数统计
-
–pretty=oneline 简单的方式显示提交
-
–pretty=format:“%h - % an,%ar :%s” 以相应的格式进行显示
-
-
git blame xxx 显示上次文件的修改者
.gitignore
- 项目本身自带的设置文件不应该被提交到仓库
- 创建文件.gitignore,凡是与该文件中的文件匹配的,就会被git所忽略.该文件支持正则以及通配符表达式
- *.a 忽略所有.a结尾的文件
- !lib.a 但lib.a除外
- /TODO 仅仅忽略根目录下的TODO文件,不包括subdir/TODO
- build/ 忽略build/目录下的所有文件
- doc/*.txt 会忽略doc/notes.txt文件但不包括doc/server/arch.txt
- /# 代表注释
分支
-
git branch 查看所有分支,*代表目前所处的分支
-
git branch xxx 创建新的分支,xxx代表分支名
-
git checkout 切换的分支名 切换分支
分支的重要操作
-
git删除分支 git branch -d xxx ,xxx代表分支名称,不能删除你当前所处的分支,当你所删除的分支有新增加的文件或者修改时git会提示不能删除,需要使用 git branch -D xxx
-
git checkout -b xxx 创建新的分支并切换到新的分支上
-
git merge xxx 将xxx分支合并到当前分支
-
git branch -v 显示所有分支的最近一次修改
-
git branch -v oldname newname 分支改名
-
git stash 将分支临时保存
-
git stash list 展示临时保存的list
-
git stash pop 将临时保存的状态取出,将原来保存的删除
-
git stash apply (stash 内容并不删除)
-
git stash apply stash@{0} 恢复指定位置的现场
-
git stash drop stash@{0} 删除指定位置的现场
分支的本质
-
一个commit对象链:一条工作记录线, commit 提交对象会再多包含一个指向上次 commit 提交对象的指针。Git中默认的都会有一个分支,这个分支叫做 master,若干次提交之后,实际上有一个最新的 commit 对象,以及指向这个对象的master分支,伴随着每次提交,master 对象要做的就是不断指向新 commit 对象。
-
分支就是指向提交的某个节点
-
HEAD指向的是当前分支,切换分支时HEAD指向到你切换的分支
-
master指向提交,指向分支的最近一次提交,当切换到新建的分支时,新的分支也指向当前最近的一次提交,同时HEAD指向当前所处的分支
分支的合并
-
如果可能,合并分支时Git会使用fast-forward模式,在日志中不会增加新的提交id
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IrMxoQod-1632667613139)(D:\下载\学习\笔记\git学习\fast-forward模式.png)]
-
在这种模式下,删除分支时会丢掉分支信息
-
合并时加上-- no-ff参数会禁用fast-forward,这样会多出一个commit id
-
git merge --no-ff xxx,当提交上述命令时出现如下图所示,需要提交新的备注信息,表明这个合并触发了一次新的提交
-
-
查看log
- git log - -graph 以图形化的方式查看log
版本回退
-
回退到上一版本
-
git reset --hard HEAD^(回退两个版本git reset --hard HEAD^,回退几个可以写几个),想返回上一版本只需要属于这个版本的前几个commitid既可以返回,只能往前走
-
git reset --hard HEAD~1,回退几个版本数字写几
-
git reset --hard commit_id,不用写全写前面四五个就可以
-
-
返回到某一版本
-
git reflog,查看所有的操作日志(git log是查看的是提交日志),可以根据操作日志查询出的commitid来使用git reset --hard commit_id 来进行版本的切换,前后都可以
-
checkout 和reset的区别
- git checkout – xxx xxx代表文件名,丢弃掉当前工作空间该文件的修改,使之与上一次暂存区的内容保持一致
-
git reset HEAD xxx ,xxx代表文件名,作用是:将之前添加到暂存区的内容从暂存区移到工作区
-
git branch commitid 按照某一个提交版本创建一个分支
标签
Git 标签
- 新建标签,标签有两种:轻量级标签(lightweight) 与带有附注的标签(annotated)
- 创建一个轻量级标签
- git tag v1.0.1
- 创建一个带有附注的标签
- git tag -a v1.0.2 -m ‘release version’
- 删除标签
- git tag -d tag_name
- 查看所有标签
- git tag
- 查找标签
- git tag -l ‘名称’ (可以使用统配符)
- 删除标签
- git tag -d name 删除name标签
标签并不是与分支挂钩,不管哪个分支,不会随着分支的转移而变化
diff(差异性)
-
diff xxx1 xxx2
-
diff -u a b
-
git diff 暂存区与工作区文件的差别
-
git diff HEAD 比较工作区与提交的最近的那次提交比较
-
git diff --cached commit_id 比较暂存区与特定的commit_id的比较,没有commit_id即为比较最新的提交与暂存区的差别