Git 文档阅读
有空可以看看这个 Git 笔记汇总
Chapter 1 起步
版本控制
-
集中化版本控制(CVCS)缺点
- 中央服务器的单点故障就无法协同工作
- 本地只有快照,项目整体和其变更历史只保存在服务器上
-
分布式版本控制(DVCS)优点
- 代码仓库完整地镜像下来,包括完整的历史记录
- 用户在本地保存了所有改动,每一次的克隆都是对仓库的完整备份
- 可以指定和若干不同的远端代码仓库进行交互
Git 简史
- 并行开发
- 完全分布式
- 速度快
- 数据量大
Git 简介
- 大多版本控制工具都是基于差异的,存储文件随时间变化的差异,而Git储存项目快照或索引
- Git 安全性优,只做增不做删;完整性好,使用SHA-1 哈希算法
- 文件的四种状态:已提交(committed)、已修改(modified)、已暂存(staged)、未跟踪(untracked)
- 项目的三个阶段:工作目录、暂存区域以及 Git 仓库
- 工作流程:修改文件、暂存文件、将暂存区文件快照永久存在Git目录
Git 配置
git config --list --show-origin
- /etc/gitconfig 系统通用配置 git config --system
- ~/.gitconfig 当前用户配置 git config --global
- .git/config 当前项目配置 git config --local
Chapter 2 基础
Git命令只能控制当前文件夹和子文件夹内的修改
常用命令
git init 【初始化仓库】
git clone [OPTIONS] <url>【克隆仓库】
- [-b master]克隆指定分支
git status [OPTIONS] 【查看文件状态 】
- [-s] 简要文件状态信息
git add <file> 【跟踪新文件、已修改的文件放到暂存区、合并时把有冲突的文件标记为已解决状态 】
git diff [OPTIONS] <file>【已修改文件与已暂存文件的内容差异】
- [–staged] 显示暂存区和上一次提交的差异
git blame [OPTIONS]【追踪代码提交历史】
- [ -L 200,300 <file>] 追踪某些行代码修改的历史 commit
git rm [OPTIONS] <file> 【删除文件】
- [-f] 强制移除存在未提交修改的文件
- [ --cached] 文件保留在工作区中,从Git仓库和暂存区中删除
git commit [OPTIONS] 【提交文件】
- [-m <message>] 提交备注
- [–amend] 追加提交
- [-a] 直接将工作区和暂存区的所有修改一起提交
git mv <oldfilename> <newfilename> 【移动文件/改名】
git log [OPTIONS] 【回顾提交历史】
- [–stat] 显示每次提交的简要信息
- [-p] 显示每次提交的详细信息
- [–pretty=format:“xxx”] 自定义信息格式
- [–oneline --graph --all] 显示提交历史、各个分支的指向以及项目的分支分叉情况
- [–since] 限制时间
git reset [OPTIONS] <HEAD>【回退版本,可以指定退回某一次提交的版本,直接删除某些commit的内容】
- [–soft] 回退到某个版本
- [–mixed] 默认,用于重置暂存区的文件与上一次的提交保持一致(取消暂存),工作区文件内容保持不变
- [–hard] 撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
git checkout [OPTIONS]【在不同的分支之间切换、恢复文件、创建新分支,git switch 和 git restore 可以代替它】
- [.] 放弃所有工作区的修改
- [-f] 放弃工作区和暂存区的所有修改
- [<branch-name>] 从当前分支切换到指定的分支
- [-b <local_new_branch_name> <remote_new_branch_name>] 将远程仓库里指定的分支拉取到本地,并在本地创建一个分支与指定远程仓库分支关联起来,并切换到新建的本地分支中
git remote [OPTIONS] 【列出当前仓库中已配置的远程仓库】
- [-v] 列出当前仓库中已配置的远程仓库,并显示它们的 URL
- [add <remote_name> <remote_url>] 添加远程仓库,指定一个远程仓库的名称和 URL,将其添加到当前仓库中
- [remane <old_name> <new_name>] 将已配置的远程仓库重命名
- [show <remote_name>] 显示指定远程仓库的详细信息,包括 URL 和跟踪分支
- [remove <remote_name>] 从当前仓库中删除指定的远程仓库
- [<remote_name> <new_url>] 修改指定远程仓库的 URL
git fetch <remote_name> <local_branch_name> 【获取远程仓库的更新,但不自动合并到你的工作】
- [–all] 获取远程的所有分支
git push [OPTIONS]【推送到远程分支】
-
[<remote_name> <local_branch_name>:<remote_branch_name>]
-
[<remote_name> --delete <branch_name>] 删除远程分支
-
[-u <remote_name> --all] 本地的仓库和远程仓库进行关联
-
[–set-upstream <remote_repository> <local_branch_name>] 将本地分支与远程分支关联
-
[–force] 强制提交,会覆盖所有 behind 的提交
git pull <remote_name> <branch>【git fetch
和 git merge
的组合,拉取到本地分支并合并】
git tag [OPTIONS]【列出已有的标签】
- [-l <通配符>] 查询某些对应标签
- [<version>] 轻量标签(提交校验和存储到一个文件中)
- [-a <version> -m <comment>] 创建附注标签(数据库中的一个完整对象, 可以被校验)
- [-d] 删除标签
git rebase <cur_branch> <target_branch> 【将提交到某一分支上的所有修改都移至另一分支上】
git revert <commit_id>【生成一次新的commit冲抵原来的commit,不会修改原有的提交历史,而是通过添加新的提交来撤销更改】
git merge <branch> 【合并指定分支到当前分支】
git switch [OPTIONS] <branch-name> 【切换分支,与 git checkout 类似,但提供了更清晰的语义和错误检查】
- [-c] 创建一个新分支并切换到该分支
git show 【对于提交,它显示日志消息和文本差异;对于标签,它显示标签消息和引用对象】
git restore [OPTIONS] 【恢复或撤销文件的更改】
- [.] 还原所有未提交的更改
- [<filename>] 丢弃工作区修改
- [–staged <filename>] 将暂存区的修改放回工作区
- [–source=<commit> <file>] 将文件恢复到特定提交的状态
git branch [OPTIONS] 【查看本地分支】
- [<branch_name>] 创建本地分支
- [-b <branch_name>] 创建本地分支并切换
- [-v] 每个分支的最后一次提交
- [-vv] 跟踪信息
- [-r] 查看远程分支
- [-D <branch_name>] 删除分支
- [–set-upstream-to <remotename>/<remote_branch> <local_branch>] 跟踪远程分支。在本地新建一个分支后,需要做远程分支关联,目的是在执行git pull, git push操作时就不需要指定对应的远程分支
- [–merged --no-merged] 合并/未合并到当前分支的其他分支
- [-m <old_branch_name> <new_branch_name>] 改名
git stash [OPTIONS] 【贮藏工作】
- [list] 列出所有贮藏
- [apply] 恢复贮藏
忽略/不跟踪文件
.gitignore 正则表达式:官方样例文件
Chapter 3 分支
相关命令合并到 Chapter2 中
- Git 中 HEAD是一个指针,指向当前工作位置
- git mergetool 图形化冲突解决工具
- 有 Git 特性演化出的开发工作流:长期分支、主题分支
变基
如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作。
工作原理:提取<topicbranch>内的修改并存为临时文件,然后将HEAD指向<basebranch>,最后以此将之前另存为临时文件的修改依序应用