git 学习笔记

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

注意:

  1. --global 全局选项, 如果省略则只对当前仓库有效。
  2. 根据你自己的情况决定是否禁止行尾符转换(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
    1. changed but not updated
      修改后还未使用git add加入索引仓库的已进入Git仓库管理的文件
    2. Changes to be committed
      修改后已使用git add加入索引仓库而尚未提交到Git仓库的已进入Git仓库管理的文件
    3. 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到远程, 即只执行到第六个命令.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值