目录
-
- [1 初始化](#1 初始化)
- [2 仓库](#2 仓库)
- [3 四个区域](#3 四个区域)
- [4 文件状态](#4 文件状态)
- [5 基本概念](#5 基本概念)
- [6 特殊文件](#6 特殊文件)
- [7 添加和提交](#7 添加和提交)
- [8 分支](#8 分支)
- [9 合并分支](#9 合并分支)
- [10 撤销和恢复](#10 撤销和恢复)
- [11 查看状态](#11 查看状态)
- [12 stash](#12 stash)
- [13 远程仓库](#13 远程仓库)
- [14 GitFlow](#14 GitFlow)
- [15 参考](#15 参考)
1 初始化
查看版本
git -v
配置用户名
git config --global user.name "Zhang Beihai"
配置邮箱
git config --global user.email "zhizi@wto.com"
存储配置
git config --global credential.helper store
2 仓库
创建一个新的本地仓库(省略project-name则在当前目录创建)
git init <project-name>
克隆远程仓库
git clone <url>
3 四个区域
- 工作区(Working Directory)
资源管理器中实际看到的目录
- 暂存区(Stage/Index)
暂存区也叫索引,用来临时存放未提交的内容,一般在.git目录下的index中。
- 本地仓库(Repository)
Git在本地的版本库,仓库信息存储在.git这个隐藏目录中。
- 远程仓库(Remote Repository)
托管在远程服务器上的仓库,如GitHub、GitLab、Gitee。
4 文件状态
- 已修改(Modified)
修改了但是没有保存到暂存区的文件
- 已暂存(Staged)
修改后已经保存到暂存区的文件
- 已提交(Committed)
暂存区文件提交到本地仓库后的状态。
5 基本概念
-
main/master
默认主分支
-
origin
默认远程仓库
-
HEAD
指向当前分支的指针
-
HEAD^
上一个版本
-
HEAD~4
上四个版本
6 特殊文件
-
.git
Git仓库的元数据和对象数据库
-
.gitignore
忽略文件,不需要提交到仓库的文件
-
.gitattributes
指定文件的属性,比如换行符
-
.gitkeep
使空目录被提交到仓库
-
.gitmodules
记录子模块的信息
-
.gitconfig
记录仓库的配置信息
7 添加和提交
添加一个文件到仓库
git add <file>
添加所有文件到仓库
git add .
提交所有暂存区的文件到仓库
git commit -m "message"
提交所有已修改的文件到仓库
git commit -am "message"
8 分支
查看所有本地分支,-r 查看远程分支,-a查看所有分支
git branch
创建一个新分支
git branch <branche-name>
切换到指定分支,并更新工作区
git checkout <branch-name>
切换分支推荐使用
git switch <branch-name>
创建一个新分支,并切换到该分支
git checkout -b <branch-name>
删除一个已经合并的分支
git branch -d <branch-name>
删除一个分支,不管是否合并
git checkout -D <branch-name>
给当前提交打上标签,通常用于版本发布
git tag <tag-name>
9 合并分支
合并分支a到分支b,--no-ff参数表示禁用Fast forward模式,合并后的历史有分支,能看出曾经做过合并,而-ff参数表示使用Fast forward模式,合并后的历史变成一条直线
git merge --no-ff -m "message" <branch-name>
git merge --ff -m "message" <branch-name>
合并&挤压(squash)所有提交到一个提交
git merge --squash <branch-name>
rebase 不会产生新的提交,而是把当前分支的每一个提交都"复制"到目标分支上,然后再把当前分支指向目标分支,而merge会产生一个新的提交,这个提交有两个分支的所有修改。
rebase操作可以把本地未push的分叉提交历史整理成直线,看起来更直观。但是,如果多人写作时,不要对已经推送到远程的分支执行rebase操作。
git checkout <dev>
git rebase <main>
10 撤销和恢复
移动一个文件到新的位置
git mv <file> <new-file>
从工作区和暂存区中删除一个文件
git rm <file>
从索引/暂存区中删除文件,但是本地工作区还在,只是不希望这个文件被版本控制
git rm --cached <file>
恢复一根文件到之前的版本
git checkout <file> <commit-id>
创建一个新的提交,用来撤销指定的提交,后者的所有变化将被前者抵消,并且应用到当前分支。
git revert <commit-id>
重置当前分支的HEAD为之前的某个提交,并且删除所有之后的提交。
--hard 表示重置工作区和暂存区
--soft 表示保留工作区和暂存区
--mixed 默认参数,表示保留工作区,重置暂存区
git reset --mixed <commit-id>
撤销暂存区的文件,重新放回工作区(git add的反向操作)
git restore --staged <file>
11 查看状态
查看仓库状态
git status
查看记录
git log
git log --oneline
查看未暂存的文件更新了哪些部分(工作区VS暂存区)
git diff
工作区VS本地仓库
git diff HEAD
暂存区VS本地仓库
git diff --cached
git diff --staged
查看两个提交之间的差异
git diff <commit-id> <commit-id>
git diff HEAD~ HEAD
查看两个分支之间的差异
git diff <branch_name> <branch_name>
查看仓库文件
git ls-files
查看历史操作记录
git reflog
12 stash
stash操作可以把当前工作现场储藏起来,等以后恢复现场后继续工作。
-u 表示把所有未跟踪的文件一并存储
-a 把所有未跟踪文件和忽略的文件一并存储
save参数表示存储的信息,可以不写
git stash save "message"
查看所有stash
git stash list
恢复最近的一次stash
git stash pop
恢复指定的stash,stash@{2}表示第三个stash,stash@{0}表示最近的stash
git stash pop stash@{2}
重新接受最近一次stash。pop 和 reply 的区别是,pop会把stash内容删除,apply不会。
git stash apply
删除所有stash
git stash clear
13 远程仓库
添加远程仓库
git remote add <remote-name> <remote-url>
查看远程仓库
git remote -v
删除远程仓库
git remote rm <remote-name>
重命名远程仓库
git remote rename <old-name> <new-name>
从远程仓库拉取代码,默认拉取仓库名origin的master/main分支。
git pull <remote-name> <branch-name>
将本地改动的代码rebase到远程仓库最新代码。
git pull --rebase
推送代码到远程仓库。
git push <remote-name> <branch-name>
获取所有远程分支。
git fetch <remote-name>
查看远程分支。
git branch -r
fetch某一个特定的远程分支。
git fetch <remote-name> <branch-name>
14 GitFlow
GitFlow是一种流程模型。
- 主分支(master/main):代表了项目的稳定版本,每个提交到主分支的代码都是经过测试和审核的。
- 开发分支(develop):用于日常开发。所有的功能分支、发布分支和修补分支都应该从开发分支派生出来。
- 功能分支(featue):用于开发单独的功能或者特性。每个功能分支抖音该从开发分支派生,并在开发完成后合并回开发分支。
- 发布分支(release):用于准备项目的发布。从开发分支派生,并在准备好发布版本后合并回主分支和开发分支。
- 热修复分支(hotfix):用于修复主分支上的紧急问题。热修复分支应该从主分支派生,修复完成后,合并回主分支和开发分支。