美文网首页
Git学习笔记

Git学习笔记

作者: 胖头鱼战士 | 来源:发表于2017-03-01 13:21 被阅读0次

概述

Git是一个用来做代码管理和版本控制的工具。

参考教程

《Git权威指南》,机械工业出版社,蒋鑫。

如有理解错误,欢迎指正。

总览

版本控制工具的发展

1.diff和patch。

2.CVS。

3.SVN。

4.Git。

Git初始化

git配置文件位置。

  - 全局配置:/etc/gitconfig

  - 个人配置:~/.gitconfig

  - 具体Git库配置:/path/to/repo/.git/config

使用git config配置用户名和邮箱,--global表示当前用户。

git config --global user.name "Ruochen Xu"

git config --global user.email "ruochen.xu@aorise.com"

使用git config配置操作别名,可以让指令变短,--system表示所有用户。

git config --system alias.st status

注意:git config后的配置项都以a.b的形式表示。使用--unset删除配置。

使用git init创建空的本地git库,创建完成后,在库目录下有一个.git文件夹,里面存储了与本git库相关的所有信息。

cd /path/to/my/workspace

git init demo

生成一个新文件,并使用git add加入暂存区,然后使用git commit作一次的提交。

提交可以看做是一个确认的代码改动。

cd demo

echo "Hello." > readme.md

git add readme.md

git commit -m "Initialize.”

Git对象

Git中每个文件、每次提交、每个目录树等信息,都是以git对象的形式存储在库的.git/objects目录下的。每个git对象都有一个40位的SHA1哈希值,存储时前两位作为目录名,后38位作为文件名。

git cat-file -t <hash> # 查看git对象类型

git cat-file -p <hash> # 查看git对象内容

Git分支

Git进行第一次提交后,会自动生成第一个分支,也是默认分支,名称为master

每次git commit提交都可以看做是一个点,相邻的提交之间有边相连,git每个提交都是增量的。每个提交都对应有一个文件目录树,代表的是从第一次提交开始到该提交结束,库中的文件。

每个分支就是一个指向某个提交的指针,代表着从第一次提交开始到该提交结束所有的文件变化历程。每个分支应当有一个独有的名字,HEAD表示当前正在操作的提交。

新的提交只能在某个分支上进行,即HEAD指针停留在某个分支指针上,而不能在任意提交上进行。

新分支可以从某个提交处产生,旧分支也可以与别的分支合并然后删除。所以所有的提交构成一张图。

Git的分支信息都存储在库的.git/refs/heads目录下,库的.git/HEAD文件存储HEAD指针的信息,库的.git/logs/refs/heads目录下记录了分支的变化历史。

Git提交的相对访问

^,父提交,^2,第二个父提交,例如HEAD^2。

~n,第n个祖先提交,例如HEAD~5。

^{tree},提交所对应的目录树,例如HEAD^{tree}。

:path/to/file,提交所对应的目录树中的文件,例如HEAD:path/to/file,不带分支名时指的是暂存区中的文件。

Git分支操作

分支移动。

git commit # 进行一次提交并将当前分支移动到新的提交

git reset <commit> # 将当前分支移动到指定提交

分支查看。

git branch -a

HEAD指针切换。

git checkout <commit>

从当前位置创建新分支。

git checkout -b <branch>

分支合并。

git merge <commit>

分支删除。

git branch -d <branch>

Git库类型

Git库主要分为三种类型。

1.bare,可读写的主库,一般放在远端服务器上,并设置成不能撤销写入的模式。不能在bare库本地直接对bare库进行操作。

2.mirror,可读不可写的bare库镜像,一般放在远端服务器上,也可以放在开发机上。可以在mirror库本地操作其与bare库进行同步。

3.local,可以任意操作的本地库,放在开发机上。可以与远端的bare、mirror库进行交互操作。

Git库的常规操作流程

1.使用git clone克隆远端bare库或者mirror库到本地,此时远端bare库默认使用origin这个名称。也可以使用git remote add将本地已初始化的库关联到远端bare库或者mirror库。

git clone git@github.com:hnxuruochen/test.git

git remote add origin git@github.com:hnxuruochen/test.git

注意:每个local库都可以有任意多个远端关联库,用不同的名称区分,origin是默认名称。

2.使用git pull将远端bare或者mirror库的指定分支的最新改动拉到本地当前分支。如果分支之间有冲突则需要进行冲突解决和分支合并。

git pull = git fetch + git merge

git pull origin <branch>

3.使用git push将本地库的当前分支的最新改动推到远端bare库的指定分支。如果分支之间有冲突则需要先通过git pull解决冲突并合并分之后,才能继续push。

git push origin <branch>

团队一般通过一个bare库,每人一个local库的方式进行合作开发。

Git文件区

Git库本地分为三个文件区。

1.工作区。存放本地文件的文件系统,对文件的改动都是在工作区完成的。

2.暂存区。用于记录和追踪文件状态的临时区,库的.git/index记录的就是暂存区的目录树。

3.版本库。存放确定文件改动的库。所有的提交、分支都是在版本库中的,bare、mirror库与local库的交互实际上是版本库的交互。

提交文件只能从工作区到暂存区,或者暂存区到版本库。还原文件只能从版本库到暂存区,或者暂存区到工作区。不能跨区操作。

文件区之间的操作

文件状态。

git status

文件比较。

git diff # 比较工作区与暂存区

git diff HEAD # 比较工作区与版本库中的当前提交

git diff --cached HEAD # 比较暂存区与版本库中的当前提交

文件提交。

git add <file> # 从工作区到暂存区

git commit # 从暂存区到版本库的新提交

文件还原。

git checkout -- <file> # 从暂存区到工作区

git reset HEAD # 从版本库中的当前提交到暂存区

git checkout HEAD <file> # 从版本库中的当前提交到暂存区再到工作区

文件删除。

git rm <file> #  删除工作区和暂存区中的文件

git rm --cached <file> # 只删除暂存区的文件

git clean # 删除工作区中未加入版本库的文件

Git存放处

Git还有一个特殊的文件区叫做stash,是用来临时存放当前工作区和暂存区的改动的。

每次存放相当于是作了一次不被实际应用的提交,然后记录在库的.git/refs/stash中,存放的变化存放在库的.git/logs/refs/stash中。

存储并撤销当前工作区和暂存区的改动。

git stash

恢复工作区和暂存区的改动。

git stash pop

查看所有存放的改动。

git stash list

Git里程碑

Git里程碑是人为对提交进行的命名。里程碑相关信息存储在库的,git/refs/tags目录下。

里程碑分类

1.轻量级里程碑,创建时使用-l参数。该里程碑本质上是一个提交,但是没有创建者信息。

2.带说明的里程碑,创建时使用-a或-m参数。该里程碑式一个tag对象。

3.带签名的里程碑,创建时使用参数-s或者-u。该里程碑也是一个tag对象,还添加了GnuPG签名。

里程碑操作

显示里程碑。

git tag

创建里程碑。

git tag <name>

删除里程碑。

git tag -d <name> # 删除本地

git push <remote> :<name> # 删除远程

推送里程碑。

git push <remote> <name>

Git子模块

Git库可以将其他git库作为子模块引入。

创建子模块。

git submodule add <repo_path> <submodule_path>

初始化子模块。

git submodule init

更新子模块。

git submodule update

查看子模块。

git submodule status

其他

文件忽略

可以通过编辑.gitignore文件来让git忽略一些仅在工作区中的文件,.gitignore文件可以放在任意目录下,对当前目录和子目录生效。

一些复杂的分支操作

git cherry-pick,将指定提交的增量改动应用到当前提交上。

git rebase,将指定的一段连续的增量提交应用到指定提交上。

git revert,使用一个新提交的方式撤销上一个提交的内容。

文件追溯

git blame指令可以追溯一个文件的改动历史信息。

相关文章

  • 学习笔记| git深入浅出 Part1_快速操作指南

    Git专题 学习笔记| git深入浅出 Part1_快速操作指南 学习笔记| git深入浅出 Part2_Git...

  • git 入门

    git 入门学习笔记----3个入门命令:git init、git add、git commit -v 学习场景(...

  • git记录

    Git Magic图解gitgit 学习笔记git游戏(学习)1、消除文档路径中文乱码git config --g...

  • Git学习笔记--常用命令整理

    超实用Git学习笔记 Git全局配置git config --global user.name "用户名"git ...

  • Git常用命令与学习总结

    安装Git Git的下载地址:Git官网下载地址 学习网址 git 学习笔记- Book 在线练习地址 基础常用指...

  • git学习笔记(二)—— git的简单操作

    这是本系列学习笔记的第二篇git 学习笔记(一)—— 初识 git 前言 本篇文章将简要的介绍 Git 的一般操作...

  • 关于crlf

    Git学习笔记:Git设置CRLF(行尾换行符) git config --global core.autocrl...

  • GIT

    Git学习笔记 Git 与 Github对接: cd到当前文档 git init初始化git git add -A...

  • Git学习笔记

    git学习笔记 声明 本文是本人学习Git过程中所做的笔记,以便日后查阅,文中多有错漏之处,不建议用作学习材料,文...

  • Git学习笔记

    git 学习笔记 注册个人信息 git config --global user.name(你的用户名) git ...

网友评论

      本文标题:Git学习笔记

      本文链接:https://www.haomeiwen.com/subject/grdzwttx.html