git特点
直接记录快照,而非差异比较
近乎所有的操作都是本地执行
时刻保持数据完整性
多数操作仅添加数据
文件的三种状态
.git目录
hooks 客户端或服务端的钩子脚本
info 全局性排除文件
logs 日志信息
objects 存储所有的数据内容
refs 存储指向分支的提交对象的指针
config 项目特有的配置选项
description 对仓库的描述信息
HEAD 目前被监测出的分支
index 暂存区信息
区域
工作区
暂存区
版本库
linux命令
clear 清除屏幕
echo “message” 往控制台输出信息
echo “message” > 文件名 生成文件并存储信息
ll 当前目录下的子文件&子目录
find 目录名 目录下的子孙文件&子孙目录
find 目录名 -type f 目录下的子孙文件
rm 文件名 删除文件
mv 更改前文件名 更改后文件名 重命名
cat 文件的Url 查看对应文件的内容
vim 文件的Url
i 进入文件编辑模式
esc -> :
-> q! 不保存强制退出
-> wq 保存退出
-> set mu 设置行号
底层命令
Git对象
git hash-object -w fileUrl
生成一个key(githash值):value(压缩后的文件内容)存到.git/objects/hash前两位/hash剩余位
tree对象
git update-index --add --cacheinfo 100644(文件模式) githash 文件名
往暂存区添加一条记录,让git对象对应上文件名,存到.git/index
write tree
将暂存区内容生成tree对象,生成一个treehash,存到.git/objects/hash前两位/hash剩余位
提交对象
git commit-tree treehash
生成一个提交对象,生成一个commithash,存到.git/objects/hash前两位/hash剩余位
其余
git cat-file -p hash 查询对象内容
git cat-file -t hash 查询对象类型
git ls-files -s 查看暂存区
高层命令
初始化仓库
git init
命令行配别名
git config --global alias.自定义名 git命令(不包含git 多个字母用“”包裹)
新增(修改)文件
git status
git add 文件名
git commit -m “注释”
修改文件
git commit -a -m “注释” (已追踪的文件可一步操作直接提交对象)
删除文件
git rm 文件名
git status
git commit -m “注释”
重命名文件
git mv 更改前文件名 更改后文件名
git status
git commit -m “注释”
查询
git status 查看工作目录中文件的状态 已跟踪 (已提交 已暂存 已修改) 未跟踪
git diff 查看未暂存的修改
git diff --cache 查看未提交的暂存
git log
git log --oneline 查看提交记录
git reflog 查看所有的HEAD变化
分支
分支的本质就是一个提交对象,所有的分支都有机会被HEAD引用,HEAD一个时刻只会指向一个分支,当我们有新的提交的时候,HEAD会携带当前持有的分支往前移动
HEAD指针指向当前分支最新的提交对象,默认指向master,切换分支其实就是让HEAD指向不同的分支
***在切换分支的时候的时候,一定要保持当前的分支是干净的!!!
允许切换分支:
分支上所有的内容处于已提交状态
分支上的内容是初始化创建 还在工作区 处于未跟踪状态
(避免)
分支上的内容是初始化创建 第一次存入暂存区 处于已暂存状态
(避免,此时git为防止内容丢失,会将未提交的内容带到切换后的分支 污染分支内容)
不允许切换分支:
分支上有的内容处于已修改状态 或 非第一次存入暂存区
git branch 查看分支列表
git branch -v 查看分支指向的最新的提交
git branch name 在当前提交对象上创建新的分支
git branch name commithash(版本穿梭时光机) 在指定提交对象上创建新的分支
git checkout name 切换分支
git checkout -b name 在当前提交对象上创建新的分支并切换到新的分支
git branch -d name 删除空的或者已经被合并的分支
git branch -D name 强制删除分支
git log --oneline --decorate --graph --all 查看整个项目的分支图
git merge name 合并分支
快速合并-->不会产生冲突
典型合并-->有机会产生冲突
解决冲突-->打开冲突的文件进行修改后 add commit 成功即合并
git branch --meged 查看哪些分支已经合并到当前分支,删除已合并分支
git branch --no-meged 查看哪些分支还未合并到当前分支,决定是否删除分支
存储
当前未完成工作的分支需要切换到其他分支,避免无谓提交,将其进行存储,实际上存储也是做了一次提交,但可让log不显示此次提交
git stash 将未完成的修改保存到一个栈上
git stash list 查看存储列表
git stash apply 将栈顶的工作内容还原 但不让其出栈
git stash apply 存储名 将指定的工作内容还原 但不让其出栈 存储名可通过git stash list 查看
git stash drop 存储名 删除指定的工作内容
git stash pop 还原并删除栈顶工作内容
后悔药
撤销实质上是重置
git restore <file> (git checkout --filename) 撤销工作区目录的修改 --hard
git restore --staged <file> (git reset HEAD filename)撤销暂存 --mixed
git commit --amend 撤销提交 --soft
内容有错,重新提交
注释写错,后悔药更改日志显示
内容忘记加到暂存区,先 git add 文件名 再 git commit --amend,日志覆盖最新的一次提交
reset三部曲(HEAD)
HEAD~后退一步 reflog查找commithash后退到指定位置
$ git reset --soft HEAD~ 让HEAD指向后退,工作区暂存区内容不变 (用commithash内容重置HEAD内容)
$ git reset --mixed HEAD~ $ git reset HEAD~ HEAD指向后退,暂存区也改变 (用commithash内容重置HEAD内容 重置暂存区)
$ git reset --hard HEAD~ HEAD 暂存区 工作区三个都改变
(用commithash内容重置HEAD内容 重置暂存区 重置工作目录)
路径reset
所有的路径reset都要省略第一步重置HEAD,HEAD本质是指向一个分支,分支的本质是一个提交对象,一个提交对象是一个tree对象的包裹,tree对象是多个git对象的快照,一个git对象对应一个文件,HEAD代表了多个文件的状态,单个文件的reset不能代表HEAD的reset
git reset --mixed commithash filename 只改变暂存区,撤销暂存操作
(用commithash中filename的内容重置暂存区)
git reset --hard commithash类似于git checkout branchname,相同点,都重置了HEAD,暂存区,工作目录。不同点,checkout的HEAD不会带着分支一起移动,checkout对工作区内容安全,不会丢失,reset会强制覆盖工作区内容
git checkout commithash filename 重置暂存区 重置工作目录
git checkout --filename 只动工作目录
打tag
git tag 列出标签
git tag tagname commithash 创建标签 不加hash默认最新提交对象
git checkout tagname 检出标签(HEAD和分支分离)
git checkout -b tagname 检查版本标签并切换到分支
团队协作
1.项目经理初始化远程仓库(github上操作)
2.项目经理创建本地仓库
git remote 别名 仓库地址(https)
初始化git git init
修改用户名 修改邮箱
git add ./ git commit
3.项目经理推送本地仓库到远程仓库
清理windows凭据
git push 别名 分支 (输入用户名 密码;推完之后会附带生成远程跟踪分支)
4.项目经理邀请成员加入协作
5.成员克隆仓库
git clone 仓库地址(在本地生成.git文件 默认为远程仓库配了别名origin,自动生成master本地分支,并且已经跟踪了对应的远程跟踪分支origin/master)
6.成员做出贡献
git add
git commit
git push 别名 分支 (输入用户名 密码;推完之后会附带生成远程跟踪分支)
7.项目经理更新修改
git fetch 别名 (将修改同步到远程分支上)
git merge 远程跟踪分支
本地分支 远程跟踪分支 远程分支
本地分支的数据推送和拉取
拉取数据
git fetch 别名 (将修改同步到远程分支上)
git merge 远程跟踪分支
上传数据
git push 别名 分支
本地分支跟踪远程跟踪分支
1.克隆的时候 自动生成master本地分支,并且已经跟踪了对应的远程跟踪分支(别名/master)
2.在新建分支时,可以指定该分支想要跟踪的远程跟踪分支(git fetch 别名 拉取仓库中远程跟踪分支)
git checkout -b 本地分支名 远程跟踪分支名 & git checkout --track 远程跟踪分支名
git branch -vv 查看设置的所有跟踪分支
3.将一个已经存在的本地分支跟踪一个远程跟踪分支
git branch -u 远程跟踪分支名
本地分支已经跟踪了远程跟踪分支可简化命令
拉取数据 git pull
上传数据 git push