git
git的三个区:
-
工作区,可用
ls
指令查看(当前文件的内容); -
暂存区,可用
git ls-files --stage
查看(add之后git会生成一个序列号把当前文件的状态保存并记录起来,放到暂存区,暂存区储存的格式就是<文件模式代码>
<文件的SHA-1哈希值(序列号)>
<该文件的暂存号>
<原始文件名>
) -
版本库,可用
find 目录 -type f
查看(commit之后会将文件提交到版本库,产生版本快照,可以通过敲命令回溯到对应版本)
也就是说,
-
当我们只在工作区进行编辑的时候(不使用add指令),内容是没有保障的,只能在当前的基础上修改,出现错误后需要重新定位查找,然后修改覆盖。
-
当使用add指令将文件提交到暂存区之后,git会进行两步操作。
- 首先是给每个文件生成一个SHA-1哈希值,然后把文件的信息添加到暂存区
- 对暂存区进行快照,将暂存区的索引和对应文件的完整内容添加到版本库的objects文件中
-
使用commit指令后,才算真正实现了一个版本的管理。这时候版本库中有两个文件,一个是tree树对象,一个是commit对象
git另一种对象为blob对象,是用于存储文件内容的对象,当我们用
git cat-file -t 序列号
对暂存区的文件进行文件类型查询时,显示的结果就是blob
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ezpr1haC-1655541138817)(C:\Users\19120\AppData\Roaming\Typora\typora-user-images\image-20220617172253156.png)]
-
修改文件并add添加到暂存区时,暂存区中会生产新的SHA-1哈希值作为版本号覆盖旧的对应文件(发生了修改的),但是在版本库中,改变了的文件会生成一个新的blob对象来存储,而非覆盖,这样可以方便回溯任意版本。
-
第二次commit提交时,版本库中也是新增了两个对象,只是内容不同:树对象中将改变过后的文件进行更新,commit对象中多了一个指向前一个版本的commit对象的索引。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFRFeA90-1655541138817)(C:\Users\19120\AppData\Roaming\Typora\typora-user-images\image-20220617173601730.png)]
这里是简单总结,如果觉得讲的不清楚想看详细的内容,推荐阅读这篇文章Git学习笔记一:Git仓库结构及版本管理流程 (qq.com)
git分支
分支的本质就是指针,有了分支我们可以随心所欲的写自己的idea,如果确认可行之后,再将他合并到主分支上;不可行也不会影响原本的代码。
-
创建分支:
git branch 分支名
,git init初始化仓库时默认创建并处于master分支 -
切换分支:
git checkout 分支名(已创建)
-
创建并切换到新分支:
git checkout -b 分支名
-
查看当前分支:
cat .git/HEAD
-
查看分支下的文件:
git show-ref 分支名
-
从当前分支切换到另一个分支,但是当前内容未完成,并不想add增添新版本,
git stash
将工作区和暂存区内容一起存储到git栈中,这样切换分支很安全(不会丢失当前工作的内容)。流程:git stash(存储到git栈) -> git stash list(用于获取git栈上的情况,得到存储栈的编号,假设为stash@{0}) -> git checkout master(切换分支) -> 在master分支上完成修改、add、commit -> git checkout branch(切换回原分支) -> git stash apply tash@{0}(从栈中取出数据) -> 完成修改、add、commit -> git stash drop stash@{0}(丢弃原栈中的内容)
$ git stash # 把当前分支branch的工作区和暂存区保存到git栈上 $ git stash list # 查看当前git栈上的情况 $ git checkout master # 切换到master分支 $ echo 'back' > test.txt # 在master上开发,修改,提交 $ git add test.txt $ git commit -m '1 commit in master' $ git checkout branch # 切回branch分支 $ git stash apply stash@{0} # 取出对应栈的数据,用于恢复当前工作区和暂存区 $ git add test2.txt # 继续完成刚才的工作,然后把最终完成的test2.txt提交上去 $ git commit -m '2 commit in branch' $ git stash drop stash@{0} # 此时确定栈上数据不要了,就可以推出栈。 #也可以用git stash pop一步完成取出到删除。
git版本
git就是作为版本管理工具被我们熟知,非常强大,既可以实现版本的回退,也可以实现文件的回退
-
版本回退:
git reset (--mixed) 版本号
mixed为reset的默认方式,可恢复为现有版本,移动过程中HEAD和mater都移动到目标版本号位置。git checkout 版本号
分支不动,只有HEAD动,git revert 版本号
生成一个新的版本取代当前版本,不包含当前版本需要丢弃的内容,master和HEAD都移动到新版本。
-
git reset 回退版本的三种程度,由方式决定:
-
只更改.git(温和,将当前分支移动到想回退的版本id上,HEAD仍指向当前分支,工作区和暂存区不变)
git reset --soft 版本号
-
更改.git,并根据.git还原暂存区(一般,将当前分支移动到想回退的版本id上,HEAD仍指向当前分支,暂存区也改为回退版本,工作区不变)
git reset --mixed 版本号
-
更改.git,并根据.git还原暂存区和工作区(暴力,可能会丢失正在进行的工作。将当前分支移动到想回退的版本id上,HEAD仍指向当前分支,暂存区和工作区都改成回退版本)
git reset --hard 版本号
为了避免完全丢失信息,可以配合前面说的
git stash
一起使用
-
git的常用命令
-
第一次用要添加配置,设置用户信息
git config --global user.name 'xxx'
git config --global user.email 'xxxx@xx.com'
-
git add (. ./ filename )
添加到暂存区 -
git status
查看文件状态(已修改,已暂存,已提交) -
git log
查看日志,将显示所有提交过的版本信息,不包括被删的commit和reset操作git reflog
查看日志,显示所有操作,包括被删、回退的。这里能看到的版本号更多,方便本地恢复错误的操作。git log --oneline --graph --decorate --all
查看分支关系图 -
git commit -m
提交一个新的待办git commit --amend
在当前代办上添加一个新版本 -
git difftool head
查看修改的内容(借助工具)git diff 版本号
查看指定版本与当前版本的区别 -
git pull (--rebase)
从远程仓库拉取(多人开发时,更能顺利push,避免有人提交后仓库为新版本导致push失败) -
git checkout
-
git checkout 分支名
我们经常会用这个命令来切换分支,这时,HEAD和master指针就会移动到目标分支上 -
git checkout 版本号
还可以用checkout命令切换版本,这样操作的话,HEAD指针指向该版本,但是分支指针是不变的!!同时,暂存区也会还原成目标版本的内容,工作区的内容不会强制修改,会在提醒你(并进行)stash或commit指令后还原为目标版本的工作区。这个指令就是类似于
git stash
和git reset --hard
配合的效果 -
git checkout 版本名 文件路径 这个命令会保持HEAD和分支不变,但是回取出目标版本中,该文件的内容部分强行还原工作区和暂存区。若有未完成的工作直接覆盖。
-
-
git merge 合完要删掉的分支
合并分支。这种合并是三元合并,即可以把你在其他分支上的内容以及当前master分支上的内容合并到分出其他分支的那个版本上(可以理解为树干,分成了两个分支,这两个分支可以任意生长),形成新的版本。(就是把这两个分支合到一起再变成主干)有冲突还是要解决才可以。 -
git rebase 要留下的分支
合并分支。和merge不同的是,rebase在合并过程中,会将要留下的分支L的版本和要删除的分支D中的每个版本做diff,把结果变成下一个版本,直到D分支上的版本都被diff完,这样就把D分支变到了L分支上。再用
git merge develop
做一次快进合并,就算完成了。 -
git review (分支名)
上传代码,供评审 -
git push
上传到远程仓库 -
git config --list
查看配置git config --system
查看系统配置,所有git账户git config --global
查看全局配置,一个账户git config --local
项目配置,只能在项目目录下使用,读取.git/config
-
git config -e
修改配置 -
git config --global alias.xx "命令"
给命令起别名 ,但是记得这个命令里面不要写git 写了git是运行不了的,可以再写一遍相同的别名覆盖 -
git config --global --unset
删除配置