在使用Git之前,需要对Git进行必要的配置,包括用户名、邮件地址等等。
# 用户名
git config --global user.name "your name"
# 邮件地址
git config --global user.email "you@example.com"
# 禁止行尾符自动转换
git config --global core.autocrlf false
注意:
--global
全局选项, 如果省略则只对当前仓库有效。在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
我们先来看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 # 推送到远程仓库
-m
选项, 添加开发日志, 可以用斜杠\
分隔多行--cached
选项索引仓库与仓库下的文件比较工作目录为(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)的变化
此目录在本地生成, 未添加remote和push到远程, 即只执行到第六个命令. ↩︎