git 使用(基础操作篇)

avatar
前端菜鸡 @荣怀

从使用场景出发,来理解,命令的使用,不要杠为什么不用图形操作界面,杠就是你对

首先来了解一下几个基本概念

  • 工作区:workspace
  • 暂存区:Index/Stage
  • 本地仓库:Repository
  • 远程仓库:Remote

【图1】

image.png

使用场景

阿珍上手接到一个需求,这是一个全新的需求,在她公司的代码管理平台(以gitlab为例)上没有创建分支的,这个时候,阿珍需要本地创建项目并上传到gitlab上,阿珍做了以下操作

1. 创建远程仓库

  • 平台创建,不展开说了

2. 初始化本地仓库

git init
  1.  在本地项目所在文件夹,调用终端执行git init命令,初始化本地仓库
  2.   初始化了以下存储空间
image.png

3. 与远程仓库建立连接并进行第一次代码提交

git remote add origin http://xxxxxx.git(你远程仓库地址)

至此本地仓库已经有了git自动创建的第一个master分支
1. git status 命令查看工作区和暂存区的文件状态
  • Untrached file

    未追踪过的文件,理解为新增的还没进行git提交过的文件

  • Changes not staged for commit

    文件已修改,还没放入暂存区,未add过的修改

  • Changes to be committed

    文件已存入暂存区,即将被提交到分支 已经add过没有commit的改动

2. git add .将未提交的文件提交到暂存区(可参考图1)
   比如,工作区修改AB、C文件
image.png
  •  git add . 提交所有改动到暂存区
    
    image.png
  •  git add A B 提交A B 文件到暂存区
    
    image.png
  •  git add dir
    
    提交一个文件夹到暂存区,效果与上面类似,文件替换为文件夹
    

暂存区有个目录树,每次提交add后,目录树会更新,并存储一个指向本次修改文件内容的ID引用

3. git commit 提交版本到本地仓库
  将暂存区的文件提交到本地仓库对应分支(可参考图11.  git commit -m 'xxx' 将所有暂存区的文件提交到本地分支
    1.  git commit A -m 'xxx' 将暂存区A文件提交到本地分支
image.png
4. git push 提交到远程分支
git push origin master 将本地仓库master分支推送到远程仓库(可参考图1

4. 各种常规操作

1. 创建、切换本地分支
    git branch dev 以当前分支为基础在本地创建dev分支
    git checkout dev 切换到dev分支
    git checkout -b dev 合并命令,以当前分支为基础在本地创建dev分支,并切换到dev分支
  • 以下几种情况请注意:
    1.  当前分支有新增文件,且未追踪过,即未提交到暂存区(未add),切换分支时新增的文件会一直存在于工作区,直到进行提交到暂存区操作。
    2.  当前分支有修改文件,且未提交到暂存区,切换分支时,需要先将本地代码提交到 暂存区或者堆栈,然后git才允许切换分支
    
image.png
2. 暂存修改到stash栈
 1.git stash 
 将当前改动存储到stash仓库(将本地修改过未提交的A文件stash一下)工作区的改动会清除并存储到stash仓库里,原工作区A文件改动将还原
image.png
    如果继续修改B文件后git stash,git会以栈的形式存储B到stash仓库,原工作区B文件改动将还原
image.png
2.git stash pop 
将stash 仓库中的最近的一次改动记录推出到工作区,以上图为例
image.png

git stash pop 等于 git stash pop @stash{0} 0是stash的编号,最近的一次为0,往后类推为1,2...

3.git stash apply 将stash堆栈中的内容恢复到工作区,且在stash堆栈中仍旧保留内容

与stash pop不同,stash pop不会保留内容

4.git stash list 查看stash堆栈中的多有内容
3. 撤销修改
  • 撤销已经修改,且未提交到暂存区的文件 (已修改,未add
    •   git checkout 用暂存区上一次add的全部或指定文件替换工作区的文件
        1.  git checkout . 撤销所有修改
        2.  git checkout file 撤销file文件的修改
      
    • git restore file 撤销工作区的修改返回到最近一次暂存区的版本(需指定要restore的文件)
      
  •  撤销已经提交到暂存区的文件(已add
    //撤销你在暂存区的提交,工作区文件不变 
    git restore --staged file 
    //从暂存区删除文件,工作区不做改变,修改内容还存在 
    //此操作,将文件从暂存区删除了,但是工作区还保留着修改状态,git会将此识别为未追踪过的修改文件 
    git rm --cached file
    
  • 撤销已经提交到本地分支的文件(已commit)
    
      首先查看版本号,确定要撤销的版本
      然后再进行回退操作
    
    • 查看版本号

      1.git log 查看commit版本
      查看当前分支提交过的版本信息(如果版本回退导致的删掉的操作记录不会保存
      2.  git reflog
      查看当前分支所有提交过的版本信息,包含回退版本删除的操作记录
      【小tip】 git log --oneline/git reflog --oneline提交信息一行展示更加便于阅读
      
    image.png
    • 回退版本

      • git reset
      //回退到上一个提交版本 
      git reset --hard HEAD^ 
      //回退到上上个版本,上上上个版本^^^以此类推 
      git reset --hard HEAD^^ 
      //回退到指定目标版本d8bf4c7,并将工作区内容替换为版本内容,修改的内容不会放入暂存区 
      git reset --hard d8bf4c7
      
       执行git reset --hard d8bf4c7
       再次查看git log,d8bf4c7版本之后的提交记录都清除掉了
      
      image.png
        如果git reflog 查看,之前的记录都还在
      
      image.png
      • git revert(推荐)
        
         git revert -n [指定版本号]
         //revert会回退到指定版本号,并且不会覆盖操作记录,再次提交后,会生成一个最新的版本在前面。
         git revert -n d8bf4c7
        

      image.png

         git commit -am 'rever'
      
image.png
4. 删除分支
   git branch -d branchName
5.拉取远端代码
  • git fetch 
    拉取远程仓库的所有分支同步到本地仓库
    
  • git pull
    拉取远程仓库代码并合并本地的版本
    git pull = git fetch + git merge
    
    //将远程仓库origin 的 master 分支拉取过来,与本地的 brantest 分支合并
    git pull origin master:brantest
    //如果是与本地当前分支合并,可以省略冒号后面的分支名
    git pull origin master        
    
image.png

专栏下一篇展开讲解关于git的分支管理