怎么看主人的提交?

时间:2013-11-23 23:05:46

标签: git

我想在我的主分支上看到最后五次提交。我这样做:

git checkout master 
git log -p -5

我看到提交,我很确定不是主人。 因为有一条消息:

 Merge branch 'feature/ABLE-1370' into develop

明显我做错了什么?

2 个答案:

答案 0 :(得分:4)

这些命令适用于查看主分支上的git log

使用“坏”或“怪异”提交:如果您将其他内容合并到develop中,然后将其合并到master中,它仍会保留该提交消息。

要确认,您可以运行git branch。您所在的分支将是旁边有*的分支。

答案 1 :(得分:0)

你在这里遇到的问题很可能是“在一个分支上”的真正含义。

在进行简单的线性开发历史记录时,很明显每个提交都在哪个分支上。它仅在一个(或技术上,最多一个)分支上:

$ git checkout branchA
... hack away for a while ...
$ git commit -a -m "new stuff for A" # new commit is on branchA
$ git checkout branchB
... hack some more ...
$ git commit -a -m "new stuff for B"

但是当你开始合并不同的分支时会发生什么?在上面的branchA和branchB中进行了一次提交之后,你可能会遇到这样的事情:

...-C3--C6       <-- branchA

...-C4--C5--C7   <-- branchB

其中每个Cn代表一个提交。名称branchA指向提交C6,这是您使用“A的新内容”创建的名称,名称branchB指向提交C7,这是你用“B的新东西”制作的。 (C3C4已经存在。C6指向C3作为其父级,这就是我们如何向后追溯branchA的历史记录; C7指向C5,而C4指向branchA,依此类推。)

现在假设你回到git merge branchBC8。这使得“合并提交” - 我们可以将其称为提交M,但我们将其称为$ git checkout branchA $ git merge branchB 以进行合并:

...-C3--C6-----M <-- branchA
              /
...-C4--C5--C7   <-- branchB

这改变了“提交图”,现在我们有了这个:

M

新的合并提交C6两个父级,提交C7branchA。标签M已更改为指向提交M

如果我们向后追查C7,看看哪些提交是“在分支上”,我们就会 - 好吧,git会,所以我们也应该: - ) - 关注两个父母。提交C5现在“在分支上”,提交C4C4以及branchB之前的任何历史记录。

然后,您可能想知道如何在合并之前判断哪些提交“最初”在分支上,然后合并“一堆以前无关,但现在在婚姻中的家庭”提交。

完全一般的答案是“你不能”。这是因为标签 - 像C7这样的分支名称 - 不是永久性的。目前很明显,提交branchB及其历史刚刚结婚,但如果我们删除了$ git branch -d branchB 标签:

...-C3--C6-----M <-- branchA
              /
...-C4--C5--C7

然后我们只留下这张照片:

--first-parent

有时只关注合并的“第一个父”给出“主线”的“相当准确”的图片,并且git的A--B--C--D <-- master 标志只跟随每个的第一个父级合并。


当两个不同的开发人员从某个共享存储库中克隆项目时,这种事情“自然而然地发生”,并且两者都对某个分支进行(不同的)更改,然后他们决定合并他们的更改。假设Carl有一个包含四个提交的回购:

E

Alice制作副本并添加提交A--B--C--D--E <-- master

F

鲍勃制作了卡尔原创的副本,并添加了提交A--B--C--D--F <-- master

git fetch

爱丽丝和鲍勃都告诉卡尔他们的新功能或错误修复,卡尔决定他想要两者。他可以使用git remote add(以及 E <-- remotes/alice/master / A--B--C--D <-- master \ F <-- remotes/bob/master 等)将其带入:

$ git merge alice/master
Updating b6636ec..a430f6d
Fast-forward
[snip]

现在,Carl可以通过简单的两步流程将这两者融入他的(Carl's)回购中。第一步,快速合并以获取一些东西(让我们说爱丽丝改变):

remotes/

这给了(我现在将 E <-- master, alice/master / A--B--C--D \ F <-- bob/master 留在名称之外):

$ git merge bob/master

下一步:

merge made by recursive

这必须进行真正的合并提交(所以它, E <-- alice/master / \ A--B--C--D M <-- master \ / F <-- bob/master 以及所有这些),给出:

E

如果Alice和Bob现在从Carl获取最新的更新,他们已经拥有自己的本地分支名称(Alice正在调用master F的提示,并且他们没有得到彼此的名字(Alice不会在这里“看到”Bob,只有Carl“看到”Bob),所以Alice添加了没有标签的提交M,并且origin/master添加了标签carl(或者,如果她对名字很挑剔,她会将遥控器重命名为carl/master,这样master)。然后,她可以移动自己的M以指向A--B--C--D-E-M <-- master, origin/master \ / F

E

鲍勃同样可以为他提出新的提交 - 他们是MF而不是ME(但是M的“第一父母”仍然是A--B--C--D-E-M <-- origin/master \ / F <-- master [before Bob does the merge] ):

master

如果Bob选择向前滑动他的gitk标签(作为快进合并),他现在看到与Alice完全相同的图片。

那么,对于提交E和F,它们是哪个分支?他们只是“在主人身上”,他们甚至制作“在主人身上”,但卡尔没有让他们“在主人身上”,而爱丽丝和鲍勃各自只做了一个“在主人”。最后,git给你的唯一东西就是最终的提交图。


要查看提交图,您可以按照评论中的建议使用git log --graph ,或者:

--decorate --oneline

我发现这在--all给出时特别有用。添加-number以查看所有分支,和/或-n number-5(如-n 5或{{1}})以限制所查看的提交次数。