当前位置: 代码迷 >> 综合 >> Git命令结合工作区/暂存区/版本库的贯穿理解(rebase OR merge 场景解析版)
  详细解决方案

Git命令结合工作区/暂存区/版本库的贯穿理解(rebase OR merge 场景解析版)

热度:69   发布时间:2023-12-25 08:22:24.0

导语:本文主要对Git安装,工作区/暂存区/版本库结合Git命令的理解(比如“git diff HEAD”命令到底是对比的工作区还是暂存区与版本库的区别?),以及什么场景用什么命令(比如“如果想恢复版本库中已经删除的某个版本的指定文件怎么做?”),rebase和merge区别……如果看完有用请点个赞吧!

一、Git安装

比官网快100倍的安装地址:Git安装戳我

下载完成后直接在你需要创建库的文件夹中,鼠标右键选择“Git Bash Here”即可,接下来配置用户信息:

#配置用户信息
$ git config --global user.name "xxx"
$ git config --global user.email "xxx@xxx.com"
#常用文件操作命令,和Linux命令一样
#在当前路径下创建learngit文件夹
$ mkdir learngit
#打开learngit文件夹
$ cd learngit
#返回上一级
$ cd ..
#查看文件内容
$ cat readme.txt
#删除文件
$ rm readme.txt

二、常用命令场景

循序渐进,结合注释场景轻松理解

#把当前目录初始化成版本库
$ git init
#将文件从工作区添加到暂存区
$ git add readme.txt
#一次性添加多个文件到暂存区
$ git add readme.txt test.txt
#将暂存区的“所有”文件提交到版本库
$ git commit -m "add readme"
#将暂存区的“指定”文件提交到版本库
$ git commit -o readme.txt -m "add readme"
#查看仓库状态
$ git status#查看工作区或暂存区文件与版本库里最新版本的区别(当工作区和暂存区都存在该文件时,优先对比工作区与版本库的区别)
$ git diff HEAD -- readme.txt
#当你在工作区修改完文件后悔了,可以用以下命令恢复到修改前的状态。但如果此时暂存区也有该文件(即你之前将文件add到暂存区没有commit),则会以暂存区的文件为标准进行恢复
$ git checkout -- readme.txt
#当你在工作区修改完文件而且已经add到暂存区,突然你后悔了,可以用以下命令将add操作撤回,再用上面的checkout恢复即可
$ git reset HEAD readme.txt
#已经将文件提交到版本库,这时你后悔了,可以直接使用版本回退,HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,再往上可以用HEAD~3的形式
$ git reset --hard HEAD^
#如果回退完你后悔了,又想回到刚才提交完的版本(即未来的版本),或者想回到很久以前的版本,可以通过commitId实现
$ git reflog 历史执行过的命令记录,找到需要的commitId(如22d46…)
$ git reset --hard commitId 到你想到的任何地方
$ git push -f 如果是要回退远程版本,回退完本地版本后再执行强制推#删除版本库里没有的还在工作区的新文件(当然也可以手动删除)
$ rm readme.txt
#删除版本库里没有的但已经add到暂存库的新文件,-f表示强制删除
$ git rm -f readme.txt
#删除版本库里已经存在的文件
$ git rm readme.txt
$ git commit -m "remove readme.txt" 提交更改记录
#删除版本库里已经存在的且最新修改的版本已经add到暂存区的文件
$ git rm -f readme.txt
$ git commit -m "remove readme.txt"
#恢复版本库中已经删除的某个版本的指定文件
$ git log --pretty=oneline 查找需要的commitId
$ git reset commitID readme.txt
$ git checkout -- readme.txt 将文件从暂存区拿回到工作区
$ git add readme.txt
$ git commit -m "repair readme.txt"

三、远程与分支

  • 分支使用场景:
  • master分支 正式版
  • dev分支 作为公司日常开发,个人开发会从dev上再拉一个工作分支,开发完成后合并到dev
  • bug分支 专门修复bug
  • feature分支 开发新功能
#关联远程库,第一个github是给远程库起的名称,panda-code是远程库用户名,learngit表示仓库名
$ git remote add github git@github.com:panda-code/learngit.git
#删除远程库
$ git remote rm github
#查看远程库信息
$ git remote -v
#克隆远程库到本地
$ git clone git@github.com:panda-code/learngit.git
#创建远程dev分支到本地,因为默认只会clone master
$ git checkout -b dev github/dev
#第一次pull某个分支前需要指定本地分支与远程分支的链接
$ git branch --set-upstream-to=github/dev dev
#抓取远程分支
$ git pull
#第一次向远程推送该分支,-u会把本地dev分支和远程dev分支关联起来,之后pull就不需要再建立链接
$ git push -u github dev
#向远程推送分支
$ git push github dev#直接将远程git仓库里的指定分支拉取到本地(本地不存在的分支)
$ git checkout -b 本地分支名 origin/远程分支名
#创建分支
$ git branch dev
#切换分支
$ git switch dev
#创建并切换到dev分支
$ git switch -c dev
#查看所有分支
$ git branch
#删除分支
$ git branch -d dev
#强行删除分支
$ git branch -D dev#保存工作现场
$ git stash
#查看之前保存的工作现场内容
$ git stash list
#恢复工作现场
$ git stash apply
#恢复指定的工作现场内容
$ git stash apply stash@{0}
#恢复完工作现场将stash删除
$ git stash drop
#恢复的同时把stash删掉
$ git stash pop#查看所有标签
$ git tag
#查看指定标签信息
$ git show v1.0
#打标签记录版本号
$ git tag v1.0
#根据commitId打标签
$ git tag v1.0 f52c
#打标签的同时为标签创建文字说明
$ git tag -a v1.0 -m "version 0.1 released" 1094a
#推送指定标签到远程
$ git push github v1.0
#推送所有标签到远程
$ git push github –tags
#删除标签
$ git tag -d v1.0
#删除远程标签
$ git tag -d v1.0
$ git push github :refs/tags/v1.0

四、merge与rebase

对于rebase还懵懵懂懂的同学推荐看:Git-变基和Git rebase

#merge合并dev分支到当前分支上
#该命令会有合并提交记录并且能保存分支历史,缺点是会有分叉,分支多了分支图就会看起来很乱
$ git merge --no-ff -m "merge with no-ff" dev
#以下命令会有合并提交记录并且能保存分支历史,最关键的是它不会产生分叉
$ git merge --squash dev 极力推荐
$ git commit -m "merge with squash"#在master或者dev分支上修复了一个bug或者改了文件,想把它同步到当前分支
$ git cherry-pick commitId#rebase使用原则:不要对已经push到远程过的东西执行rebase 
#国内大部分公司很少用,因为它不能进行历史回溯,对于使用场景是有要求的,但也不可否认它清爽的优势,所以到底使用merge还是rebase是一个有争议的话题,我个人平时用的“merge --squash”比较多
#rebase使用流程,比如将dev分支合并到master分支
$ git switch dev
$ git rebase master
$ git switch master
$ git merge dev
#rebase过程中可能出现冲突,此时需要手动解决冲突add即可,不需要commit,然后继续rebase
$ git rebase --continue
#终止rebase,并且分支会回到rebase前的状态
$ git rebase --abort

五、效率Tips

在Git工作区创建.gitignore文件,然后把不想上传要忽略的文件名填进去,github已经为我们准备了各种类型的.gitignore文件,组合使用即可,同时记住要commit该文件,想获取.gitignore文件戳我

#当需要添加到git的文件被忽略的时候,可以-f强制添加
$ git add -f App.class
#或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了
$ git check-ignore -v App.class

每次输入的命令很繁琐,想偷懒可以配置个缩写

#用st表示status,以后git st==git status
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
#显示最近一次提交信息
$ git config --global alias.last 'log -1'
#配置一个历史分支合并图缩写,以后直接git lg就很舒服
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
#想查看所有分支
$ git lg --all

如果对命令操作已经相当娴熟,可以换个可视化界面工具了。获取sourcetree戳我

  相关解决方案