标签:commit 仓库 编辑 快照 修改 假设 com mic image
正常情况下,如果想要一个脱离主线的分支来开发项目,常常需要完全创建一个源代码目录的副本,对大项目来说,这样的过程会耗费很多时间,所以这是一个比较低效的做法。但是git分支则不同,你会发现使用分支和合并分支是非常方便的。
首先要知道git保存数据不是保存的文件的差异或变化,而是一系列不同时刻的文件快照。
在进行提交操作时,Git会保存一个提交对象(blob对象),该提交对象会包含一个指向暂存内容快照的指针,还包含作者的姓名,邮箱和提交时输入的信息以及指向它父对象的指针,首次提交时提交对象没有父对象,普通提交产生的提交对象有一个父对象,而由多个分支合并产生的提交对象 会有多个父对象。
这里举一个例子,假设现在工作目录中有三个将要被暂存和提交的文件,当使用git commit
进行提交操作时,git会先计算每个子目录的校验和,然后在git仓库中为这些校验和保存为树对象,随后Git便会创建一个提交对象,它除了上面提到的那些信息外,还包含指向这个树对象的指针。现在仓库中有五个对象:三个blob对象(保存着文件快照)一个树对象(记录着目录结构和blob对象 索引)以及一个提交对象(包含着指向前述树对象的指针和所有提交信息)
当做些修改后再提交,那么产生的提交对象会包含一个指向上次提交对象(父对象)的指针。
git 中默认分支的名字是master
,而origin
是Git给克隆的仓库服务器的默认名字。
如果要创建一个新的分支testing,则需要使用命令:git branch testing
,但是如何知道当前是在哪一个分支上的呢?也很简单,git中有一个名为HEAD
的特殊指针,它会指向当前所在的分支。可以使用git log
命令查看当前各个分支当前所指的对象。
可以看到当前是在master
分支上,master
和testing
指针均指向b6fd293的分支上。
git checkout testing
同时在当前目录下新建Test9.md,并提交。可以看到:
这时候再切换回master
分支git checkout master
可以看见目录中没有Test9.md
了,这条命令做了两件事,第一是将HEAD
指回master
分支,二是将工作目录中的内容恢复成master
分支所指向的快照内容。
这个时候再修改Test8.md
的内容之后提交。
当使用命令git log --oneline --graph --all
可以看到提交历史和各个分支的指向。
注意:如果想要新建一个分支并同时切换到那个分支上可以运行一个带有-b
选项的git checkout
命令
使用git branch -d
可以删除一个分支,这里删除刚刚创建的testing2
分支
使用git merge
命令来合并两个分支,首先切换到master
分支中,然后使用命令git merge testing
会弹出类似于提交信息文本,用vim
语法编辑然后退出。
然后查看分支的详细情况会发现合并的过程其实是创建了一个新的快照,并且将两个分支末端的快照合并到新快照中且自动创建了一个新的提交指向新的快照。这被称作一个合并提交,它的特别之处是他不止有一个父提交。
(下图中C6表示是新的快照,C4和C5合并为C6)
git branch
如果不加任何命令运行,则会显示当前所有分支的一个列表
git branch -v
可以查看每一个分支的最后一次提交
git branch --merged
和git branch --no-merged
:
建立新的分支testing2
,并且在当前目录中建立新的文件夹“Testing2”里面添加新文件“testing2.md”,并且提交。查看当前git的状态:
这时候使用git branch --merged
可以看到已经合并到当前分支的分支列表:
在这个列表中没有*
的分支通常可以从删除掉,而--no-merged
参数列表中的分支当尝试删除会报错。
标签:commit 仓库 编辑 快照 修改 假设 com mic image
原文地址:https://www.cnblogs.com/haoocker/p/12275649.html