Git基础操作

获取帮助

  • git help <command> 获取名为command命令的帮助文档

配置

配置的级别

  • 使用 git config 命令修改配置,等价于直接修改config文件
  • git config <key> <value>git config --local <key> <value> 仓库级配置,修改的是当前使用仓库的 Git 目录中的 config 文件(就是.git/config)
  • git config --global <key> <value> 当前用户级设置 修改的是~/.gitconfig 或 ~/.config/git/config文件(e.g. C:/Users/Oliver/.gitconfig)
  • git config --system <key> <value> 系统级设置 修改的是 /etc/gitconfig文件(e.g. C:/Oliver/run/Git/etc/gitconfig)

提交信息配置

  • git config --global user.name "<name>" 设置提交信息的用户名name
  • git config --global user.email <email> 设置提交信息的电子邮箱email

查看配置

  • git config --list 查看所有配置,重复的配置以最后一个为准。重复的原因是可以有多级配置。
  • git config <key> 查看名为key的单个配置的值

其它常用配置

  • git config --global alias.<alias> <command> 设置别名,示例中将command命令设置alias为别名
  • git config --global color.ui true 命令行关键字颜色区分
  • git config --global merge.conflictstyle diff3 默认冲突文件生成三方版本比较信息

正向流程

初始化本地仓库

  • git init 在你的项目文件夹路径执行该命令,该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是Git 仓库的骨干。但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。
  • git init命令默认创建一条分支,名称为master。master分支只是一条普通的分支。 image-20191120225210604

检查当前文件状态

  • git status image-20191120164228161

  • git status -s image-20191120164116121

文件加入暂存区

  • git add <file> 加入单个文件
  • git rm <file>git add <file> 加入删除的文件
  • git add -u 加入所有被跟踪的已修改文件
  • git add . 加入所有被跟踪的已修改文件以及未跟踪文件,不包括删除的文件
  • git add --all 加入所有 image-20191120225234961

.gitignore文件

  • 定义Git忽略文件的规则,被忽略的文件不再提示未跟踪 image-20191120164436422

  • 文本编辑器里“保存”或者“另存为”就可以把文件命名为.gitignore

查看文件差异

  • git diff 查看文件在工作区与暂存区的区别
  • git diff --cachedgit diff --staged 查看文件在暂存区与HEAD树的区别

提交

  • git commit
  • git commit -m <comment>
  • git commit -a -m <comment> image-20191120225312649

再一次修改提交

  • 生命周期示意图 image-20191120225344265 image-20191120225401626 image-20191120225432877

移除文件

  • git rm <file>git add <file>
  • git rm -f <file>
  • git rm --cached <file>
  • git rm --cached <file> 暂存区中删除,工作区文件不删除,但变成未跟踪状态

移动文件

  • git mv <file-from> <file-to>

交互式暂存

  • git add -i 交互式暂存 image-20191120214539647 image-20191120214845674

  • git add -pgit add --patch 部分文件暂存

储藏

  • 转换分支之前,工作区或者暂存区有修改内容,但暂时不想提交,则可以使用stash先缓存起来
  • git stashgit stash save 保存当前工作区与暂存区状态,可多次保存
  • git stash save --keep-index 只存工作区
  • git stash save --patch 部分存储
  • git stash --include-untrackedgit stash -u 存储包括未跟踪文件
  • git stash -all 存储所有东西(与git stash -u是否有区别存疑)
  • git stash list 查看stash列表
  • git stash apply <stash-id> 恢复工作区与暂存区
  • git stash drop <stash-id> 删除stash
  • git stash pop 弹出stash,等于apply加上drop
  • git stash <branch> 创建一个新分支,检出储藏工作时所在的提交,重新在那应用工作,然后在应用成功后扔掉储藏

清理

  • git clean -f 移除工作目录中所有未追踪的文件
  • git clean -d 移除空的子目录
  • 加上-n 预览将会移除什么

标签

  • 标签分为轻量标签(lightweight)和附注标签(annotated)两类
  • git tag 查看所有标签
  • git tag -l '<format>' 以format格式搜索标签
  • git tag <tag-name> 增加名为tag-name的轻量标签
  • git tag -a <tag-name> -m "<comment>" 增加名为tag-name的附注标签,加上comment注释
  • git show <tag-name> 显示标签的详细信息
  • git tag <tag-name> <commit-id> 针对commit-id这次提交增加tag-name轻量标签
  • git push <remote-name> <tag-name> 推送tag-name标签到远程仓库
  • git push <remote-name> --tags
  • git tag -d <tag-name>
  • git push <remote-name> :refs/tags/<tagname>
  • git checkout <tag-name>

查看历史

查看提交历史

  • git log image-20191120170515920 image-20191120170649813
  • git log --pretty=format:"<format>" 格式化日志 image-20191120170158793
  • git log --oneline 每个提交只显示一行
  • git show <commit-id> 查看commit id提交的详细信息
  • git log --follow <file> 查看单文件的提交日志

选定提交版本

  • 作为commit id的SHA-1校验和在没有歧义的情况下可只写前几位,最少4位
  • 分支名代替commit id,即代表分支指针所指的commit的id
  • HEAD代替commit id,即代表HEAD指针所指的commit的id
  • <commit-id>^指向commit-id的父提交。假如commit-id是合并提交,则指向第一父提交
  • <commit-id>~n指向commit-id的上n次提交,也可以用n个^表示 (e.g. <commit-id>~2 等价 <commit-id>^^
  • 合并提交会有多个父提交。第一父提交是你合并时所在分支,而第二父提交是你所合 并的分支
  • <commit-id>^2指向commit-id的第二父提交。

选定提交区间

  • git log <excluded-branch>..<included-branch> 双点
  • git log ^<excluded-branch> <included-branch> --not <excluded-branch>多点
  • git log <first-branch>...<second-branch> 三点 包含且非共有
  • git log --left-right <first-branch>...<second-branch> 显示提交属于哪一条分支
  • git log -S<string> 文件内容更改包含string的日志搜索

查看命令历史

  • git refloggit log -g 引用日志,查看Git执行命令的历史

反向流程

一般撤消操作

  • git commit --amend 修改最近一次提交

  • git reset HEAD <file> 暂存区被重置为HEAD树的状态

  • git checkout <file>git checkout -- <file> 检出文件file在Git仓库(是否包含暂存区存疑)的最新快照,工作区的修改被丢弃,file前加上双横线为了防止与分支名冲突

reset

  • git reset <commit-id> 命令会移动HEAD指针以及HEAD所指的分支指针
  • git reset --soft <commit-id> 数据区域只重置HEAD树,重置到commit-id的状态 image-20191120225550747 image-20191120225617306
  • git reset <commit-id>git reset --mixed <commit-id> 数据区域重置HEAD树与暂存区 image-20191120225640523
  • git reset --hard <commit-id> 数据区域重置HEAD树、暂存区以及工作目录
  • git reset --hard ORIG_HEAD reset错误时,可以通过reset到ORIG_HEAD撤销 image-20191120225706634
  • git reset <file> HEAD指针以及HEAD所指的分支指针不移动,只针对file文件作重置,重置到HEAD树的状态 image-20191120225749549
  • git reset <commit-id> -- <file> image-20191120225830467
  • git reset --soft HEAD~<n> git commit 压缩最后n次提交
  • git reset --patch <commit-id> --<file> 文件部分reset

checkout

  • git checkout <commit-id> 命令只会移动HEAD指针,且重置暂存区和工作目录的数据
  • git checkout <commit-id> <file> HEAD指针不移动,重置file文件在暂存区和工作目录的数据
  • git checkout <commit-id>commit id不在分支指针位置,也就是不是分支的最新提交,这会使你的仓库处于“分离头指针(detached HEAD)”状态,假如再进行提交操作,新提交会处于匿名分支内
  • git checkout --patch <commit-id> <file> 文件部分checkout

reset与checkout的对比

  • 指针变化 image-20191120230237684
  • 数据区域变化 image-20191120230814446

交互式变基

  • git rebase -i <parent-commit-id> parent commit id 以后的提交参与变基,不包括自身 image-20191120223958328
  • 通过修改头几行前面的命令来更改提交,edit命令将回到该次提交的状态,然后通过git commit --amend修改提交 image-20191122170808634
  • pick 且修改行的顺序,则可以修改提交顺序
  • reword 只修改提交注释
  • squash 该次提交并入它的父提交(下图三次提交合并成一次) image-20191122171337451

revert

  • git revert <commit-id> 再提交一次,新提交的变更内容是取消了commit id提交的修改 image-20191120233544617