Git学习笔记
基本概念
git 的所有操作基本上都是在本地执行
git 一般只添加数据
git 工作区
sequenceDiagram participant A as Working Directory participant B as Staging Area participant C as .git Repository A ->> B: git add B ->> C: git commit C ->> A: git checkout
- .git 仓库(git repository):用来保存项目的元数据与对象数据库,从其他计算机
clone
时拷贝的是这里的数据 - 工作目录(working directory):从 git 仓库的压缩数据库中提取出来的文件,供用户编辑
- 暂存区(staging area):是.git 文件夹中的一个文件,保存下次将提交的文件信息列表索引
git 文件状态变化
sequenceDiagram participant untracked participant unmodified participant modified participant staged untracked ->> staged: git add unmodified ->> modified: edit file modified ->> staged: git add staged ->> unmodified: git commit unmodified ->> untracked: rm file
.gitignore文件可以使用Shell glob模式的正则表达式进行匹配。
git 操作
差异比较
git diff
比较工作目录与暂存区之间的差异git diff --cache
比较暂存区与仓库之间的差异
提交
在 git 中任何已经提交的东西几乎总是可以恢复的,但是未提交的不行。
git commit
提交暂存区快照至仓库git commit -a
自动将已跟踪过的文件暂存并提交
撤销
git commit --amend
撤销提交git reset HEAD <file>
撤销暂存区中的文件git checkout -- <file>
撤销工作区文件更改
移除文件
git rm
从暂存区移除git rm --cached
从暂存区和仓库移除
远程
git remote -v
查看远程仓库git remote add <shortname> <url>
添加远程仓库至本地git fetch <remote-name>
拉取远程分支的最新状态git remote rename <name1> <name2>
重命名远程分支git push origin --delete <tagName|branchName>
删除远程标签或分支(远程不会立即删除,而是等到下一次 GC 时正式删除)
标签
git tag -a v1.0 <commit id>
给特定 commit 打标签git push origin v1.0
推送标签至远程分支
分支
git 的分支实质上就是指向提交对象的可变指针。
graph LR subgraph 提交 f30ab --> 34ac2 --> 98ca9 f30ab --> master master --> HEAD v1.0 --> f30ab end subgraph 快照 98ca9 --> snapshotA 34ac2 --> snapshotB f30ab --> snapshotC end
git branch <branchName>
创建分支git checkout <branchName>
切换分支git branch -a
查看所有分支git checkout -b <branchName>
创建并切换分支git merge <branchName>
将选择的分支合并到当前分支,如果选择的分支是当前分支的直接下游则将当前分支的HEAD指针指向选择的分支git branch -d <branchName>
删除本地分支git rebase <branchName>
提取选择的分支所引入的提交然后在当前分支上应用一次
git rebase 与 git merge 的区别
graph LR A[C1] --> B[C2] --> C[C3:master] & D[C4:develop] subgraph merge E[C1] --> F[C2] --> G[C3] & H[C4:develop] --> I[C5:master] end subgraph rebase a[C1] --> b[C2] --> c[C3] --> d[C4:master] end
- 无论是变基还是三方合并,整合的最终结果所指向的快照都是一样的,只不过提交历史不一样
- 变基是把一系列提交按照原有次序依次应用到另外一个分支上,而合并是把最终结果合并在一起
变基原则
- 只针对未提交至远程仓库的本地修改执行变基操作清理历史提交,不要对已经推送至远程的提交执行变基操作
- 如果执意要对远程仓库的提交执行变基操作,请告知其他团队成员使用
git pull --rebase
命令来拉取代码
存储与清理
git stash
将已跟踪的文件和暂存的改动保存到一个栈上git stash -u
不仅存储已追踪的文件,还会存储未追踪的文件git stash list
查看存储区git stash pop
提取存储git drop stash@{x}
移除暂存git clean -f -d
移除工作目录中所有未追踪的文件以及空子目录git clean -d -n
演习git clean
将要移除哪些文件git clean -x -i
-x移除包含进.gitignore 中的文件,-i以交互方式进行