git的一些基础与常用命令

本文介绍了Git的三个主要区域:工作区、暂存区和版本库,详细讲解了文件如何在这些区域间流转,包括add和commit的操作。此外,还提到了Git的分支管理和版本回退,并列举了一些常用的Git命令,如创建分支、切换分支、版本回退等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

git
git的三个区:
  • 工作区,可用ls指令查看(当前文件的内容);

  • 暂存区,可用git ls-files --stage 查看(add之后git会生成一个序列号把当前文件的状态保存并记录起来,放到暂存区,暂存区储存的格式就是<文件模式代码> <文件的SHA-1哈希值(序列号)> <该文件的暂存号> <原始文件名>

  • 版本库,可用find 目录 -type f查看(commit之后会将文件提交到版本库,产生版本快照,可以通过敲命令回溯到对应版本)

也就是说,

  1. 当我们只在工作区进行编辑的时候(不使用add指令),内容是没有保障的,只能在当前的基础上修改,出现错误后需要重新定位查找,然后修改覆盖。

  2. 当使用add指令将文件提交到暂存区之后,git会进行两步操作。

    • 首先是给每个文件生成一个SHA-1哈希值,然后把文件的信息添加到暂存区
    • 对暂存区进行快照,将暂存区的索引和对应文件的完整内容添加到版本库的objects文件中
  3. 使用commit指令后,才算真正实现了一个版本的管理。这时候版本库中有两个文件,一个是tree树对象,一个是commit对象

    git另一种对象为blob对象,是用于存储文件内容的对象,当我们用git cat-file -t 序列号对暂存区的文件进行文件类型查询时,显示的结果就是blob

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ezpr1haC-1655541138817)(C:\Users\19120\AppData\Roaming\Typora\typora-user-images\image-20220617172253156.png)]

  1. 修改文件并add添加到暂存区时,暂存区中会生产新的SHA-1哈希值作为版本号覆盖旧的对应文件(发生了修改的),但是在版本库中,改变了的文件会生成一个新的blob对象来存储,而非覆盖,这样可以方便回溯任意版本。

  2. 第二次commit提交时,版本库中也是新增了两个对象,只是内容不同:树对象中将改变过后的文件进行更新,commit对象中多了一个指向前一个版本的commit对象的索引。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFRFeA90-1655541138817)(C:\Users\19120\AppData\Roaming\Typora\typora-user-images\image-20220617173601730.png)]

这里是简单总结,如果觉得讲的不清楚想看详细的内容,推荐阅读这篇文章Git学习笔记一:Git仓库结构及版本管理流程 (qq.com)

git分支

分支的本质就是指针,有了分支我们可以随心所欲的写自己的idea,如果确认可行之后,再将他合并到主分支上;不可行也不会影响原本的代码。

  • 创建分支:git branch 分支名,git init初始化仓库时默认创建并处于master分支

  • 切换分支:git checkout 分支名(已创建)

  • 创建并切换到新分支:git checkout -b 分支名

  • 查看当前分支:cat .git/HEAD

  • 查看分支下的文件:git show-ref 分支名

  • 从当前分支切换到另一个分支,但是当前内容未完成,并不想add增添新版本,git stash将工作区和暂存区内容一起存储到git栈中,这样切换分支很安全(不会丢失当前工作的内容)。流程:

    git stash(存储到git栈) -> git stash list(用于获取git栈上的情况,得到存储栈的编号,假设为stash@{0}) -> git checkout master(切换分支) -> 在master分支上完成修改、add、commit -> git checkout branch(切换回原分支) -> git stash apply tash@{0}(从栈中取出数据) -> 完成修改、add、commit -> git stash drop stash@{0}(丢弃原栈中的内容)

    $ git stash # 把当前分支branch的工作区和暂存区保存到git栈上
    
    $ git stash list # 查看当前git栈上的情况
    
    $ git checkout master # 切换到master分支
    
    $ echo 'back' > test.txt # 在master上开发,修改,提交
    $ git add test.txt
    $ git commit -m '1 commit in master'
     
    $ git checkout branch # 切回branch分支
    
    $ git stash apply stash@{0} # 取出对应栈的数据,用于恢复当前工作区和暂存区
    
    $ git add test2.txt # 继续完成刚才的工作,然后把最终完成的test2.txt提交上去
    $ git commit -m '2 commit in branch'
     
    $ git stash drop stash@{0} # 此时确定栈上数据不要了,就可以推出栈。
    #也可以用git stash pop一步完成取出到删除。
    
git版本

git就是作为版本管理工具被我们熟知,非常强大,既可以实现版本的回退,也可以实现文件的回退

  1. 版本回退:

    • git reset (--mixed) 版本号 mixed为reset的默认方式,可恢复为现有版本,移动过程中HEAD和mater都移动到目标版本号位置。
    • git checkout 版本号 分支不动,只有HEAD动,
    • git revert 版本号 生成一个新的版本取代当前版本,不包含当前版本需要丢弃的内容,master和HEAD都移动到新版本。
  2. git reset 回退版本的三种程度,由方式决定:

    • 只更改.git(温和,将当前分支移动到想回退的版本id上,HEAD仍指向当前分支,工作区和暂存区不变) git reset --soft 版本号

    • 更改.git,并根据.git还原暂存区(一般,将当前分支移动到想回退的版本id上,HEAD仍指向当前分支,暂存区也改为回退版本,工作区不变) git reset --mixed 版本号

    • 更改.git,并根据.git还原暂存区和工作区(暴力,可能会丢失正在进行的工作。将当前分支移动到想回退的版本id上,HEAD仍指向当前分支,暂存区和工作区都改成回退版本) git reset --hard 版本号

      为了避免完全丢失信息,可以配合前面说的 git stash一起使用

git的常用命令
  • 第一次用要添加配置,设置用户信息

    • git config --global user.name 'xxx'
    • git config --global user.email 'xxxx@xx.com'
  • git add (. ./ filename ) 添加到暂存区

  • git status 查看文件状态(已修改,已暂存,已提交)

  • git log 查看日志,将显示所有提交过的版本信息,不包括被删的commit和reset操作

    git reflog 查看日志,显示所有操作,包括被删、回退的。这里能看到的版本号更多,方便本地恢复错误的操作。

    git log --oneline --graph --decorate --all 查看分支关系图

  • git commit -m 提交一个新的待办 git commit --amend 在当前代办上添加一个新版本

  • git difftool head 查看修改的内容(借助工具) git diff 版本号 查看指定版本与当前版本的区别

  • git pull (--rebase) 从远程仓库拉取(多人开发时,更能顺利push,避免有人提交后仓库为新版本导致push失败)

  • git checkout

    • git checkout 分支名 我们经常会用这个命令来切换分支,这时,HEAD和master指针就会移动到目标分支上

    • git checkout 版本号 还可以用checkout命令切换版本,这样操作的话,HEAD指针指向该版本,但是分支指针是不变的!!同时,暂存区也会还原成目标版本的内容,工作区的内容不会强制修改,会在提醒你(并进行)stash或commit指令后还原为目标版本的工作区。

      这个指令就是类似于git stashgit reset --hard 配合的效果

    • git checkout 版本名 文件路径 这个命令会保持HEAD和分支不变,但是回取出目标版本中,该文件的内容部分强行还原工作区和暂存区。若有未完成的工作直接覆盖。

  • git merge 合完要删掉的分支 合并分支。这种合并是三元合并,即可以把你在其他分支上的内容以及当前master分支上的内容合并到分出其他分支的那个版本上(可以理解为树干,分成了两个分支,这两个分支可以任意生长),形成新的版本。(就是把这两个分支合到一起再变成主干)有冲突还是要解决才可以。

  • git rebase 要留下的分支 合并分支。和merge不同的是,rebase在合并过程中,会将要留下的分支L的版本和要删除的分支D中的每个版本做diff,把结果变成下一个版本,直到D分支上的版本都被diff完,这样就把D分支变到了L分支上。

    再用git merge develop做一次快进合并,就算完成了。

  • git review (分支名) 上传代码,供评审

  • git push 上传到远程仓库

  • git config --list 查看配置

    • git config --system 查看系统配置,所有git账户
    • git config --global 查看全局配置,一个账户
    • git config --local 项目配置,只能在项目目录下使用,读取.git/config
  • git config -e 修改配置

  • git config --global alias.xx "命令" 给命令起别名 ,但是记得这个命令里面不要写git 写了git是运行不了的,可以再写一遍相同的别名覆盖

  • git config --global --unset 删除配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值