git 学习笔记

    技术2022-05-19  25

    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到远程, 即只执行到第六个命令.

    最新回复(0)