一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
Email 配置
设置 Email
git config [--local | --global | --system] user.name 'Your name'
git config [--local | --global | --system] user.email 'Your email'
git config 扩展说明
local:区域为本仓库
global: 当前用户的所有仓库
system: 本系统的所有用户
清除 Email
git config --unset --local user.name
git config --unset --global user.name
git config --unset --system user.name
首次推送
首次推送
git init 【初始化仓库】
git add . 【把当前所有文件添加到 暂存区】
git commit -m "Initial commit" 【备注提交说明】
git push origin master 【推送到远程】
git add 扩展说明
git add -u :将文件的修改、文件的删除,添加到暂存区【没有添加新建的文件】
git add . :将文件的修改,文件的新建,添加到暂存区【没有添加删除的文件】
git add -A :将文件的修改,文件的删除,文件的新建,添加到暂存区【-A 也可以是 all】
git push 扩展说明
git push origin master:master 【本地仓库master分支推动到远程仓库的master分支 】
git push origin master 【本地仓库当前分支的推送到master分支】
git push 【将当前本地仓库所在分支提交到远程相同分支下】
强制回滚
git reset --hard 【回滚工作区和暂存区的文件】
日志查看
git log --all 查看所有分支的历史
git log --all --graph 查看图形化的 log 地址
git log --oneline 查看单行的简洁历史。
git log --oneline -n4 查看最近的四条简洁历史。
git log --oneline --all -n4 --graph 查看所有分支最近 4 条单行的图形化历史。
git help --web log 跳转到git log 的帮助文档网页
.Git 仓库
HEAD:当前分支
config:配置文件
description:仓库描述
objects:所有 git 对象
refs:
- heads:所有分支
- tags: 所有标签
*附加例子:
查看 HEAD 的内容:
- 当前分支 HEAD 指向 master 分支
- master 分支存储在
.git/refs/heads/master路径下
关键对象
commit
- 一个 commit 对应一个 tree【快照】
- 两次 commit 中,内容相同的文件使用相同的 blob tree
- 内部包含若干 tree,以及若干 blob【文件夹】 blob
- 文件的最终形式是 blob【文件】
*分离头指针
分离 HEAD
git chechout [commit id]
基于 commit id 创建分支
git branch [分支名称] [commit id]
该 HEAD 不属于任何分支或 Tag,显示的是一个 commit id
- 使 HEAD 指向某个 commit 节点【分离头指针】
- 如果分离头指针 HEAD 所在的 commit 没有和 Tag 或者分支绑定,则该 HEAD 可能被丢弃
- 保存分离指针的所在的 commit 节点,为其创建分支
*HEAD 指针
^和~都是父节点,区别是跟随数字时候,^2 是第二个父节点,而~2是父节点的父节点^和~可以组合使用,例如 HEAD~2^2
分支相关
删除分支
git branch -d [branch name] 【如果分支没有合并,删除报错】
git branch -D [branch name] 【强制删除】
查看分支
git branch -av
修改 commit message【尚未 push 到远程,最近一次 commit】
git commit --amend
修改 commit message【尚未 push 到远程,某次 commit】
git rebase -i <待修改节点的父节点 commit id>
修改 pick 策略选择
r(reword),保存退出后再次弹出 message 修改框,重新修改并保存即可
多个连续的 commit 节点整合为一个【pick 策略选择 suqash】
git rebase -i <待整合最后一个节点的父节点 commit id>
多个不连续的 commit 节点整合为一个【pick 策略选择 suqash】
git rebase -i <待整合最后一个节点的父节点 commit id>
技巧:整合与连续的 commit 整合相似,但实际操作上有区别
- 比如,你想整合四个 commit 节点,但是 pick 界面只出现三个,那么你需要手动复制对应信息添加第四个节点
- 同样的,commit 合并仍是使用 suqash 策略
- 使用 suqash 策略之前,你需要把不连续的 commit id 排列为连续的,同时首位必须为 pick 策略,保存退出继续操作
- 若中间出现 git rebase --skip 、git rebase --continue,按提示继续执行命令即可
暂存区和 HEAD 比较【暂存区:commit add 之后】
git diff --cached / --staged
工作区和 HEAD 比较【工作区:执行 commit add 之前】
git diff HEAD
工作区和暂存区比较
git diff HEAD
暂存区文件恢复为暂存区(HEAD)【变更暂存区内容使用 reset】
git reset HEAD
暂存区部分文件恢复为暂存区(HEAD)
git reset HEAD -- <files>
工作区恢复为暂存区【变更工作区内容使用 checkout】
git checkout -- <files>
恢复到指定的 commit【--head 强制恢复,本地数据丢失】
git reset --head <commid id>
比较两个 commit id 文件的差异
git diff <commit-id-1> <commit-id-2> -- <files>
比较两个分支文件的差异【分支其实指向的是 HEAD 指针,那么也就是 HEAD commit id 的比较】
git diff <branch-1> <branch-2> -- <files>
附加: 工作区、暂存区、HEAD 关系图(此图中版本库可以看做是暂存区)