from http://wiki.zhonglog.com/git
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 git add README git commit -m 'first 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 git clone file:///path/to/repo.git
Git基础
目录结构
我们先来看mitter的目录结构1)
mitter ├── .git # Git的核心, 所有Git的数据都存储在这里 │ ├── branches # 分支 │ ├── COMMIT_EDITMSG # 上一次提交的消息, 即"first commit" │ ├── config # Git的本地配置, 即不加--global选项时存储的配置文件 │ ├── description # 仓库的名字, 描述 │ ├── HEAD # 记录当前提交的对象名 │ ├── hooks # Hook脚本目录 │ │ ├── applypatch-msg.sample │ │ ├── commit-msg.sample │ │ ├── post-commit.sample │ │ ├── post-receive.sample │ │ ├── post-update.sample │ │ ├── pre-applypatch.sample │ │ ├── pre-commit.sample │ │ ├── prepare-commit-msg.sample │ │ ├── pre-rebase.sample │ │ └── update.sample │ ├── index # 索引仓库 │ ├── info # │ │ └── exclude # Git排除管理配置 │ ├── logs # 日志, git log │ │ ├── HEAD │ │ └── refs │ │ └── heads │ │ └── master │ ├── objects # 对象目录, Git使用了对象数据库来存储数据 │ │ ├── 0f # Git有四种对象, 提交(commit), 树(tree), 标签(tag), 数据(blob) │ │ │ └── 933da03611f899949e0ab1ee31fd4dc866ca53 # 所有的对象都是以SHA1哈希算法生成的一个40位的十六进制数字命名, 并以此为文件名进行存储 │ │ ├── 54 │ │ │ └── 3b9bebdc6bd5c4b22136034a95dd097a57d3dd │ │ ├── e6 │ │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 │ │ ├── info │ │ └── pack │ └── refs # 引用, 指向所有的提交和标签 │ ├── heads # 当前提交, 记录各个分支的当前提交 │ │ └── master │ └── tags # 标签 └── README # README文件, Git库中当前管理的唯一一个文件
简要介绍
Git是一个分布式的源代码管理系统. 它在仓库和源代码之间引入了一个中间坏节 - 索引仓库, 同时增加了本地仓库和远程仓库以实现分布管理. 如果你以前使用过Subversion, 请特别注意这一点.
工作流程
Git的一般流程, 在当前目录下对源代码实施变更, 对已实施变更的文件使用git add加入索引仓库, 确认变更正确无误后, git commit提交到Git仓库, 最后git push提交到远程仓库.
cd /path/to/mitter vi README # 修改README git diff # 查看README的更改 git add README # 添加修改后的README到索引仓库 git status # 查看状态, 会看到README已更改并加入索引仓库尚未提交到仓库 git diff --cached # 查看当前README与仓库的README的区别 git commit README -m "edit README" # 提交, 并添加开发日志 "edit README" git push origin master # 推送到远程仓库
常用命令
-
git add
-
git add 可以用来添加单个文件, 多个文件, 也可以添加目录
-
在仓库根目录下使用git add . 可以将所有的变更文件及没进入仓库管理的文件加入索引仓库
-
-m选项, 添加开发日志, 可以用斜杠(/)分隔多行
-
-
git diff
-
当前目录与索引仓库下的文件的比较
-
--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 –cached 得到的是从(3)到(2)的变化 git diff HEAD 得到的是从(3)到(1)的变化
-
-
git status
-
changed but not updated
修改后还未使用git add加入索引仓库的已进入Git仓库管理的文件 -
Changes to be committed
修改后已使用git add加入索引仓库而尚未提交到Git仓库的已进入Git仓库管理的文件 -
Untracked files
未进入Git仓库管理的新增加的文件
-
-
git log
-
git log -p详细的日志及各个版本的代码的更改
-
-
git show commit_name
-
git show branch_name
-
git show HEAD
-
git show HEAD^
-
git show HEAD~4
-
git show HEAD^1 # merge后会有多个父节点, 第一个父节点
-
git show HEAD^2 # 第二个节点
-
-
git fetch
-
git merge
-
git pull 会将获取的分支合并到当前分支
-
git grep
-
git tag 1.0.0 commit_name
-
git ls-files
四、Git进阶
版本管理
-
git reset
-
--mixed reset HEAD and index
-
--soft reset only HEAD
-
--hard reset HEAD, index and working tree
-
--merge reset HEAD, index and working tree
-
-
reset 和 revert 命令都只能影响到本地仓库, push 到远程仓库时会报错. 如何想要远程仓库也回退到上一交提交, 需要通过其它 Hack 来解决, 而且带有一定的风险. 所以提交到远程仓库应该是一个要经过慎重考虑的操作.
分支操作
-
git branch
-
git show-branch
-
git branch branch_name
-
git checkout branch_name
-
git branch checkout master
-
git merge branch_name
-
git branch -d branch_name
如果分支已提交, 就可以直接删除 -
git branch -D branch_name
如果分支未提交, 需用参数大写D来进行删除 -
cd /home/me
-
git clone /path/to/mitter mymitter
-
cd /path/to/mitter
-
git pull /path/to/mymitter
-
cd /path/to/mitter
-
git fetch /home/me/mymitter master:mymitter
-
git whatchanged master..mymitter
-
git checkout master
-
git pull . mymitter
-
git branch -D mymitter
五、深入Git
Git对象
-
blob
数据对象, 存储着所有的文件数据 -
tree
树对象, 描述目录结构, 树相当于一个目录, 树枝就相当于目录中的文件就是数据对象, 子目录就相当于子树 -
commit
提交对象, 每一次提交就都会生成一个提交对象, 并指向一个树对象 -
tag
标签对象, 实际上它是某个提交对象的别名
查看对象
-
git cat-file -t object_name
-
git cat-file commit commit_name
-
git cat-file blob blob_name
-
git ls-tree tree_name
-
git ls-files -–stage # 查看索引仓库文件
杂项
-
git-fsck
-
git repack
-
git prune
-
git gc
-
git rebase
-
git format-patch origin
从本地分支生成patch,用于email提交
1) 此目录在本地生成, 未添加remote和push到远程, 即只执行到第六个命令.