git 直接记录快照,svn是基于差异(delt-based)
三种状态: committed(已提交)、modified(已修改)、staged(已暂存)
三个阶段: working Directory, Staging Area , .git directory
工作区是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区 理解暂存区
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。
基本工作流程:
- 在工作区中修改文件。
- 将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。
- 提交更新,找到暂存区的文件,将快照永久性存储到 Git 目录。
基本配置
配置分三个层级,分别有system, global, local。
local配置是仓库本地配置,每个git仓库都有一个local配置,local配置对应的配置文件是仓库目录下的.git/config文件
local配置会覆盖global配置, global配置会覆盖system配置
git config --list // 列出所有配置
git config --list --show-origin // 查看所有配置及所在文件
设置 用户名和邮件:
// 系统配置
git config --system user.name 'xxxx'
git config --system user.email 'aaaa@bbb.com'
// 全局配置
git config --global user.name 'xxxx'
git config --global user.email 'asdf@asdf.com'
// 本地配置,如果在仓库目录下,可以不带--local参数
git config --local user.name 'xxx'
git config --local user.email 'xxx@xxx.com'
设置文本编辑器
git config --global core.editor xxx
设置编码
git config --global core.quotepath false
帮助
获取对应指令的帮助
git help xxx
git xxx --help
man git-xxx
例如:
git help config
初始化
通常有两种获取 Git 项目仓库的方式:
- 将尚未进行版本控制的本地目录转换为 Git 仓库;
- 从其它服务器 克隆 一个已存在的 Git 仓库。
初始化一个仓库
cd dirName
git init
克隆现有仓库
git clone https://xxxx
git clone httpx://xxxx dirName // 指定目录名称
记录更新
检察文件状态
git status
git status -s // 精简打印
// MM 已暂存并修改
// M 已暂存
// A 新增到暂存区的文件
追踪(track)/暂存文件
git add fileName
忽略文件,只需要在 .gitignore中进行配置即可。
文件 .gitignore 的格式规范如下:
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
5.要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
==什么是glob?==
查看diff
git diff // 未暂存的修改,对比工作区和暂存区的文件,与版本库没关系。
// 查看已暂存的修改,对比暂存区和已提交的文件
git diff --staged // --staged 和 --cached 是同义词
git diff --cached // --staged 和 --cached 是同义词
// 使用可视化工具查看diff(几乎用不到,vscode自带的diff可视化很好用)
git difftool
提交更新
git commit // 不指定描述会直接打开命令行编辑器让你输入描述内容。
git commit -m '描述'
从工作区直接commit
git commit -a
移除(已跟踪)文件
移除文件的笨办法是先手动删除文件,再将删除的操作add到stage 目录,最后commit。这里分三步走
移除文件分两种方式,一是删除工作区的文件并移除stage的记录
git rm fileName // 删除工作区文件,并将该删除操作添加到暂存区
git commit // 提交
// git rm 其实是 合并了删除文件和git add两步操作,一次性将删除操作记录到暂存区
另外一种方式是只移除git对文件的跟踪,而文件保留在工作目录
gir rm --stage fileName // 这里相当于在保留工作区文件的同时,将删除操作提交到了暂存区,
git commit
⚠️ -f 命令 : 如果文件在工作区被修改,使用-f指令强制删除
git rm -f filename // 强制删除文件,不保留
git rm -f --staged filename // 强制删除文件,工作区保留。
git rm 只能处理tracked文件
移动文件
git mv fileFrom fileTo
查看历史
git log
列出差异
git log -p
git log -p -2 // 查看最近两次提交记录
列出统计
git log -stat
美化
git log --pretty=oneline
具体pretty值的可选项: https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%9F%A5%E7%9C%8B%E6%8F%90%E4%BA%A4%E5%8E%86%E5%8F%B2
图形显示分支
git log --pretty=format:"%h %s" --graph
还有其他log方法具体看文档
撤销操作
修补提交,修补上一次的提交内容及message,不会产生新的提交。
git commit --amend
取消暂存,将指定文件在暂存区的状态恢复到已提交的状态。
git reset HEAD <file>
git restore --staged <file>
撤销修改,⚠️此操作会覆盖工作区,容易造成工作内容丢失。
git checkout -- <file>...
如果 file 在暂存区有记录,会从暂存区恢复file的内容。
例如, a
如果暂存区没有记录,会从将工作区内容恢复到版本库中上一次提交的状态。
远程仓库管理
查看远程仓库
git remote -v
添加一个新的远程 Git 仓库
git remote add <shortname> <url>
打标签
列出标签
git tag
创建标签
git tag -a v1.1 -m '描述'
git show // 查看标签信息及对应的提交信息
轻量标签
git tag v1.4-lw // 不提供任何选项,直接跟版本好 ,就是轻量标签
对某个提交版本打标签
git tag -a v1.xxx md5
本地创建的标签需要推送到远程仓库
git push origin v1.xx;
git push origin --tags // 推送全部本地标签,会把所有不在远程仓库的标签都推送上去
删除标签
git tag -d v1.xx
git push <remote> :refs/tags/<tagname> // 更新远程仓库
git push origin --delete <tagname>
//示例
git push origin :refs/tags/v1.1;
命令别名
通过git config 为 git命令设置别名
git config --global alias.co checkout
// alias.<name> 这里的name 就是别名
示例:
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git 分支
点击这里阅读官方教程文档。
创建分支
git branch testing // 创建名为testing 的分支
git checkout -b <newbranchname> //创建并切换分支
git switch -c <newbranchname> //创建并切换分支 switch 命令2.24.1才支持
查看各个分支的指向
git log --oneline --decorate
git log --oneline // 在高版本git不需要 --decorate 操作了。
切换分支
git checkout branchName
git switch master // 切换到master switch 命令2.24.1才支持
查看当前分支结构
git log --graph --all // --all是用来显示所有分支,
合并分支
git merge <newbranchname>
git merge --no-ff -m "merge with no-ff" dev // 禁用Fast forward 合并
分支管理
git branch // 列出分支
git branch -v //列出所有分支的上次提交
git branch -d testing //删除分支,
git branch -D testing //当 testing分支中有未合并的提交时,强制删除分支
远程分支
git ls-remote origin //获取远程分支列表
与给定的远程仓库同步数据
git fetch <remote>
在远程跟踪分支之上建立分支
git checkout -b serverfix origin/serverfix
跟踪远程分支
git checkout --track origin/develop // 本地新增 develop分支并跟踪远程 develop分支
git checkout serverfix // 如果远程有serverfix分支,且本地无此分支,会自动跟踪
查看设置的所有跟踪分支
git branch -vv
清理无效的远程分支
git remote prune origin
变基(rebase)
文档
你可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。
rebase是用来合并分支的,当在两个不同的分支上都做了修改,可以使用rebase将一个分支上的修改合并到另外一个分支上。
将experiment rebase 到 master上
git checkout experiment
git rebase master
过滤部分分支
git rebase --onto master server client // client中过滤掉 server的部分,rebase到master
一句话 rebase:使用 git rebase <basebranch> <topicbranch> 命令可以直接将主题分支变基到目标分支
git rebase master server
疑问:
git fetch 与 git pull 有什么区别
git fetch 从远程分支抓取数据,不自动merge
git pull 自动merge