Git 学习笔记


Git配置

在使用Git之前,需要对Git进行必要的配置,包括用户名、邮件地址等等。

# 用户名
git config --global user.name "your name"
# 邮件地址
git config --global user.email "you@example.com"
# 禁止行尾符自动转换
git config --global core.autocrlf false

注意:

  • --global 全局选项, 如果省略则只对当前仓库有效。
  • 根据你自己的情况决定是否禁止行尾符转换(Windows/Mac/Linux)。

Git示例

github上创建一个仓库mitter,用以下代码作第一次提交。

mkdir mitter
cd mitter
git init
touch README.md
git add README.md
git commit -m 'Initial commit'
git remote add origin git@github.com:<youraccount>/mitter.git
git push origin master

向mitter添加一个新的文件。

touch hello.c
git add hello.c
git commit hello.c -m "add hello.c" # 此时hello.c文件已经进入git的本地仓库
git push origin master              # 请慎重选择合适的时机提交到远程仓库,对远程仓库进行版本回退将是一个灾难。

从远程服务器上获取代码(Git支持多种形式的远程URI形式)。

git clone git@github.com:youraccount/mitter.git
git clone /path/to/mitter mitter
git clone rsync://host.domain/path/to/repo.git
git clone http://host.domain/path/to/repo.git
git clone https://host.domain/path/to/repo.git
git clone git://host.domain/path/to/repo.git
git clone git://host.domain/~user/path/to/repo.git
git clone ssh://[user@]host.domain[:port]/path/to/repo.git
git clone ssh://[user@]host.domain/path/to/repo.git/
git clone ssh://[user@]host.domain/~user/path/to/repo.git
git clone ssh://[user@]host.domain/~/path/to/repo.git
git clone /path/to/repo
git clone file:///path/to/repo

Git基础

目录结构

我们先来看mitter的目录结构1

mitter
|-- .git/                                                # Git的核心, 所有Git的数据都存储在这里
|   |-- branches/                                        # 分支
|   |-- COMMIT_EDITMSG                                   # 上一次提交的消息, 即"Initial commit"
|   |-- config                                           # Git的本地配置, 即不加--global选项时存储的配置文件
|   |-- description                                      # 仓库的名字, 描述
|   |-- HEAD                                             # 记录当前提交的引用
|   |-- hooks/                                           # Hook脚本目录,目录下都是示例文件。
|   |   |-- applypatch-msg.sample*
|   |   |-- commit-msg.sample*
|   |   |-- post-update.sample*
|   |   |-- pre-applypatch.sample*
|   |   |-- pre-commit.sample*
|   |   |-- prepare-commit-msg.sample*
|   |   |-- pre-push.sample*
|   |   |-- pre-rebase.sample*
|   |   |-- pre-receive.sample*
|   |   `-- update.sample*
|   |-- index                                            # 索引仓库
|   |-- info/
|   |   `-- exclude                                      # 本地 .gitignore
|   |-- logs/                                            # 日志, git log
|   |   |-- HEAD
|   |   `-- refs/
|   |       `-- heads/
|   |           `-- master
|   |-- objects/                                         # 对象目录, Git使用了对象数据库来存储数据
|   |   |-- 14/                                          # Git有四种对象, 提交(commit), 树(tree), 标签(tag), 数据(blob)
|   |   |   `-- 1727eb26b6c60fd673f8c86c3e92e3579da661   # 对象是以SHA1算法生成的40位十六进制数字命名的文件
|   |   |-- e6/
|   |   |   `-- 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
|   |   |-- f9/
|   |   |   `-- 3e3a1a1525fb5b91020da86e44810c87a2d7bc
|   |   |-- info/
|   |   `-- pack/
|   `-- refs/                                            # 引用, 指向所有的提交和标签
|       |-- heads/                                       # 当前提交, 记录各个分支的当前提交
|       |   `-- master
|       `-- tags/                                        # 标签
`-- README.md                                            # README.md 文件, Git库中当前管理的唯一一个文件

简要介绍

Git是一个分布式的源代码管理系统. 它在仓库和源代码之间引入了一个中间坏节 - 索引仓库, 同时增加了本地仓库和远程仓库以实现分布管理. 如果你以前使用过Subversion, 请特别注意这一点.

工作流程

Git的一般流程, 在当前目录下对源代码实施变更, 对已实施变更的文件使用git add加入索引仓库, 确认变更正确无误后, git commit提交到Git仓库, 最后git push提交到远程仓库.

cd /path/to/mitter
vi README.md                                             # 修改 README.md
git diff                                                 # 查看 README.md 的更改
git add README.md                                        # 添加修改后的 README.md 到索引仓库
git status                                               # 查看状态, 会看到 README.md 已更改并加入索引仓库尚未提交到仓库
git diff --cached                                        # 查看当前 README.md 与仓库的 README.md 的区别
git commit README.md -m "edit README.md"                 # 提交, 并添加开发日志 "edit README.md"
git push origin master                                   # 推送到远程仓库

常用命令

  • git add
    • git add 可以用来添加单个文件, 多个文件, 也可以添加目录
    • 在仓库根目录下使用git add . 可以将所有的变更文件及没进入仓库管理的文件加入索引仓库
    • -m选项, 添加开发日志, 可以用斜杠\分隔多行
  • git diff
    • 当前目录与索引仓库下的文件的比较
    • --cached选项索引仓库与仓库下的文件比较

工作目录、索引仓库、Git仓库

工作目录为(1), 索引仓库为(2), Git仓库为(3), 则三者提交的层次关系是(1)->(2)->(3)
git add               完成的是(1)->(2)
git commit            完成的是(2)->(3)
git commit -a         两者的直接结合
从时间上看, 可以认为(1)是最新的代码, (2)比较旧, (3)最旧, 按时间排序就是(1)<-(2)<-(3)
git diff              得到的是从(2)到(1)的变化
git diff --            得到的是从(3)到(1)的变化

  1. 此目录在本地生成, 未添加remote和push到远程, 即只执行到第六个命令. ↩︎