📚
handbook
  • Introduction
  • 1.前言
    • 前言
    • 鸣谢
  • 2.环境篇
    • 工具部署和使用
      • 团队协作工具
        • Confluence
      • 开发工具
        • Docker
          • 镜像导入导出
          • 安装
        • Docker Compose
      • 持续集成工具
        • Gerrit
        • Sonarqube
          • 分析参数设定
          • Prerequisite
          • 服务端设置
        • Ubuntu Ci Deploy
          • ubuntu使用docker部署jenkins+sonarqube
        • 持续集成部署
      • 文本编辑工具
        • Gitbook相关注意事项
        • Markdown快速入门
      • 版本控制
        • Git
          • 1.基础
            • Git基础(一)
            • Git基础(二)
            • Git基础(三)
            • Git基础(四)
            • Git基础(五)
          • 2.命令详解
            • 命令速查
          • 3.进阶技巧
            • git技巧
      • 自动化测试工具
        • Appium
          • capability参数配置
          • 安装
          • 简介
      • 项目管理工具
        • Jira
    • 开发环境配置
      • 通用
        • Homebrew安装与使用
        • Git服务器添加SSH Key
        • koroFileHeader使用
        • nodejs与npm的安装
        • npm更换国内源
        • pip使用相关
        • PostgreSQL安装与使用
        • proxychain安装与使用
        • shell配置环境变量
        • snapd安装与使用
        • terminal走代理
    • 快捷键速查
      • shell常用快捷键
  • 3.语言篇
    • C
      • 代码规范
      • 语言技巧
    • Cpp
      • 代码规范
      • 基础知识
        • 理解C++中的左值和右值
      • 语言技巧
        • 并发编程
          • 简单的线程池实现
    • Golang
      • 代码规范
        • 避免使用转义字符串
        • 避免参数语义不明确
        • 嵌套式结构体
        • 函数的分组与顺序
        • 函数命名
        • 声明一致性
        • 导入别名
        • 使用字段名初始化结构体
        • 本地变量声明
        • map初始化
        • nil用法
        • 包命名
        • 命名Printf样式的函数
        • 减少嵌套
        • 缩小变量作用域
        • struct引用初始化
        • 测试表声明
        • 顶层变量声明
        • 不必要的else
      • 环境配置
        • 代码检查格式化工具
          • Go Fmt
          • Goimports
          • Golint
          • Go Vet
        • go mod详解
        • golang安装
        • Golang开发环境
        • Troubleshooting
      • 语言技巧
        • 如何分包
    • Java
      • 代码规范
      • 语言技巧
        • 注解编程
        • 动态代理
    • Js
      • 语言技巧
        • Rollup
    • Kotlin
      • 基础知识
        • 写给开发者Kotlin指引(一)
        • 写给开发者Kotlin指引(二)
    • Python
      • 语言技巧
        • Best Practice Of Python S Project Structure
  • 4.规范篇
    • Git message规范
  • 5.技术篇
    • Android技术
      • Hook
        • EdXposed例子
        • Android 10 上安装Magisk和EdXposed
      • Tinker
        • 1.Tinker及其使用
      • 准备
        • ADB连接设备步骤及注意事项
        • adb连接设备
        • aosp编译
      • 基础
        • Binder接口调用的鉴权方法
        • Make 及 Android 编译系统介绍
        • 使用Content Provider为其他应用提供数据
      • 源码阅读
        • Framework源码分析 Looper Handler
        • Framework源码分析 启动流程 ServiceManager的初始化
        • Framework源码分析 启动流程 Zygote启动SystemServer
    • JS Bridge
      • JSBridge初探
    • Kernel技术
      • kallsyms子系统
    • Test技术
      • 软件测试
        • jnekin+sonar 部署 问题总结
        • 性能测试基础
        • 软件测试的背景
        • 测试基础
        • 测试人员的核心竞争力
    • 操作系统原理
      • 处理器如何实现原子操作
Powered by GitBook
On this page
  • 一、查看当前仓库状态
  • 二、避免将垃圾引入git仓库
  • 三、查看当前修改内容
  • 四、提交暂存区内容

Was this helpful?

  1. 2.环境篇
  2. 工具部署和使用
  3. 版本控制
  4. Git
  5. 1.基础

Git基础(二)

PreviousGit基础(一)NextGit基础(三)

Last updated 4 years ago

Was this helpful?

在中简单描述了git的常用的生命周期及操作,现在对这些操作进行更深入的描述。

一、查看当前仓库状态

使用git status可以查看当前仓库的状态,它也可以加上--short或者-s参数,这样输出就会显得非常简洁。

 D 2.环境篇/工具部署和使用/开发工具/git/1.基础/git_fundamental.md
?? 2.环境篇/工具部署和使用/开发工具/git/1.基础/1_git_fundamental.md
?? 2.环境篇/工具部署和使用/开发工具/git/1.基础/2_git_fundamental.md

在每个文件前都会有一个字符串来标记该文件的状态,其中:

??表示新增未跟踪文件
D 表示该文件被删除

此时,当我们使用git add将所有修改添加到暂存区后,再次运行git status -s查看结果。

R  2.环境篇/工具部署和使用/开发工具/git/1.基础/git_fundamental.md -> 2.环境篇/工具部署和使用/开发工具/git/1.基础/1_git_fundamental.md
A  2.环境篇/工具部署和使用/开发工具/git/1.基础/2_git_fundamental.md

其中:

R表示该文件被重命名了
A表示该文件被新增到暂存区,git开始跟踪他的变化

接着,我们修改2.环境篇/工具部署和使用/开发工具/git/1.基础/2_git_fundamental.md的内容,然后再次使用git status -s来观察这些文件的状态。

R  2.环境篇/工具部署和使用/开发工具/git/1.基础/git_fundamental.md -> 2.环境篇/工具部署和使用/开发工具/git/1.基础/1_git_fundamental.md
AM 2.环境篇/工具部署和使用/开发工具/git/1.基础/2_git_fundamental.md

可以看到该文件的A右边多了一个M,表示该文件已经修改,但是还未添加到暂存区。回忆上一章的内容,当我们修改了文件然后添加到暂存区,再修改后,git status的输出。在-s选项中,git用一种十分优雅的方式表达了这一结果,当M位于左侧时,表示该文件有一些修改已经添加到暂存区。而当M位于右侧时,表示该文件还有修改未被添加到暂存区。

依此类推,如果该文件是一个已经被git仓库跟踪的文件,在进行修改->添加到暂存区->再修改的操作后,对于该文件,git status -s的输出是什么呢?

二、避免将垃圾引入git仓库

当我们的项目中存在一些不应该添加到仓库中的文件时,应该使用.gitignore文件来将垃圾都排除在项目之外。

git通过在项目目录中使用.gitignore文件来管理该项目需要跟踪的文件,一般我们在项目的根目录使用该文件,子目录的.gitignore会覆盖父目录的结果。

.gitignore的格式为:

  • 所有空行或者以#开头的行都会被Git忽略。

  • 可以使用标准的glob模式匹配。

  • 匹配模式可以以/开头防止递归。

  • 匹配模式可以以/结尾指定目录。

  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号!取反。

所谓的glob模式是指shell所使用的简化了的正则表达式。*匹配零个或多个任意字符;[abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号?只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如[0-9] 表示匹配所有 0 到 9 的数字)。使用两个星号() 表示匹配任意中间目录,比如`a/*/z可以匹配a/z,a/b/z或a/b/c/z`等。

一个简单的例子:

# 忽略所有扩展名为.a的文件
*.a
# 除了lib.a
!lib.a
# 只忽略当前目录的libssl.a,不会忽略子目录中的libssl.a
/libssl.a
# 忽略所有build目录中的文件
build/
# 忽略doc中所有的txt文件
doc/*.txt
# 忽略doc及其子目录中所有的pdf文件
doc/**/*.pdf

三、查看当前修改内容

使用git diff命令可以查看当前工作区和暂存区之间的差异,注意,这里不是工作区和之前一个commit的差异,而是工作区和暂存区的差异,也就是一个文件修改后暂存后的文件快照和再次修改之后的差异。

如果想查看已经暂存的和上一次提交的差异,可以使用git diff --staged。

四、提交暂存区内容

当文件被git add添加到暂存区后还需要使用git commit来将代码提交到本地仓库中,前面已经使用了git commit -m来为提交添加一个信息,表示本次提交的内容。一般来说,这个信息不应太长,应言简意赅地描述本次改动的内容。如果条件允许,最好再通过一个CHANGELOG文件来详细描述本次改动,这对于版本追溯十分有帮助。如果你不想使用-m选项,可以在之前配置的默认编辑器中增加这些信息。

Develop | add git fundamental 2
# enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Your branch is up to date with 'origin/master'.
#
# Changes to be committed:
#       renamed:    2.环境篇/工具部署和使用/开发工具/git/1.基础/git_fundamental.md -> 2.环境篇/工具部署和使用/开发工具/git/1.基础/1_git_fundamental.md
#       new file:   2.环境篇/工具部署和使用/开发工具/git/1.基础/2_git_fundamental.md
#
# Changes not staged for commit:
#       modified:   2.环境篇/工具部署和使用/开发工具/git/1.基础/2_git_fundamental.md
#

在最上面一行写你的commit message,如果什么都不写,将会中断这次提交。

Aborting commit due to empty commit message.

完成后保存退出,这时显示提交已经完成。

[master 27ea6fc] Develop | add git fundamental 2
 2 files changed, 25 insertions(+), 3 deletions(-)
 rename 2.环境篇/工具部署和使用/开发工具/git/1.基础/{git_fundamental.md => 1_git_fundamental.md} (98%)
 create mode 100644 2.环境篇/工具部署和使用/开发工具/git/1.基础/2_git_fundamental.md

这时使用git log查看提交记录,可以看到:

commit 27ea6fc6f5459ebadadef99d937b8c0f973430e5 (HEAD -> master)
Author: zhanghaokang <zhanghaokang@antiy.cn>
Date:   Wed Nov 25 16:53:22 2020 +0800

    Develop | add git fundamental 2

刚刚的提交已经生效。

如果本次修改没有完成就提交了,想要再次将修改提交到仓库中,难道再次使用git add -> git commit吗?git新手会这样做,但是会在提交记录中生成两个提交记录,这样会污染提交记录,不利于以后版本回溯。那如果你觉得本次提交的commit message写的不太好,想要修改commit message,那么此时刚刚的方法将无法满足要求。

正确的方法是将修改添加到暂存区后,使用git commit --amend来将本次修改合并到前一次提交。

--amend参数用于弥补上一次提交缺失或者错误的内容,当你准备好提交后,使用--amend参数就会打开默认的编辑器,你可以在这里修改你的commit message。修改完成后,保存退出即刻生效。

使用git log来查看提交记录,可以看到:

commit c5a14321f8231aaaa13ae9d2db5dd8372260b6db (HEAD -> master)
Author: zhanghaokang <zhanghaokang@antiy.cn>
Date:   Wed Nov 25 16:53:22 2020 +0800

    Develop | add git fundamental amend

修改已经被合并到上一次修改中,且commit message完成修改。

类似的,如果不想进入默认的编辑器,只要同时使用-m参数,git就会将commit message替换为新的值。

git commit --amend -m "Develop | add git fundamental 2"

如果不小心进行了多次提交,这时使用git commit --amend就没办法了,此时需要git rebase命令来帮忙将多个提交合并到一起。对于这个操作,将在后面说到rebase的时候再细说。

还有个常用选项,如果不想执行git add -A这一步,那么可以使用-a选项,表示将所有修改添加到暂存区并进行提交。

Git基础(一)