我想在我的主分支上看到最后五次提交。我这样做:
git checkout master
git log -p -5
我看到提交,我很确定不是主人。 因为有一条消息:
Merge branch 'feature/ABLE-1370' into develop
明显我做错了什么?
答案 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的新东西”制作的。 (C3
和C4
已经存在。C6
指向C3
作为其父级,这就是我们如何向后追溯branchA
的历史记录; C7
指向C5
,而C4
指向branchA
,依此类推。)
现在假设你回到git merge branchB
和C8
。这使得“合并提交” - 我们可以将其称为提交M
,但我们将其称为$ git checkout branchA
$ git merge branchB
以进行合并:
...-C3--C6-----M <-- branchA
/
...-C4--C5--C7 <-- branchB
这改变了“提交图”,现在我们有了这个:
M
新的合并提交C6
有两个父级,提交C7
和branchA
。标签M
已更改为指向提交M
。
如果我们向后追查C7
,看看哪些提交是“在分支上”,我们就会 - 好吧,git会,所以我们也应该: - ) - 关注两个父母。提交C5
现在“在分支上”,提交C4
和C4
以及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
鲍勃同样可以为他提出新的提交 - 他们是M
和F
而不是M
和E
(但是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}})以限制所查看的提交次数。