系统学习(一):Git 笔记

170 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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 仓库

image.png

HEAD:当前分支
config:配置文件
description:仓库描述
objects:所有 git 对象
refs:
    - heads:所有分支
    - tags: 所有标签

*附加例子:

查看 HEAD 的内容:

  • 当前分支 HEAD 指向 master 分支
  • master 分支存储在 .git/refs/heads/master 路径下

image.png

关键对象

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 image.png

  • 使 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 修改框,重新修改并保存即可 image.png

多个连续的 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 关系图(此图中版本库可以看做是暂存区) image.png