最近在学习 git,对 git 也有了新的认识,写一些总结,文章基本总结于 Pro Git
其他 git 相关文章:
git 学习系列(一)—- git 的基础知识
本章主要介绍 git 的分支
分支简介
首先,git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。
在进行提交操作 (commit) 时,git 会保存一个提交对象(commit object)。
提交对象主要包括以下内容:
1. 指向暂存内容快照的指针
2. 作者的姓名和邮箱
3. 提交时输入的信息
4. 指向它的父对象的指针(初次提交无)
git 的分支,其实本质上仅仅是指向提交对象的可变指针。
注:git 的默认分支名字是 master。git 的“master”分支并不是一个特殊分支。它就跟其它分支完全没有区别。
之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它,并且大多数人都懒得去改动它。
分支创建
git branch testing
这会在当前所在的提交对象上创建一个指针。那么,Git 又是怎么知道当前在哪一个分支上呢?它有一个名为 HEAD 的特殊指针,指向当前所在的本地分支
分支切换
git checkout testing
这样 HEAD 就指向 testing 分支了。
这时候我们再进行一次提交,会发现 你的 testing 分支向前移动了,但是 master 分支却没有
这个时候我们再切回 master 分支, 并进行一些修改与提交
git checkout master
vim test.rb
git commit -a -m 'made other changes'
这个项目的提交历史已经产生了分叉,你可以在不同分支间不断地来回切换和工作,并在时机成熟时将它们合并起来
你可以简单地使用 git log 命令查看分叉历史
git log --oneline --decorate --graph --all
跟踪分支
从一个远程跟踪分支检出一个本地分支会自动创建一个叫做“跟踪分支”,跟踪分支是与远程分支有直接关系的本地分支。如果在一个跟踪分支上输入 git pull,git 能自动地识别去哪个服务器上抓取、合并到哪个分支。
设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支,你可以在任意时间使用 -u 或 –set-upstream-to 选项运行 git branch 来显式地设置。
git branch -u origin/serverfix
或者
git branch --set-upstream-to=origin/[branch] [branch]
设置追踪分支后可直接使用 git pull 不用再指定远程分支
如果想要查看设置的所有跟踪分支,可以使用 git branch 的 -vv 选项
git branch -vv
拉取
当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容,它只会获取数据然后让你自己合并。
举例:
git fetch origin 他们会在本地生成一个远程分支 origin/serverfix,指向服务器的 serverfix 分支的引用。可以运行 git merge origin/serverfix 将这些工作合并到当前所在的分支
当抓取到新的远程跟踪分支时,本地不会自动生成一份可编辑的副本(拷贝)。换一句话说,这种情况下,不会有一个新的 serverfix 分支
只有一个不可以修改的 origin/serverfix 指针。git checkout -b serverfix origin/serverfix。这会给你一个用于工作的本地分支,并且起点位于 origin/serverfix。
删除远程分支
git push origin --delete serverfix
基本上这个命令做的只是从服务器上移除这个指针。Git 服务器通常会保留数据一段时间直到垃圾回收运行,所以如果不小心删除掉了,通常是很容易恢复的。
本期就先讲这么多,分支的合并放在下一期讲,也是为了比较合并 (merge) 与变基 (rebase) 的一些差异