git查看分支(git创建文件)

写在前面今天和小伙伴们分享一些Git分支的笔记学习的原因,关于Git分支之前简单看了下,就直接开始玩了,结果整不明白,乱七八糟看着很糟心,所以觉得有必要系统的学

写在前面今天和小伙伴们分享一些Git分支的笔记学习的原因,关于Git分支之前简单看了下,就直接开始玩了,结果整不明白,乱七八糟看着很糟心,所以觉得有必要系统的学习下博文为《Pro Git》读书笔记整理,基本上是书里的知识感谢开源这本书的作者和把这本书翻译为中文的大佬们理解不足小伙伴帮忙指正,书很不错,感兴趣小伙伴可以去拜读下

“平躺是一种积极的生活态度——山河平安”

Git 分支

对Git分支机构管理的几点建议?一般能就地解决的问题就就地解决。本地合并(要合并的远程分支)和本地冲突解决。如果自己的分支只关心发展,不合并,不改变基地,在自己的分支上越走越远,慢慢的跟远的主分支落后太多,申请合并一堆冲突...,这是一件非常糟糕的事情,尤其是

git查看分支(git创建文件)插图

在学习Git的分支之前,我们先学习一些理论知识。

分支理论

Git保存的不是文件的变化或差异,而是一系列不同时刻的快照。

提交时,Git将保存一个提交对象。包括:

一个指向暂存内容快照的指针作者的姓名和邮箱提交时输入的信息指向它的父对象的指针

第一次提交生成的提交对象没有父对象,普通提交操作生成的提交对象有一个父对象,多个分支合并生成的提交对象有多个父对象。

假设有一个工作目录,其中包含三个要临时添加和提交的文件。转移操作将计算每个文件的校验和(使用SHA-1哈希算法),然后将文件快照的当前版本保存到Git存储库中(Git使用blob对象来保存它们),最后将校验和添加到转移区域以供提交:

使用Git commit进行提交时,Git会先计算每个子目录的校验和(本例中只计算项目的根目录),然后将这些校验和作为树对象保存在git repository中。然后,Git将创建一个submission对象,其中不仅包含上面提到的信息,还包含一个指向树对象(项目的根目录)的指针。通过这种方式,Git可以在需要时重新生成这个保存的快照。

目前,Git存储库中有五个对象:三个blob(保存文件快照)、一个树(记录blob的目录结构和索引)和一个commit对象(包含指向树的指针和所有提交信息)。

git查看分支(git创建文件)插图(1)

做一些修改后再次提交,那么这次生成的提交对象就会包含一个指向上次提交对象(父对象)的指针。

git查看分支(git创建文件)插图(2)

Git的分支实际上只是一个指向提交对象的变量指针。Git的默认分支名称是master。在多次提交操作之后,您实际上拥有了一个指向最后一个提交对象的主分支。主分支将在每次提交时自动向前移动。

Git的master分支不是特殊分支。和其他分支没什么区别。几乎每个仓库都有主分支的原因是git init命令默认创建的,大多数人都懒得去改。

PS E:\docker\git_example> git initInitialized empty Git repository in E:/docker/git_example/.git/PS E:\docker\git_example> git statusOn branch master.........

git查看分支(git创建文件)插图(3)PS E:\ docker \ git _ example & gt;git初始化了E:/docker/git_example/中的空Git储存库。git/PS E:\ docker \ git _ example & gt;分支机构主管的git状态.........

分支创建

“Git如何创建新的分支?」

很简单,它只是创建了一个可以移动的新指针。在当前提交对象上创建一个指针。例如,要创建一个测试分支,您需要使用git branch命令:

git branch testing

git查看分支(git创建文件)插图(4)git分支测试

“Git怎么知道它当前在哪一个分支上?」

也很简单。它有一个名为HEAD的特殊指针。在Git中,它是指向当前本地分支的指针。git branch命令只创建一个新分支,不会自动切换到新分支。

git查看分支(git创建文件)插图(5)

您可以简单地使用git log命令来查看每个分支当前引用的对象。提供这个函数的参数是-decoration。

git查看分支(git创建文件)插图(6)

$ git log-one line-decoration
f30ab(HEAD-& gt;master,testing)添加特性#32 -向中央接口添加新的
格式的能力
34ac2修复的错误#1328 -特定条件下的堆栈溢出
98ca9我的项目的初始提交

git查看分支(git创建文件)插图(7)

分支切换

要切换到现有的分支,您需要使用git checkout命令。现在让我们切换到新创建的测试分支:然后头部指向测试分支。

$ git checkout testing

git查看分支(git创建文件)插图(8)$ git检验测试

切换分支后再次提交,新的提交将提交到新的分支。

$ vim test . Rb $ git commit-a-m & # 39;做出了改变& # 39;您的测试分支已经向前发展了,但是主分支却没有。它仍然指向运行git checkout时所指向的对象。

git查看分支(git创建文件)插图(9)

现在让我们切换回主分支来看看:

$ git checkout master

git查看分支(git创建文件)插图(10)$ git结账大师

这个命令做两件事。

一是使HEAD指回master分支二是将工作目录恢复成master分支所指向的快照内容

也就是说,如果您现在进行更改,项目将从一个旧版本开始。本质上,这是为了向另一个方向发展而忽略测试分支所做的更改。

请注意,分支开关将改变您的工作目录中的文件,

当切换分支时,一定要注意您的工作目录中的文件将会改变。即使存在已跟踪但未提交的文件,它们也会被自动覆盖。如果您切换到一个较旧的分支,您的工作目录将恢复到上次提交时的状态。

“如果Git不能干净利落地完成这个任务,就会禁止切换分支。」

$ vim test . Rb $ git commit-a-m & # 39;做了其他改变& # 39;现在,这个项目的提交历史出现了分叉,因为刚才你创建了一个新的分支,切换到过去做了一些工作,然后又切换回主分支做一些其他的工作。以上两个变化针对不同的分支:

你可以不断地在不同的分支之间来回切换和工作,在合适的时候合并它们。对于所有这些工作,您只需要branch、checkout和commit命令。

git查看分支(git创建文件)插图(11)

您可以简单地使用git log命令来查看分叉历史。运行gitlog-online-decoration-graph-al1,它会输出你的提交历史,每个分支的方向以及项目的分支。

git查看分支(git创建文件)插图(12)

因为Git的分支本质上只是一个包含被引用对象的校验和的文件(长度为40的SHA-1值字符串),所以它的创建和销毁非常高效。创建一个新分支相当于将41个字节(40个字符和1个换行符)写入一个文件。能简单到不愉快吗?

创建新分支时切换到过去。

我们通常在创建一个新分支后立即切换到过去,这可以用git checkout-b来完成

看演示

分支的新建与合并开发某个网站。为实现某个新的用户需求,创建一个分支。在这个分支上开展工作。

就在这时,你突然接到一个电话,说有一个严重的问题需要紧急修复。您将按如下方式处理它:

切换到你的线上分支(production branch)。为这个紧急任务新建一个分支,并在其中修复它。在测试通过之后,切换回线上分支,然后合并这个修补分支,最后将改动推送到线上分支。切换回你最初工作的分支上,继续工作新建分支

首先,让我们假设你正在做你的项目,并且你已经在主分支上提交了一些东西。

git查看分支(git创建文件)插图(13)

现在,你决定解决你公司使用的问题跟踪系统中的问题#53。要创建一个新分支并同时切换到该分支,您可以运行带有-b参数的git checkout命令:

$ git check out-b is s53切换到新分支& # 34;iss53 & # 34你继续在#53上工作并提交了一些材料。在这个过程中,iss53分支不断向前移动,因为你已经检出了该分支(也就是你的头指针指向iss53分支)。

$ vim index.html$ git commit -a -m 'added a new footer [issue 53]'

git查看分支(git创建文件)插图(14)$ vim index . html $ git commit-a-m & # 39;添加了新的页脚[第53期]& # 39;

现在你已经接到了那个电话,有一个紧急的问题等着你去解决。有了Git的帮助,你就不用把这个紧迫的问题和iss53的修订混在一起了,也不用花大力气去还原53#期的修订,然后再添加这个紧迫问题的修订,最后把这个修订提交给在线分支。你所要做的就是切换回主分支。

但是,在您这样做之前,请注意您的工作目录和临时存储区中未提交的更改,这些更改可能会与您即将检出的分支冲突,并阻止Git切换到该分支。最好的方法是在切换分支之前保持干净的状态。

有一些方法可以解决这个问题(例如,堆放和清理)。现在,让我们假设您已经提交了所有的修改,此时您可以切换回主分支:

这里需要注意的是,新分支必须在切换回主分支后创建,不要在iss53分支上创建新分支。

$ git结帐主机切换到分行& # 39;主人& # 39;此时,你的工作目录和你开始问题#53之前完全一样。现在,您可以集中精力解决紧急问题。请记住:当您切换分支时,Git将重置您的工作目录,使它看起来像是回到了您上次在那个分支上提交的时候。Git将自动添加、删除和修改文件,以确保您的工作目录与上次提交该分支时的目录完全相同。

接下来,你必须解决这个紧迫的问题。让我们建立一个热修复分支,并致力于它,直到问题得到解决:

$ git checkout -b hotfixSwitched to a new branch 'hotfix'$ vim index.html$ git commit -a -m 'fixed the broken email address'[hotfix 1fb7853] fixed the broken email address 1 file changed, 2 insertions(+)

git查看分支(git创建文件)插图(15)$ git check out-b hot fix切换到新的分支& # 39;hotfix & # 39$ vim index . html $ git commit-a-m & # 39;修复损坏的电子邮件地址& # 39;[hotfix 1fb7853]修复了损坏的电子邮件地址1个文件被更改,2个插入(+)

您可以运行测试以确保您的修改是正确的,然后将修补程序分支合并回您的主分支以进行在线部署。

这里需要注意的是,分支合并时,当前分支为合并分支,合并分支为git merge xxx指定的分支。要将B合并到A中,当前分支应该是A,使用git merge B的命令进行合并。

您可以使用git merge命令来实现上述目的:

$ git check out master $ git merge hot fix更新F42C 576..3A0874C快进index.html | 2 ++ 1个文件改了,2个插入(+)“快进”:合并的时候应该注意到“快进”这个词了吧。由于您想要合并的分支修复程序所指向的提交C4是您所在的提交C2的直接继承者,Git将直接向前移动指针。

换句话说,当你试图合并两个分支时,如果你可以沿着一个分支到达另一个分支,Git在合并两个分支时会简单地将指针向前推(将指针向右移动),因为在这种情况下没有分歧需要解决——这叫做“快进”。

现在,最新的修改在主分支指向的提交快照中,您可以开始发布修复了。

git查看分支(git创建文件)插图(16)

在这个紧急问题的解决方案发布后,在被打断之前,你就准备回去工作了。但是,您应该首先删除修补程序分支,因为您不再需要它,并且它的主分支已经指向同一位置。您可以使用带有-d选项的git branch命令来删除分支:

$ git分支-d热修复已删除分支热修复(3A0874C)。现在你可以切换回你正在处理的分支,继续你的工作,也就是#53问题的分支(iss53分支)。

$ git checkout iss53Switched to branch "iss53"$ vim index.html$ git commit -a -m 'finished the new footer [issue 53]'[iss53 ad82d7a] finished the new footer [issue 53]1 file changed, 1 insertion(+)

git查看分支(git创建文件)插图(17)$ git check out is 53 switched to branch & # 34;iss53 & # 34$ vim index . html $ git commit-a-m & # 39;完成新页脚[第53期]& # 39;[iss53 ad82d7a]完成了新页脚[issue 53]1个文件已更改,1个插入(+)

您在修补程序分支上所做的工作不包括在iss53分支中。如果您需要获取修补程序所做的更改,

您可以使用git merge master命令将主分支合并到iss53分支中,或者您可以等到iss53分支完成其任务后,再将其合并回主分支中。

假设您已经修复了问题#53,并打算将您的工作合并到主分支中。为此,您需要将iss53分支合并到master分支中,这与您在合并hotfix分支之前所做的类似。您只需要检查您想要合并到的分支,然后运行git merge命令:

$ git结帐主机切换到分行& # 39;主人& # 39;$ git merge是53Merge由& # 39;递归& # 39;Strategy.index.html | 1+1文件已更改,1插入(+)这看起来与您以前合并修补程序分支时略有不同。在这种情况下,你的发展历史从一个更早的地方偏离。因为master branch的提交不是iss53 branch的提交的直接祖先,所以Git要做一些额外的工作。

当这种情况发生时,Git将使用两个分支末端指向的快照(C4和C5)以及两个分支的共同祖先(C2)来进行简单的三方合并。

git查看分支(git创建文件)插图(18)

与之前将分支指针向前推不同,Git对这一三方合并的结果进行新的快照,并自动创建一个新的提交来指向它。这称为合并提交,其特殊之处在于它有多个父提交。

git查看分支(git创建文件)插图(19)

现在您的更改已经被合并,不再需要iss53分支。现在,您可以在任务跟踪系统中关闭该任务,并删除该分支。

$ git branch -d iss53上面提到有一些方法可以解决这个问题(例如,隐藏和清理)。让我们来看看。

贮藏与清理

有时候,当你已经在一个项目的一部分工作了一段时间,一切都陷入混乱,然后你想切换到另一个分支去做别的事情。问题是,你不希望仅仅因为你稍后回到这一点,就为完成了一半的工作创建一个提交。这个问题的答案是git stash命令。

Stash会处理工作目录的脏状态——也就是跟踪文件的更改和临时的更改——然后将未完成的更改保存到一个堆栈中,你可以随时重新应用这些更改(甚至在不同的分支中)。

贮藏工作

运行git status,您可以看到更改后的状态:

$ git statusChanges待提交:(使用& # 34;git重置头& lt文件& gt..."取消登台)modified:index . html未为提交登台的更改:(使用& # 34;git add & lt文件& gt..."更新将要提交的内容)(使用& # 34;git结帐-& lt;文件& gt..."以放弃工作目录中的更改)修改:lib/simplegit.rb“我现在想切换分支,但还不想提交之前的工作;所以存储修改。将新存储库推入堆栈,并运行git stash或git stash push:"

$ git stash保存了工作目录和索引状态\ & # 34;WIP on master: 049d078添加了索引文件& # 34;头现在是在049d078添加了索引文件(要恢复它们键入& # 34;git stash apply & # 34)您可以看到工作目录是干净的:

分支主机上的$ git status #没有要提交的内容,工作目录清理完毕。此时,您可以切换分支并在其他地方工作;您的修改存储在堆栈中。要查看存储的东西,可以使用git stash list:

$ git stash list stash @ { 0 }:WIP on master:049 d078添加了索引文件tash @ { 1 }:WIP on master:c 264051 Revert & # 34;增加了file _ size & # 34Stash @ {2}: WIP on master: 21D80A 5添加了要记录的编号在本例中,有两个先前的存储,因此您将面临三个不同的存储任务。您可以在原始stash命令的帮助提示中重新应用刚刚通过该命令保存的工作:git stash apply。

如果您想要应用一个旧的存储库,您可以通过名称来指定它,就像这样:git stash apply stashe@{2}。如果不指定商店,Git认为指定了最近的商店:

$ git stash apply on branch master changes未准备提交:(use & # 34git add & lt文件& gt..."更新将要提交的内容)(使用& # 34;git结帐-& lt;文件& gt..."放弃workingdirectory中的更改)modified:index.html modified:lib/simple git . rbn未添加任何更改以提交(使用& # 34;git add & # 34和/或& # 34;git commit-a & # 34;)与stash storage modification的新分支相比,一个很大的优势就是应用的时候不一定要有一个干净的工作目录,或者要应用到同一个分支才能成功应用存储。

Stash可以在一个分支上保存一个存储库,切换到另一个分支,然后尝试重新应用这些修改。存储应用程序时,工作目录中还可能有修改过的和未提交的文件——如果有任何东西不能干净地应用,Git就会有合并冲突。

对文件的更改被重新应用,但先前临时存储的文件(添加)不再被临时存储。在这种情况下,您必须使用- index选项来运行git stash apply命令,以尝试重新应用临时更改。如果这样做了,那么你将回到你原来的位置:

$ git stash apply-index on branch master要提交的更改:(use & # 34git重置头& lt文件& gt..."取消登台)modified:index . html未为提交登台的更改:(使用& # 34;git add & lt文件& gt..."更新将要提交的内容)(使用& # 34;git结帐-& lt;文件& gt..."放弃工作目录中的更改)modified:lib/simple git . Rb apply选项将只尝试应用存储的工作——它仍然在堆栈中。您可以运行git stash drop加上要删除的存储库的名称来删除它:

$ git stash list stash @ { 0 }:WIP on master:049 d078添加了索引文件tash @ { 1 }:WIP on master:c 264051 Revert & # 34;增加了file _ size & # 34Stash @ {2}: WIP on master: 21D80A 5添加数字以记录$ git Stash drop stash @ { 0 } dropped stash @ { 0 }(364 e 91 f 268 f 0900 BC 3 ee 613 f 9 f 73 e 82 aaed 43)有些朋友可能会说,比如stash之后,我忘了有stash。

$ git status-sm index.html mlib/simple git . rbgitsstash命令的- keep-index选项。它告诉Git不仅要存储所有的临时内容,还要将它们保存在索引中。,也就是我们可以通过status命令来检查状态。

$ git stash-keep-index保存了主服务器上的工作目录和索引状态WIP:1b65b17添加了index文件头现在位于1b 65b 17添加了索引文件$ git status-sm index.html默认情况下,git stash只存储修改过的和临时跟踪的文件。如果指定- include-untracked或-u选项,Git还将存储任何未被跟踪的文件。

$ git status-sM index.html M lib/simple git . Rb??new-file . txt $ git stash-主服务器上使用的工作目录和索引状态WIP:1b65b17添加了索引文件头现在位于1b 65b 17添加了索引文件$ git status-s $。然而,在存储库中包含未跟踪的文件仍然不会包含明确忽略的文件。要另外包括被忽略的文件,请使用- al1或-a选项。

从贮藏创建一个分支

如果您存储了一些工作,将它放在那里一段时间,然后继续在存储的分支上工作,那么在重新应用工作时可能会出现问题。如果应用程序试图修改刚刚修改的文件,您将会遇到合并冲突,并且必须解决它。

如果您想要一种简单的方法来再次测试存储的更改,您可以运行git stash branch

$ git stash branch testchangesM index . html lib/simple git . Rb切换到新的分支& # 39;testchanges & # 39在分支测试中要提交的更改:(使用& # 34;git重置头& lt文件& gt..."取消登台)modified:index . html未为提交登台的更改:(使用& # 34;git add & lt文件& gt..."更新将要提交的内容)(使用& # 34;git结帐-& lt;文件& gt..."以放弃工作目录中的更改)modified:lib/simple git . rbdropdrefs/stash @ { 0 }(29d 385 a81d 163 DFD 45 a 452 a2 ce 816487 a6b 8 b 014)这是一个非常好的方法,可以轻松地恢复存储工作,并继续在新的分支中工作。

清理工作目录

对于工作目录中的一些作业或文件,你要做的可能不是存储,而是删除。git clean命令用于此目的。

这个命令需要小心使用,因为它被设计用来从工作目录中删除未被跟踪的文件。

如果你改变主意,你可能无法取回那些文件的内容。更安全的选择是运行gitstash-all来删除所有内容,并将其存储在堆栈中。

您可以使用git clean命令删除冗余文件或清理工作目录。使用git clean -f -d命令删除工作目录中空的所有未跟踪的文件和子目录。-f表示“强制”或“确定要移除”。使用它要求g it配置变量clean.requireForce没有显式设置为false。

如果您只是想看看它会做什么,您可以使用- dry-run或-n选项来运行该命令,这意味着“进行一次演练,并告诉您将删除什么”。

$ git clean-d-n将删除test.o将删除tmp/默认情况下,git clean命令将只删除未被忽略的未跟踪文件。

$ git status -s M lib/simplegit.rb??建造。TMP??Tmp/与中的模式匹配的任何文件。gitignore或其他被忽略的文件不会被删除。如果你也想删除那些文件,

$ gitclean-n-d将删除build.tmp将删除tmp/为了进行完全干净的构建,可以在clean命令中添加-x选项。

$ gitclean-n-d-x将删除build.tmp将删除test.o将删除tmp/branch management git branch命令不仅可以创建和删除分支。如果不带任何参数运行它,您将获得所有当前分支的列表:

git查看分支(git创建文件)插图(20)

git branch -a命令可以查看本地和远程分支。

git查看分支(git创建文件)插图(21)

注意主分支前的*字符:它代表现在签出的分支(即当前头指针所指向的分支)。

这意味着,如果此时提交,主分支机构将推进新的工作。如果需要检查每个分支的最后一次提交,可以运行git branch -v命令:

git查看分支(git创建文件)插图(22)

两个有用的选项-merged和- no-merged可以过滤这个列表中已经合并或者没有合并到当前分支的分支。

查看哪些分支已经合并到当前分支,可以运行git branch--merged:可以使用git branch-d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。查看所有包含未合并工作的分支,可以运行 git branch --no-merged:因为它包含了还未合并的工作,尝试使用git branch-d命令删除它时会失败:如果真的想要删除分支并丢掉那些工作,如同帮助信息里所指出的,可以使用-D选项强制删除它。

git查看分支(git创建文件)插图(23)

好了,时间关系先整理到这里,分支工作流程,基地变更等。会在下面的博文里分享给朋友。

博文整理参考

《亲Git》

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/97876.html

发表回复

登录后才能评论