当前位置:   article > 正文

一文详解工作中的git操作_git 工作区 暂存区 本地仓库

git 工作区 暂存区 本地仓库

1. 工作区、暂存区、本地仓库

首先看图:
暂时无法在飞书文档外展示此内容

  • 工作区(Workspace)
    • 我们进行开发的地方,第一时间在页面上看到的数据就存在工作区(任何对象都是在工作区诞生和修改)
    • 新建的文件必须使用git add添加到工作区后才会被git追踪,git的一些指令才会对其生效
  • 暂存区( Index / Stage)
    • .git目录下的index文件, 暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp…),不保存文件实体, 通过id指向每个文件实体
    • 只有将工作区代码提交到暂存区,git才开始通过版本管理控制你的代码(生成SHA-1 标识)
  • 本地仓库 (Repository)
    • 保存暂存区commit上来的代码,任然是存到你的本地磁盘上
    • 在指定目录下git init就会初始化本地仓库,生成.git目录
  • 远程仓库 (Remote)
    • 共享多个仓库协同者从本地仓库push上来的代码,这时候的代码数据已经记录在git云端了

为什么有个本地仓库还有一个暂存区?

  1. 在我看来暂存区是git为了解耦而存在的,本地仓库保存着你这一次提交代码的整体快照,记录了一个版本,可以直接回退到历史指定版本
  2. 暂存区是用来对修改文件的管理,你可以选择的提交某一个文件,也可以选择提交多个文件,提供了更加颗粒化的管理制度,这也是git的一个特色
  3. 可以理解为暂存区用来存储用户每天某一个阶段的工作量,本地仓库用来存储用户这一天的整体工作量

2. 常用指令

git指令非常的多,下面是列举了一些仓库合作模式下经常用到的指令和这些指令常用的一些语法
有兴趣的可以看看git官方文档:https://git-scm.com/book/zh/v2

2.1 git remote

管理远端仓,origin可调整,比如设置为"公共仓",“个人仓”,等等
工作中一般初始化找个目录git clone一下,就自动给你链接好远程地址了

#修改远端仓
git remote set-url origin [url]
 
#添加远端仓
git remote add origin [url]
 
#删除远端仓
git remote rm origin

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.2 git branch

管理分支

#列出本地所有的分支,当前检出的分支后面会带*(星号),Git Bash终端会高亮显示
git branch
 
#查看远端所有的分支
git branch -r
 
#查看本地和远端所有的分支
git branch -a
 
#新建本地分支(不切换到该新分支)
git branch [分支名]
 
#重命名分支名(m非强制,M强制)
git branch -m|-M [旧分支名] [新分支名]
 
#删除分支(d非强制,D强制)
git branch -d|-D [分支名]
 
#强制删除远端分支(不提交,远端仓会不生效)
git branch -d -r [分支名]
git push origin:[分支名]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

2.3 git add

#添加单个文件到暂存区
git add [filename]
 
#添加多个文件到暂存区
git add file1, file2, file3
 
#添加指定目录文件及其子目录文件到暂存区
git add dir
 
#添加当前目录文件及其子目录下所有新增、删除的文件到暂存区
git add .

#添加修改的文件到暂存区(不会添加新建、删除的文件)
git add -u

#添加所有新增、修改和删除的文件。(git add .与git add -u的结合)
git add -A
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

2.4 git commit

#提交暂存区内的所有文件
git commit -m '描述'

#自动暂存修改的文件(省略git add操作),并提交到本地仓库(只会暂存被git追踪的文件,如新增的文件,还未被追踪就不会被暂存)
git commit -a -m "描述"

#修改上一次提交的提交描述
git commit --amend -m "新的描述"

#提交指定文件,可指定多个
git commit [file1] [file2] -m "描述"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.5 git pull

#拉取远端仓,默认拉取当前分支对应的远端仓分支
git pull
 
#指定origin远端仓develop分支
git pull origin develop
 
#指定公共远端仓master分支
git pull [公共仓url] master
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.6 git fetch

#拉取所有分支的更新,但不与本地代码合并
git fetch
 
#更新指定origin远端仓develop分支
git fetch origin develop
 
#更新指定公共远端仓master分支
git fetch 公共仓 master
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.7 git diff

diff代码改动

#diff工作区和暂存区
git diff

#diff本地仓库与工作区
git diff HEAD

#diff暂存区和本地仓库
git diff --cached

#将本地仓库的feature1和feature2进行diff
#如果feature1是远程分支的话,那么就是feature2的本地仓库与远程diff
git diff [feature1] [feature2]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.8 git merge

一般git fetch和git merge一起使用

#合并远端仓,默认合并当前分支对应的远端仓分支到本地
git merge
 
#合并指定origin远端仓develop分支
git merge origin develop
 
#拉取指定远程仓库的指定分支的更新信息
git fetch <remote> <branch>
 
#合并本地其他分支
git merge develop
git merge master
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

和merge对应的有个rebase(变基),通常不推荐使用,rebase会导致此前的提交信息丢失,为了保留此前的提交记录信息,通常使用merge
建议养成先commit再merge的好习惯,因为如果merge出错了,也能通过commit-id撤回

2.9 git push

#推送到远端仓,默认推送当前分支对应的远端仓分支
git push
 
#推送到指定origin远端仓develop分支
git push origin develop
 
#推送到指定公共远端仓master分支
git push 公共仓 master
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.10 git checkout

切换分支、撤销修改
git checkout的撤销命名尽量慎用

#新建本地分支&切换到该新分支
git checkout -b [分支名]
 
#以远程指定分支代码在本地新建一个分支
git checkout -b [本地分支名] origin/[远程分支名]

#切换到指定分支或指定版本号
git checkout [分支名 or 版本号]

#恢复暂存区修改或删除的文件,只能对存量文件生效,新增的文件因为没有被git追踪所以不生效
git checkout [文件名]

#强制将工作区和暂存区都恢复到指定分支或者提交记录的状态,未被git追踪的文件不会改变
git checkou -f [文件名]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.11 git reset

回退add和commit,有以下三种策略

  • soft:撤回之后所有内容全部放进暂存区,软回退策略
  • mixed:撤回之后所有内容全部放进工作区中,默认回退策略
  • hard:撤回并清空工作目录及暂存区所有修改,硬回退策略
    建议使用–soft
#默认mixed,回退到工作区
git reset
 
#回退当前版本的暂存区
git reset --soft HEAD~

#从本地仓库直接回退到当前版本的工作区
git reset HEAD~

#撤回并清空工作区和暂存区的所有修改,如果有新增的文件会直接删除
git reset --hard HEAD~

#将本地分支重置到与指定远程分支相同的提交,并强制替换本地更改[使用之前最好git fetch一下,拉取最新改动]
git reset --hard origin/qingfan
 
#回退到上上个版本的暂存区(如果有2次commit操作,会直接将这2次commit的文件全部撤回到暂存区)
git reset --soft HEAD^^
git reset --soft HEAD~2
 
#回退到指定提交,commit-id 可以通过 git log 查找到
git reset --soft [commit-id]
 
#查看暂存区/工作区的代码
git status
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

2.12 git log
只记录commit的记录,每个提交记录包括了commit-id、提交者、提交时间、提交说明等信息

#查看提交记录
git log
-n: 限制输出结果数量。例如 git log -n 5 只会显示最近的 5 条提交记录。
--author: 按照作者过滤提交记录。例如 git log --author=qingfan 只显示由 qingfan 提交的记录。
--since 和 --until: 按照时间范围过滤提交记录。例如 git log --since=2021-01-01 --until=2021-06-30 只显示在 2021 年上半年提交的记录。
--grep: 按照提交说明中包含的关键字过滤提交记录。例如 git log --grep="bug fix" 只显示提交说明中包含 "bug fix" 关键字的记录。
--pretty: 自定义输出格式。例如 git log --pretty=format:"%h %s [%an]" 只显示提交 ID、提交说明和作者名。
 
#退出查看
q
 
#翻页,按键盘即可
page up
page down
↑
↓
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

更多命令请看git log命令全解析

2.13 git reflog

查看 Git 引用日志,每个记录包含了操作的哈希值、引用名称(如 HEAD、master 等)、操作类型(如 commit、reset 等)以及操作说明

#显示当前仓库最近的操作记录列表
git reflog
按q退出
  • 1
  • 2
  • 3

2.14 git cherry-pick

git魔法,可以选择某个提交合并到当前分支中

#将commit-id合并到当前分支
git cherry-pick [commit-id]

#将commit-id1和commit-id2合并到当前分支
git cherry-pick [commit-id1] [commit-id2]

#将feature分支的最近一次提交,合并到当前分支。 
git cherry-pick feature

 #将commit-id1到commit-id2及之间的所有提交记录合并到当前分支,必须确保commit-id顺序
git cherry-pick [commit-id1]..[commit-id2]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3. 开发中常见的情况

3.1 push远程自己的分支失败

小A在本地修改了2.json文件,
[图片]

准备上传远程自己的分支仓库。但是在执行push后发现报错了
[图片]

从报错信息来看就是本次的提交和远程仓库的代码冲突了。因为这个文件已经被小B修改并先一步提交了(小B干坏事,往你的仓库push了代码)
在这里插入图片描述

这时小A需要查看本地哪些代码与远程冲突了

#1. 拉取远程最新代码
git fetch

#2. 查看diff
git diff origin/qingfan qingfan

注意:这里也可以直接使用git pull来代替git fetch+git diff。
但是不建议这么做,因为git pull会直接拉取最新代码与本地代码进行合并,最好还是先git fetch后看看哪些代码有冲突
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

知道了代码冲突的地方后,有2种决定:

  1. 强制提交本地代码,覆盖远程代码,这会导致远程仓库小B的修改丢失,这需要慎重操作,一定要协商好

    git push -f
    
    • 1
  2. 解冲突,商量好保留谁的代码,然后重新commit+push

    #1.先merge代码,然后在本地修改冲突
    git merge origin/qingfan 
    
    #2.本地解冲突
    
    #3.提交远程
    git add .
    git commit -m "描述"
    git push
    
    #4.申请合码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

3.2 放弃本地修改的代码

  1. 本地修改还没有提交

    #撤销工作区的修改
    git checkout 文件名
    
    #撤销工作区和暂存区的所有修改,新增的文件会被删除
    git checkout -f
    
    • 1
    • 2
    • 3
    • 4
    • 5
  2. 本地修改已经提交了,但未push

    #1.先撤销commit
    git reset HEAD~
    
    #2.放弃修改,撤销工作区和暂存区的所有修改,新增的文件会被删除
    git checkout -f
    
    • 1
    • 2
    • 3
    • 4
    • 5
  3. 更暴力的,不管本地代码提交与否

    #将本地分支重置到与指定远程分支相同的提交,并强制替换本地更改
    git reset --hard [指定远程分支]
    
    • 1
    • 2

3.3 撤销pull

适用于在本地pull错了代码,或者我不想要这次pull到的最新代码,想要撤销回退到pull之前的那一次提交代码

#1.使用git log或者git reflog查看上一次提交的commit-id
git log 
git reflog

#2.回退到上一次提交的代码
git reset --hard [commit-id]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

tips:因为会根据commit-id来回退,所以养成在pull之前先把本地的最新改动提交到本地仓库后再pull代码,这样即使你pull错了代码也能回退,并且你本地的修改也不会丢失

3.4 撤销add

#撤销所有add的文件
git reset HEAD .
#或者 
git reset .

#撤销指定文件
git reset [文件名]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.5 撤销commit

#回退当前版本的暂存区,只撤回了commit操作,没有撤回add
git reset --soft HEAD~

#从本地仓库直接回退到当前版本的工作区,连同add操作一起撤回了
git reset HEAD~

#撤回并清空工作区和暂存区的所有修改,如果有新增的文件会直接删除
git reset --hard HEAD~
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.6 撤销merge

#1.使用git log或者git reflog查看上一次提交的commit-id
git log 
git reflog

#2.回退到上一次提交的代码
git reset --hard [commit-id]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.7 撤销push

想要撤销上一次push到远程自己的分支,但是还没有申请合码的代码

# 查看提交信息,获取需要回退至的版本号(commit-id)
git log 

# 工作区和暂存区也会回退到某个版本(会导致你的代码丢失)
git reset --hard  版本号 
# 如果不想丢失代码,只想单纯的撤销这一次push,推荐使用这种方式,会将代码撤回到暂存区,不会丢失任何数据
git reset HEAD~

# 确认是否成功撤销
git log 

# 强制提交当前版本号
git push origin qingfan --force 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.8 优雅的提交代码到远程

#查看一下当前开发分支是否是自己的分支
git branch

git add .

git commit -m ""

#拉取远程最新代码
git fetch origin

#将本地最新改动与远程最新代码进行diff,大致看看哪些文件发生了改动
git diff origin/master [you-feature]

#合并远程仓库最新代码,有冲突就解冲
git merge origin/master  或者   git pull origin master

#解决完冲突后看看文件改动,也能确认一下是否所有冲突都解决完了
git status  #有文件改动就再次add和commit

#最后push上去,一般都是先push到远程自己分支在申请合码
git push origin [you-feature]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/491703
推荐阅读
相关标签
  

闽ICP备14008679号