前言
When we learn a new technology,we need to know what it is,why we learn it and how to use it best
git底层命令
公共命令
- git cat-file -p hash 拿对应哈希对象的内容
- git cat-file -t hash 拿对应哈希对象的类型
- git ls-files -s 查看暂存区的状态
git对象(blob对象)
git hash-object -w fileUrl 生产key(hash值)-value(压缩过的文件内容)键值对 并存在.git/objects、
tree对象
-
git update-index --add -cacheinfo 10064 hash 文件名 往暂存区添加一条记录(让git对象对应上文件名) ./git/index
-
git write-tree 生成树对象
commit对象
echo “first commit” | git commit-tree treehash ./git/object
查看暂存区
git ls-files -s
git高层命令(CRUD)
- git --version 查看git版本
- git config --global user.name “name” 初始化用户名
- git config --global user.email “email” 初始化邮箱
- git init 初始化仓库
- git status 查看文件的状态
- git diff 查看哪些修改还没有暂存
- git diff --staged 查看哪些修改已经被暂存了 还没有修改
- git log --oneline 查看提交的历史记录
- git add ./ 将修改提交到暂存区
- git commit (-a) (-m “提交信息”) 将暂存区提交到版本库
git高层命令(分支)
- 分支的本质就是一个提交对象
- HEAD是一个指针,它默认指向master分支,切换分支时就是让HEAD指向不同的分支。每一次有新的提交,HEAD指针就会带着分支一起向前走
- git branch 显示分支列表
- git branch -d 分支名 删除空的分支和已经被合并的分支
- git branch -D 分支名 强制删除分支(自己不能删自己)
- git branch -v 查看当前分支指向的提交对象
- git branch 分支名 在当前提交对象创建分支
- git branch 分支名 commit哈希值 在指定提交对象创建分支(版本穿梭)
- git checkout 分支名 切换分支
- git merge 分支名 快进合并/并行合并
git高层命令(撤销重置)
1. 工作区
git checkout – 撤销工作区里的文件修改
2. 暂存区
git reset HEAD 撤销暂存区里的文件修改
3. 版本库
重写提交注释 git commit -amend
git高层命令(其他)
- git log --oneline --decorate --graph --all 查看项目分叉历史记录
- git config --global alias.别名 ”git后面的命令“ 为git命令配别名
- git config --global unset 配置key 删除全局配置信息
- git rebase
- git reset 哈希/路径
- –soft HEAD~/提交对象哈希 HEAD带着分支一起动 ( -amend)
- –mixed HEAD~/提交对象哈希值 HEAD带着分支一起动/暂存区也变化 (git reset HEAD )
- –hard HEAD~/ HEAD带着分支一起动/暂存区也变化/工作区也变化 (git checkout)
- HEAD filename 撤销文件操作
- git cherry-pick
- git reflog 查看HEAD节点的变化记录
- git restore
- git switch
其他
- 每一次切换分支时,工作目录一定要干净(处于已提交状态,可以用git status查看)
情景
- 紧急情况 急修修复bug
- 工作情况下 修复平常bug
- 长期分支(master,develop)
- 特性分支(topic)
git checkout vs git reset --hard
- checkout只动HEAD,HEAD动HEAD和带着分支一起走
- checkout对工作目录是安全的,而–hard是强制覆盖工作目录的(有丢失数据的风险)
tag(Head不动)相关操作
- git tag
- git tag 标签名 (创建标签)
- git show 标签名 (查看标签)
- git tag -d 标签名 (删除标签)
- git checkout 标签名 (切换分支)
数据恢复
- git reflog 追踪最后一次提交的哈希
- 利用该哈希创建新的分支 recovery-branch
- 少用硬重置,多用分支
特点
- 直接记录快照,而非差异比较
- 近乎所有的操作都是本地执行
- 时刻保持数据完整性
- 多数操作仅添加数据
- 文件有三种状态(已暂存,已修改,已提交)
远程合作开发
-
windows凭据管理器
-
git remote -v 查看本地仓库远程的仓库情况
-
git remote add 仓库别名 hostUrl
-
git config user.name 用户信息 配置该仓库用户信息
-
git config user.email 用户邮箱 配置该仓库用户信息
-
git push 仓库别名 分支名
-
git push -u 仓库别名 分支名
-
git fetch 远程仓库名称 将数据从远程分支拉到远程跟踪分支
-
git pull 更新本地分支与远程分支同步
-
git clone 仓库地址
-
git checkout --track 远程跟踪分支名 // git checkout -b 本地分支名 远程跟踪分支名 (创建分支并跟踪对应的远程跟踪分支)
-
git branch -u 远程跟踪分支名 (已存在的分支去跟踪对应的远程跟踪分支名)
-
git branch --v 查看本地分支和远程跟踪分支的跟踪情况
-
git push origin --delete 远程分支名 删除远程分支
-
git remote prune origin --dry-run 列出人在远程跟踪但是远程仓库分支已不存在的
-
git remote prune origin 清除上面命令列出来的远程跟踪分支
-
分支类型
- 远程分支
- 远程跟踪分支
- 本地分支
分支合并冲突
-
本地冲突(典型合并的时候)
-
远程冲突(push,pull)
-
如果出现了远程分支冲突,一定要和冲突者协商冲突部分该如何处理
Github 删除tag
git tag -d <tagname>
git push origin :refs/tags/<tagname>
Github 推送tag
git push --tags
概念
-
git对象,tree对象,commit对象
-
工作区,暂存区,版本库
-
本地分支(git branch),远程跟踪分支(git push),远程分支
-
远程协作的基本流程
做跟踪
-
克隆仓库时,会自动为master做跟踪
-
本地没有分支
git checkout --track 远程跟踪分支(remote/分支名)
-
本地已经创建分支
git branch -u 远程跟踪分支(remote/分支名)
推送
git push(当本地分支有远程跟踪分支才能直接使用,否则要指定远程仓库的分支)
拉取
git pull(当本地分支有远程跟踪分支才能直接使用,否则要指定远程仓库的分支)
SSH
- ssh-keygen -t rsa -C 邮箱: 生成公私钥