git常用操作

225 阅读6分钟

git的特点

  • 最优的存储能力
  • 非凡的性能
  • 开源的
  • 很容易做备份
  • 支持离线操作
  • 很容易定制工作流程

git的使用

配置user信息

git config --global user.name 'your_name'   // 配置用户名
git config --blobal user.email 'your_email@domain.com'  // 配置用户邮箱

--gloabl    // 对所有仓库起作用
--local     // 只对该仓库起作用,默认为local
--system    // 对该系统上的所有用户都起作用

// 显示目前config的配置, 加 --list
git config --list           // 该系统上的所有config配置
git config --list --local
git config --list --global
git config --list --system

解析.git文件夹

.git
    |----HEAD       # 存储当前所在分支名称
    |----config     # 存储了本地仓库的相关配置信息以及本地分支信息等
    |----refs       
        |----heads      # 存储了当前仓库本地所有分支当前所指向的commit的ID
        |----remotes    # 存储了当前仓库远程所有分支当前所指向的commit的ID
        |----tags       # 存储了当前仓库所有tag当前所指向的commit的ID
        |----stash      # 存储了当前仓库stash中最后一次暂存所生成的commitID
    |----objects    #存储了本地仓库中所有的git对象
# object存储了git中的所有对象(commit、tree、blob),每个对象在生成的时候都会生成一个40位的哈希值 
#哈希值的前两位将作为文件夹名,后38位将作为文件名存放在对应的文件夹中,当进行对应操作是就会根据哈希值去存取对应的git对象。
# 比如:执行git stash操作时,会生成一个commit对象并根据生成的哈希值存储到objects文件夹中
# 当执行git stash pop时就会读取refs文件夹下的stash文件中的哈希值,去objects文件夹中读取对应的对象来执行相应的操作。

git 存储机制

# git 常用命令
git cat-file -p [hashId]    // 查看该hashId 对应的内容
git cat-file -t [hashId]    // 查看该hashId 对应的类型(commit、tree、blob)

git 中一共含有三大类型,分别为commit、tree、blob,其中一个commit一定对应一个tree, tree上可能含有tree、blob,但是在tree的根节点上肯定为blob类型.

image
在git中不关心文件名,只关心文件内容,所有文件内容相同的文件只会存储一份,而不会以不同的文件名存储多份,在很大程度上减少了文件存储的体积,提高了文件的利用率。

git提交流程

// 远程建立仓库
***
// 本地与远程仓库建立连接
git remote add origin 远程仓库地址

// 此时本地有已经开发完成的代码
// 将需要提交的代码加入暂存区
// 全部暂存
git add *
// 暂存需要的文件可以使用模糊匹配
git add src/page/*      // 暂存src/page文件夹下的所有修改的文件

// 将暂存的修改进行提交
git commit -m '这里替换为此次提交的描述'

// 将提交推送到远程仓库
git push  <branch name> // 如果默认推送到与本地分支相同的远程分支,则后面的远程分支名称可以省略,否则需要指定远程分支,默认为本分支,多人协作开发提交前需要进行拉取下远程分支代码(执行git pull),否则有可能无法提交

// 拉取远程分支最新改动
git pull

git log

git log 命令可以查看目前git仓库中的所有提交日志,方便查看之前历史版本,回顾进行了那些修改。

git log:默认查看当前分支的所有提交日志
git log [branch]:查看某个分支的所有提交日志
git log --all: 查看所有分支的所有提交日志
git log --all --graph:以图形化的形式显示所有分支的所有提交日志,可以清晰的展示出各个分支之间的关联。
各个参数可以叠加使用。比如: git log master --oneline -4 --graph 表示以简要、图形化的形式查看master分支的最后4条提交日志。

git log -[number]: 参数number为你要显示的日志条数,当日志数量较多时较为常用,可以先查看部分日志。
比如: git log -4: 查看最近的4条提交日志

git log --oneline:以简要的形式查看提交日志,加上--oneline参数会将日志以简要信息的形式进行展现,如果不加该参数将会展示每条日志的详细描述。改参数同样可以配置-[number]参数进行使用。
比如: git log -4 --oneline:查看最近的4条提交日志的简要信息

gitk

使用该命令将会打开git自带的图形化版本控制系统,里面可以查看各种提交日志的详细信息等等。
解决gitk中文乱码问题: git config --global gui.encoding utf-8

git stash(将修改暂存堆栈)

// 当我们在开发过程中需要临时切换分支或者有紧急需求时,有时代码还不能提交,这时就需要将代码临时存储在堆栈(stash)中,当需要时再将存储的内容在堆栈中取出。

// 存储代码(相当于入栈操作)
git stash

// 查看堆栈中所有暂存修改
git stash list

// 取出堆栈中最后一次暂存(入栈)代码
git stash pop   // 该操作会将代码在堆栈中取出并在堆栈中删除该记录(相当于出栈操作)
git stash apply // 该操作会将代码在堆栈中取出但是并不会进行出栈操作

// 取出堆栈列表中的具体某一条记录
git stash apply stash@{记录编号}    // 该操作同样只会将记录取出,不会执行出栈操作

git revert(撤销操作)

git revert 用于撤销指定版本的内容并创建一个新的commit,不删除之前版本的commit。

# 撤销上一次commit
git revert HEAD

# 撤销上上次commit
git revert HEAD^

# 撤销指定版本commit
# eg: git revert 9b01c12b2b8006f4e1c40e395c44fa3578183d95
git revert commit-id

# 如果在撤销过程中遇到冲突,但此时又不想解决时,可以进行撤销revert
git revert --abort

# 冲突解决之后可以进行后续操作
git add .
git revert --continue

git reset(撤销操作)

git reset 同样是对内容进行撤销操作。共有三种模式,分别为:git reset --softgit reset --mixedgit reset --hard.

git reset --soft

该模式对现有版本库改动最小,会将给定提交之后的提交还原为执行git add之后的状态。如下图所示:

此时执行git log命令可以看到已经当前HEAD为给定的提交。

git reset --mixed

该模式同git reset --soft差不多,区别在于会将给定操作之后的提交变为执行git add之前的状态,也就是相当于ctrl + s的状态。该模式也是git reset的默认模式。如下图所示:

git reset --hard

该模式会将给定提交之后的所有提交全部删除,版本彻底回到给定提交版本,此操作较为危险。如下图所示:

综上:--soft--mixed模式比较适合撤回已经commit后的内容,--hard适合确定需要舍弃指定提交后commit后提交内容时使用。

持续更新中。。。