git概念详解
| 概念 | 详解 |
|---|---|
| 工作区(Workspace) | 在电脑上开发项目时能实际看到的代码目录 |
| 暂存区(stage) | 用于临时存放文件的修改,实际上它只是一个文件(.git/index), 表示待提交文件的列表信息 |
| 版本库/仓库(Repository) | git的管理仓库,管理版本的数据库,记录文件/目录状态的地方,所有内容的修改记录都在这里 |
| 本地仓库 | 用户机器上直接使用的版本库 |
| 服务端/远程仓库(origin或remote) | 服务器端的版本库,为多人共享开发提供服务,本地版本库通过push把代码推送到远程仓库 |
| 分支(branch) | 分支是从主线分离出去的一个"副本",可以独立操作互不干扰 |
| 标签(tag) | 标签是指某个分支特定时间点的状态,在某个分支基础上创建,类似于分支的一个副本,但它是不可编辑的,可以理解为提交记录的一个别名,常用来标记一个里程碑版本 |
| 头(head) | head类似一个指针,指向当前活动分支的最新版本 |
| 暂存(add) | 把工作区变动的文件保存到暂存区 |
| 提交(commit) | 把暂存区所有变更的内容提交到本地仓库的活动分支 |
| 推送(push) | 将本地仓库的版本推送到远程仓库,供其他人共享 |
| 拉取(pull) | 从远程仓库拉取代码版本到本地仓库 |
| 获取(fetch) | 从远程仓库更新代码,作用同pull,区别是不会自动合并 |
| 冲突(conflict) | 多人对同一文件的副本进行了修改,并将这些更改合并到仓库时就会面临冲突,需要人工对比修改处理 |
| 合并(merge或rebase) | 把一个分支合并到另一个分支,merge会产生一个新的commit记录,rebase不会产生新的提交记录 |
| 默认分支(master或main) | 初始化git仓库时默认自动生成的分支 |
| origin/master | 表示远程仓库origin的master分支 |
| origin/Head | 表示远程仓库origin最新提交的位置 |
git配置
git config --list // 查看配置
git config user.email [email] // 配置局部账号
git config --global user.email [email] // 配置全局邮箱
git config --global user.name [username] // 配置全局用户名
git config –replace-all user.name "name" // 修改配置信息
git config --global credential.helper store
分支管理
| 场景 | 命令 | 场景 | 命令 |
|---|---|---|---|
| 新建分支 | git branch b-name | 切换分支 | git checkout b-name |
| 删除分支 | git branch -D b-name | 删除远程分支 | git push origin --delete b-name |
| 查看分支 | git branch -av | 暂存分支 | git add . |
| 提交分支 | git commit -m 'develop' | 推送分支到远程 | git push origin b-name |
| 拉取远程分支并创建本地分支 | git fetch origin dev:dev | 拉取代码并合并 | git pull origin dev |
| 修改上一次提交 | git commit --amend -m 'fix' | 修改某一次提交 | git rebase -i parentCommitId |
注意点:切换分支时,当前分支没有 add 或者 commit,则会把内容带到另一个分支里面去,对于未add和commit的内容不属于任何一个分支,也就是说,对于所有分支而言,工作区和暂存区是公共的。
pull 和 fetch
git pull = git fetch + git merge
pull 和 fetch都是从远程拉取代码版本到本地分支,pull拉取后会主动的进行版本合并,fetch不会主动合并(不会影响工作区代码,HEAD还是指向之前的版本),需要手动合并
分离头指针
当HEAD指向分支的其他commit时(不指向顶部commit),此次HEAD就处于分离头指针,可以在此commit基础上创建一个新的分支
git checkout commitId // 切换成分离头指针
git swtich -c new-branch // 创建新的分支
修改某一次commit的信息
如果修改之前某一次commit提交的内容,可通过其父commitId(前一次)进行调整,此时会进入到一个交互界面,通过修改pick为reward命令保存进行后续修改
git rebase -i parentCommitId
.git目录结构
文件管理
| 场景 | 命令 | 场景 | 命令 |
|---|---|---|---|
| 删除文件 | git rm xx | 修改文件名 | git mv a.js b.js |
| 恢复暂存区文件到工作区 | git restore xx | 从仓库恢复到暂存区 | git restore --staged xx |
合并分支
merge
合并test分支到dev,会产生新的提交记录
git checkout dev // 切换到dev分支
git merge test // 合并test分支
rabase
合并test分支到dev,不会产生新的提交记录
git rebase dev // 在test分支操作
git checkout dev // 切换到dev
git merge test // 合并test
git push // 推送到dev远程
git branch -d test // 合并完成后删除test分支
标签管理
| 场景 | 命令 | 场景 | 命令 |
|---|---|---|---|
| 创建标签 | git tag -a 'v1.0' -m '创建v1.0标签' | 删除本地标签 | git tag -d v1.0 |
| 推送标签 | git push origin v1.0 | 基于标签创建分支 | git branch branch-name tag-name |
| 删除远程标签 | git push origin :refs/tag/v1.0 | 拉取远程标签 | git fetch origin tag v1.0 |
版本日志
| 场景 | 命令 | 场景 | 命令 |
|---|---|---|---|
| 查看日志 | git log --oneline -n4 --all --graph | 查看可视化工具 | gitk |
版本回退
回退到某次提交
回退到某次提交,会删除之前的所有改动(使用时需要注意)
git reset --hard commitId // 回退到某个版本
git reset --hard HEAD^ // 回退到上个版本
git reset --hard HEAD~3 // 回退到前3次提交之前
git push -f origin master // 强推送至远程
回退到某个commitID之后,想把当前的版本推送到远程,需要使用强制命令,普通的推送命令会提示先执行pull命令,这是由于远程的commit比本地的commit要领先,所以不能直接提交
回退到某个版本 在此基础上建立新分支
git checkout commitID命令让HEAD指向了某一个特定的commit点,而不是指向分支的顶点,此时它不属于任何的分支(是一个游离的状态)
如果在此基础上修改后进行add和commit,HEAD会指向一个游离的分支,当切换分支后,此游离分支就会自动消失
git checkout commitId // 切换到某个特定commitId
git switch -c newBranch // 在commitId基础上创建一个新的分支
版本对比
工作区和暂存区
git diff
git diff file
暂存区和版本库(HEAD)
git diff --cached
commit和branch
git diff commit1 commit2
git diff branch1 branch2 file