Restudy Git

本文不保证完全正确,希望对本文有意见的朋友通过写在关于界面的联系方式联系我。

本文的链接不会更改,以保持持续更新。

当我在进行领英测评的时候,我发现真的需要对此写一点专题出来,测评中涉及的问题是很基础但是非常有用的。这次我们先从Git开始,之后会涉及Python、Bash等等方面。我的目的不是为了通过测评,而是好好总结自己的知识。

Git的存储结构

在Git本地仓库中, 除了.git目录,都属于工作目录。而.git目录保存了仓库的相关信息(摘自GreenGeeks):

文件/目录 功能
- objects 保存了全部对象,包括files、commits、trees、tag等
– objects/[0-9a-f][0-9a-f] 每个新创建的对象会保存到专属的文件里面,SHA1的前两位作为目录名
– objects/pack 保存了压缩之后的对象
– objects/info 额外信息
- refs 引用信息被存在这个目录的子目录中
– refs/heads/ 保存了commit对象
– refs/tags/ 保存了所有对象的名称
– refs/remotes/ 保存从远程仓库获得的commits对象
- packed-refs 保存了打包的heads和tags
- HEAD 表示当前工作分支的引用
- config 主要配置,保存了当前项目的配置信息,如远程仓库等。首先会从本文件加载配置,之后才是~/.gitconfig/etc/gitconfig
- branches 一种独立的方式指定git fetch/pull/push的地址(旧版本)
- hooks 保存运行git命令之后的脚本,比如你commit之后,会尝试运行post-commit脚本
- index 作为一个连接工作目录和仓库的索引,commit的内容实际上来自index,而不是工作目录里面的
- remotes 保存了git fetch/pull/push的地址(旧版本)
- logs 记录了对仓库的全部更改
– logs/refs/heads/ 记录了对不同分支的更改
– logs/refs/tags/ 记录了对不同标签的更改
- modules 包含全部子模块
- worktrees 包含了对连接在一起的worktree的信息

git add

当你每次使用git add的时候,git会把文件保存到objects里面,并且添加文件索引到index。

参数

git add -u

提交所有被删除和修改的文件

git add .

提交所有修改和新建的文件

git add -A

提交所有删除、修改、新建的文件

git commit

在objects里面生成对象,tree对象表示commit时的目录树。目录树包含的文件以blob对象存储。commit对象记录了属于哪个tree,上一次commit的id、作者等。参考:Git本地仓库内部基本结构

git pull

git pull是从远程主机最新的内容拉取到本地之后,进行合并,因此你的更改通常会引起错误。这时候需要进行stash:

1
2
3
git stash
git pull
git stash pop

如果你正在使用VS Code编辑器,你会看到更新的内容,并选择保留原样还是使用新的内容。

git fetch

不同于git pull,git fetch仅仅拉取最新的内容,不进行合并。因此我们用下面的操作来模拟git pull:

1
2
git fetch origin master
git merge FETCH_HEAD

git merge

–squash

参考:Git 常用命令介绍之merge –squash的使用场景,写得很好。

git show

用处很多,后面直接加上SHA1来查看不同的对象。

git tag

给当前分支打上标签,可以直接git show <tag>。

git bisect

这是个很有用的命令,用来查找引入错误的代码提交。参见:git bisect 命令教程

git cherry-pick

用于提交指定的commit,忽略之后的commit。

git rebase

参考:你真的懂git rebase吗?

-i

参考:git rebase -i

.gitignore

参考:Git 忽略提交 .gitignore

自动生成:gitignore.io

写在最后

学会git是对每个开发来说必须的,保持分支美观线性,否则小心有强迫症的同事。

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。转载需要标明作者,并以超链接的方式指向原文。
  • Copyrights © 2020 Kevin Li
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~