`

Git笔记-进阶

    博客分类:
  • git
阅读更多

Git笔记-进阶

2011-09-12 17:33:13发表评论»

tag

在git中可以为任意其他对象添加tag,包括commit,tree,blob,甚至包括tag自身。git中都是用sha-1标识git对象,这是一个40个字符长度的字符串,不方便记忆,那么可为git对象添加一个tag便于标识不同对象。

添加tag

# git tag tag-name sha-1
$ git tag v1.0 bdc390c2

这样便为bdc390c2的对象添加了一个tag,如果不指定sha-1,会为最近的一个commit对象添加tag

查看tag

使用git tag命令便能查看所有tag

$ git tag

当然可以筛选

$ git tag -l 'v1.*'

删除tag

$ git tag -d <tag-name>

重命名tag

重命名tag有两种方式:

  1. 删除原tag,重新添加
  2. git tag -f 强制替换已存在的tag后,再删除原tag
$ git tag -f <new-tag> <old-tag>
$ git tag -d <old-tag>

tag的分类

  1. 轻量型标签 轻量型标签直接使用 $ git tag <tag-name> <git-object> 即可创建
  2. 标注型(annotated)标签 标注型标签可记录更多的信息,使用 $ git tag -a <tag-name> <git-object> -m ‘tag message’即可创意一个标注性标签
 

分支

建议多使用分支来维护项目,便于保证主干的稳定性。

创建分支

git中创建分支的方法非常简单:

#git branch <branch-name>
$ git branch dev

这样便从当前分支创建了一个名为dev的分支,可以让此分支作为开发分支。使用checkout <branch-name>可以很方便地在分支间进行切换:

$ git checkout master
$ git checkout dev

还可以直接使用checkout -b命令来创建分支后并切换到新的分支

$ git checkout -b dev

重命名分支

$ git branch -rm <old-branch> <new-branch>

远程分支

推送本地分支到远程服务器

$ git push <remote> <branch-name>[:<remote-branch-name>]

远程分支名如果省略,则使用本地分支名作为远程分支名

$ git push <remote> <branch-name>

删除分支

# 删除分支
$ git branch -d <branch-name>
# 强制删除分支
$ git branch -D <branch-name>

删除远程分支

$ git push <remote> :<remote-branch-name>

这个命令是不是可以从推送本地分支到远程分支的命令中得到一点灵感?是的,省略本地分支名后,远程分支即被删除!

查看分支

使用git branch命令可查看当前git版本库中所有分支:

$ git branch
查看分支

查看分支

当前分支会在分支前加以星号(*)标注。

git branch -v命令将附加显示最后一次提交相关信息的分支信息

$ git branch -v
# 查看已合并的分支
$ git branch --merge
# 查看未合并的分支
$ git branch --no-merged

分支合并

当一个分支完成预期的工作,通过测试后,便可合并到主干,作为稳定版本进行后续开发,合并分支的命令非常简单:merge branch-name

$ git merge dev

如果顺利,dev分支将自动地合并到当前分支。当然很多时候会产生冲突,这个时候就需要手动坚决冲突后再进行合并。

在git中如遇冲突,会显示冲突提示,合并会中断

conflict

conflict

此时你可以使用git mergetool命令调用merge工具进行手动合并

$ git mergetool

mergetool在配置项进行配置,以下是使用vimdiff的merge操作界面

mergetool vimdiff

mergetool vimdiff

手动解决完冲突后,还需要进行一次提交,便完成了整个手动合并过程。

rebase

rebase亦是将分支的修改进行“合并”。但在具体行为上略有不同,使用merge进行合并,更新部分依然会视作是从分支而来;而rebase则是直接将更新合并到新分支,相当于是在合并分支的直接修改。如果我们的更新是非常小,不足以作为一个分支进行合并,并且不想污染版本日志,那么便可以使用rebase来合并更新。

ignore

在一个git版本仓库中,有时候很多文件/目录并不需要使用git进行版本维护,那么就可以将这些文件/目录加入.gitignore文件中,在.gitignore文件中可定义要排除在git版本管理之外的文件/目录,git默认会读取项目目录下的.gitignore文件。

.gitignore使用标准的shell glob模式匹配,shell glob你可以简单地理解为一种特特殊化的正则表达式,其实要比正则表达式简单许多,语法如下:

  •  允许使用空行,没有实际语法作用
  • # 开头的行视作注释
  • ! 开头的模式会覆盖之前的定义,将匹配的对象重新加入跟踪列表
  • 以/结尾的模式,git会屏蔽掉该目录及其所有子目录及文件(只屏蔽目录)
  • 不以/结尾的模式,git屏蔽同名的文件名及目录(屏蔽目录和同名文件)
  • 以/开头的模式,git只会屏蔽项目根目录下的匹配对象
示例:
#.gitignore example
.txt
.gitignore
!readme.txt
exclude/*.txt

该.gitignore中定义的屏蔽规则为:

屏蔽所有的txt文件,但是readme.txt例外;屏蔽所有的.gitignore文件;屏蔽exclude目录下的所有txt文件(包括readme.txt)。

另外,还可以在配置项中通过core.excludesfile来指定ignore文件。

$ git config core.excludesfile '_myignore'

git配置

git配置文件根据作用域的不同分为三种:

  • 系统配置文件(git安装目录/gitconfig)
  • 用户配置文件(用户主目录/.gitconfig)
  • 项目配置文件(.git/config)

git配置项都通过git config命令写入,传入不同参数写入不同的配置文件

$ git config --system/--global/
  • git config –system 写入系统配置
  • git config –global 写入用户配置
  • git config 写入项目配置

具体的配置项设置参考帮助文档,$ git config –help

删除配置使用unset命令

$ git config --global --unset alias.mycommand

git中的对象

git对象

git对象

git中包含4类对象:

  • commit 提交对象
  • tree 目录
  • blob 文件
  • tag 标记

git提交便产生一个commit对象,commit对象中包含一个tree对象,tree对象中又会包含其他的tree对象或是blob对象,blob对象是最小的组成单元,即独立的文件。每个对象都对应一个唯一的SHA-1值,只有当文件或目录有修改时这个值才会重新计算发生改变。

  • $ git log 可以查看所有commit对象
  • $ git ls-tree <commit> 查看commit对象中的tree对象
  • $ git show <blob> 查看blob的具体内容

git原理

究竟git是如何工作的?打开.git目录便可一目了然。

  • HEAD 指向当前分支
  • config 项目配置文件
  • description 供GitWeb程序使用
  • hooks/ 客户端与服务端钩子脚本
  • info/ 忽略模式
  • index 暂存区域信息
  • objects/ 所有数据内容
  • refs/ 指向所有commit的指针

HEAD文件中是形如以下代码的内容:

ref: refs/heads/dev

它指向refs/heads/dev,而dev文件中代码指向当前分支最近的commit对象

objects目录中保存有所有git对象,这些对象取sha-1值的前两个字母为一个目录,剩下的38个字符作为文件名保存,在上一节“git中对象”中能查看到的所有git对象都保存在这个目录中,可以使用git cat-file <sha-1>来获取对象内容。

$ git cat-file -p 63a46849

不妨多使用cat-file命名多看看各种对象的内容,有助于理解git对象的结构。

refs目录中保存了git中使用的所有引用或指针,因为不可能任何时候都是用sha-1值来指代对象,git对象也可以有“缩略名”。通常refs目录会包含以下目录:

  • heads 保存所有分支的HEAD指针
  • remotes 保存远程仓库信息
  • tags 保存所有tag指针

逐一地查看这些文件内容,你就什么都明白了。使用 git update-ref 命令可以直接新建一个引用。

$ git update-ref refs/heads/test-branch c56dce
$ git update-ref refs/tags/test-tag c56dce

执行上述命令,这样你的git版本库中就多了一个test-branch分支和一个名为test-tag的tag。

其他的比如git还有些底层的命令,我在文中所列举的,包括之前基础篇的都是一些高级命令。可以使用这些底层命名直接对git库进行一些操作,有关git底层命名的详细内容,可以到网上去找找。

分享到:
评论

相关推荐

    git尚硅谷笔记.pdf

    #### 六、Git进阶技巧 - **多人协作**:在团队中使用Git时,可以通过分支隔离不同的功能开发,定期合并到主分支。 - **跨团队协作**:对于不在同一团队中的开发者,可以通过共享远程仓库实现协作。 #### 七、案例...

    git最全笔记整理,git入门必备

    ### Git 最全笔记整理——Git 入门必备 #### 一、Git 是什么? Git 是一种分布式版本控制系统,主要用于跟踪计算机文件的更改,并协调多个用户之间的协作。它最初由 Linus Torvalds 在 2005 年为了更好地管理 ...

    Git和Github笔记

    ### Git和Github笔记 #### 一、Git基础知识 ##### 1.1 版本管理概述 版本管理是一种软件工程实践,旨在记录文件或项目的不同版本,以便能够追踪变更历史、回溯到之前的状态或者比较不同版本之间的差异。这种方式...

    git+GitHub笔记总结1

    3. 进阶操作: - **合并分支**:`git merge` 命令用于合并分支,通常在解决冲突后进行。 - **分支管理**:`git branch` 用于创建、切换和删除分支,便于开发和维护。 - **解决冲突**:当多人修改同一部分代码时,...

    Git进阶技巧:提升团队协作效率个人学习笔记.md

    本文介绍了Git的一些进阶使用技巧,包括分支管理、合并策略、钩子脚本等,旨在帮助读者提升团队协作中的代码管理效率,解决常见的问题和挑战。

    老男孩Linux运维笔记--文字版

    最后,笔记可能还会涉及自动化运维工具,如Ansible和Puppet,以及版本控制系统Git,帮助你实现运维流程的标准化和自动化,提高工作效率。 总之,《老男孩Linux运维笔记--文字版》涵盖了Linux运维的各个方面,无论你...

    黑马程序员-Java语言进阶-源码、教程笔记.zip

    day01_Object类、常用API day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 ...

    新版Android开发教程及笔记-完整版

    【Android开发基础】 ...这个完整版的Android开发教程及笔记将全面讲解以上内容,为初学者和进阶开发者提供宝贵的参考资料。通过深入学习,你可以熟练掌握Android应用开发,构建出自己的创新应用。

    git-note:git学习笔记

    这篇"git-note"学习笔记将深入探讨Git的基础概念、常用命令、分支管理、远程仓库以及合并冲突等关键知识点。 1. Git基础 - 初始化仓库:在本地创建一个新的Git仓库,可以使用`git init`命令。 - 克隆仓库:`git ...

    obsidian-git 插件

    Obsidian Git 插件引入 Git 功能,让用户能够像管理代码一样管理他们的笔记,轻松查看和回滚笔记的修改历史。 2. 协作共享:通过 Git,用户可以与他人共享笔记库,协同编辑,保持团队知识的同步,提高工作效率。 ...

    我的笔记叽叽叽叽叽叽叽

    【标题】:“我的笔记叽叽叽叽叽叽叽” 这篇笔记主要聚焦于“Git”的学习与掌握...这份PDF文档应该深入浅出地介绍了Git的基础和进阶内容,适合不同水平的读者参考学习,通过阅读和实践,可以有效提升对Git的掌握程度。

    2023-03-31 项目笔记-第一阶段-3.2类型的使用

    C语言课程规划中提到,初阶和进阶的C语言学习共需要38节课程,每节3小时,总计114小时。这涵盖了C语言基础知识的学习以及相关作业的讲解。在学习过程中,建议学员保持专注,避免分散注意力,如通过全屏观看课程,...

    2023-03-31 项目笔记-第一阶段-1.什么是C语言 2.第一个C语言程序 3.数据类型

    【C语言概述】 C语言是一种中级编程语言,由贝尔实验...- 掌握基本的Git操作,如`add`、`commit`和`push`,并逐步深入学习Git的更多功能。 - 使用工具辅助学习,如印象笔记(有道云笔记)进行知识管理,方便随时复习。

    2023-03-31 项目笔记-第一阶段-1.什么是C语言 2.第一个C语言程序

    6. 探索使用工具,如印象笔记(有道云笔记),方便检索和复习。 【代码托管平台】 GitHub和Gitee是常用的代码托管平台,它们允许程序员存储、版本控制和分享代码。通过添加、提交和推送代码,可以跟踪代码更改并...

    2023-03-31 项目笔记-第一阶段-1.什么是C语言 2.第一个C语言程序 3.数据类型 4.变量、常量

    【C语言基础知识】 C语言是一种高级程序设计语言,由Dennis Ritchie于1972年在贝尔实验室开发。它以其简洁、高效和强大的系统编程能力而闻名,被广泛应用于...- 使用笔记工具,如印象笔记,便于整理和检索学习资料。

    免费Eclipse插件开发学习笔记-源代码1至24章.zip

    "免费Eclipse插件开发学习笔记-源代码1至24章.zip" 是一个压缩包,包含了从基础到进阶的Eclipse插件开发学习资料。 这个压缩包很可能是某个教程或书籍的配套资源,提供了24个章节的源代码示例,帮助读者逐步理解并...

    Git学习笔记

    这份"Git学习笔记"包含了关于Git的基础知识、高级用法以及实战技巧,非常适合对Git感兴趣的初学者和进阶者进行深入学习。 Git的核心概念包括仓库(Repository)、提交(Commit)、分支(Branch)、合并(Merge)和...

    java8集合源码分析-Notes:笔记

    本站目的是记录技术学习笔记,分享技术学习笔记、技术文章、优秀资源。 若您认为侵犯你的个人知识产权,请联系邮箱(),我会第一时间和您进行沟通处理。 若你喜欢本站内容,欢迎转载,但请注明出处,且勿用于

    git-tutorial:2011 年在 Imaginática 上讲授的 Git 课程

    总的来说,2011年Imaginática上的Git教程提供了全面的学习材料,涵盖了Git的基础和进阶内容,帮助开发者掌握这个强大的版本控制系统,从而提高他们在软件开发项目中的效率和协作能力。通过深入理解和实践这些知识点...

Global site tag (gtag.js) - Google Analytics