-->
侧边栏壁纸
博主头像
断钩鱼 博主等级

行动起来,活在当下

  • 累计撰写 28 篇文章
  • 累计创建 34 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

版本控制工具 - Git的使用

halt
2021-10-25 / 0 评论 / 0 点赞 / 1507 阅读 / 0 字

Git的使用

以前使用git总是在IDEA里使用集成的可视化面板操作,今天梳理了以下常用的命令以及基本概念

基本概念

我们先来理解下 Git 工作区、暂存区和版本库概念:

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

img

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。

  • 图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

  • 图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。

  • 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

  • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

  • 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

  • 当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。

  • 当执行 git checkout . 或者 git checkout -- 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。

  • 当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

    来自: https://www.runoob.com/git/git-workspace-index-repo.html

安装

配置

  • git config 作用域

    # 仅对某个仓库有效
    git config --local
    # 对当前用户的所有仓库有效
    git config --global 
    # 对所有用户的所有仓库有效
    git config --system
    
  • git config --list --作用域 即可查看配置信息

    # 例如:
    git config --list --global
    

    查询配置

  • 配置提交代码时的用户信息

    git config --global user.name '用户名'
    git config --global user.email '邮箱'
    

    image-20211024190227712

常用命令

创建仓库

  • 已有项目

    # cd 进入 项目文件夹
    cd /home/dev/项目
    # 初始化仓库
    git init
    
    
  • 新项目

    # 初始化仓库
    git init [项目]
    
    
  • 拉取远程仓库代码

     git clone [url]
     # url : 远程仓库地址
    

提交与修改

  • 加入git暂存区

    # 加入git暂存区
    git add [name|path]
    # name : 文件名或者文件夹 . 代表当前文件夹下所有文件
    
    
  • 查看当前仓库状态 并显示变更信息

    # 查看当前仓库状态 并显示变更信息
    git status [-s]
    # -s : 输出简要信息
    

    添加管理并查看状态

  • 比较文件的不同

    # 尚未缓存的改动
    git diff
    # 查看已缓存的改动 
    git diff --cached
    # 查看已缓存的与未缓存的所有改动
    git diff HEAD
    # 显示摘要而非整个 diff
    git diff --stat
    
    
    # 显示暂存区与工作区的差异
    git diff [file]
    
    # 显示暂存区和上一次提交(commit)的差异
    git diff --cached [file]
    # file : 文件
    
    # 显示两次提交的差异
    git diff [first-branch]...[second-branch]
    
    # 显示摘要
    git diff --stat
    
  • 将暂存区文件提交到本地仓库

    # 从暂存区提交到本地仓库
    git commit -m '提交说明'
    # 添加-a 命令则直接从工作区提交了变更到本地仓库
    git commit -am '提交说明'
    
    

    提交到本地

  • 删除文件

    # 删除工作区文件
    git rm <file>
    # -r : 递归删除
    # -f : 强制删除 工作区 暂存区 本地仓库都会删除
    # --cached : 从暂存区删除 停止跟踪
    
    
  • 版本回退

    # 回退
    git reset [--soft | --mixed | --hard] [HEAD]
    
    # --mixed : 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变
    git reset HEAD^            # 回退所有内容到上一个版本  
    git reset HEAD^ hello.php  # 回退 hello.php 文件的版本到上一个版本  
    git  reset  052e           # 回退到指定版本
    
    # --soft : 参数用于回退到某个版本
    git reset –hard HEAD~3  # 回退上上上一个版本  
    git reset –hard bae128  # 回退到某个版本回退点之前的所有信息。 
    git reset --hard origin/master    # 将本地的状态回退到和远程的一样 
    
    # --hard : 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
    git reset –hard HEAD~3  # 回退上上上一个版本  
    git reset –hard bae128  # 回退到某个版本回退点之前的所有信息。 
    git reset --hard origin/master    # 将本地的状态回退到和远程的一样
    
    

    注意:谨慎使用 –hard 参数,它会删除回退点之前的所有信息。

    HEAD 说明:

    • HEAD 表示当前版本
    • HEAD^ 上一个版本
    • HEAD^^ 上上一个版本
    • HEAD^^^ 上上上一个版本
    • 以此类推...

    可以使用 ~数字表示

    • HEAD~0 表示当前版本
    • HEAD~1 上一个版本
    • HEAD^2 上上一个版本
    • HEAD^3 上上上一个版本
    • 以此类推...
  • 移动文件

    git mv 命令用于移动或重命名一个文件、目录或软连接。

    git mv [-f] < file > < newfile >
    # -f : 强制重命名、移动 如果存在则会覆盖掉原来的文件
    
    

提交历史

远程操作

  • 远程仓库操作

    # 查看所有的远程仓库
    git remote -v
    
    # 显示某个远程仓库的信息
    git remote show [别名]
    
    # 添加远程仓库
    git remote add [别名 origin] [url]
    
    # 删除远程仓库
    git remote rm name 
    
    # 修改仓库名
    git remote rename old_name new_name  
    
  • 拉取远程仓库的代码&并对本地仓库进行合并

    # 拉取远程仓库代码
    git fetch [origin] [branch]
    # 将拉取下来的代码进行合并 
    git merge [origin]/[branch]
    
    
    # 最好在git fetch 后进行 git diff 查看区别 确认无误后再次进行合并
    git diff [localBranch] [origin]/[branch]
    
    # 拉取远程代码并进行合并
    git pull <origin> <branch>:<localBranch>
    # 如果要远程分支名和本地分支名一样则不需要添加localBranch
    # origin : 远程仓库别名
    # branch : 远程分支名
    # localBranch : 本地分支名
    
  • 本地分支与远程分支合并

    # 推送到远程
    git push [--force] <远程主机名> <本地分支名>:<远程分支名>
    # --force : 强制推送
    # 如果要推送的远程分支名与本地分支一致则不需要添加远程分支名
    
    
  • 删除远程分支

    git push <远程主机名> --delete <远程分支名>
    
    

分支管理

  • 创建分支

    # 创建分支
    git branch <branch>
    
  • 切换分支

    # 切换分支
    git checkout <branch> 
    # 创建并切换分支
    git checkout -b <branch>
    
  • 删除分支

    # 删除分支
    git branch -d <branch>
    
  • 合并分支

    # 将指定分支合并到当前分支
    git merge <branch>
    
0
git
博主关闭了所有页面的评论