2013-11-23 26 views
-1

我想查看我的主分支上的最後五個提交。我做的:如何查看主人提交?

git checkout master 
git log -p -5 

我看到那個承諾我敢肯定不在主。 因爲一個人的消息:

Merge branch 'feature/ABLE-1370' into develop 

任何明顯我做錯了嗎?

+1

嘗試使用可視化工具。例如gitg,gitk。否則,這種合併可能是正常的。在git中,分支頭是歷史中的指針,這樣提交可以同時存在於更多分支中。在你的情況下,如果相關提交的後繼者被合併爲主,那麼這可能是正常的。 –

回答

4

這些命令是在master分支上觀看git log正確。

由於'壞'或'怪異'的提交:如果您將其他合併到develop,然後合併到master,它仍然會保留該提交消息。

要確認,您可以運行git branch。您所在的分支將是旁邊有*的分支。

+0

Git簽出可能會失敗並顯示錯誤消息,例如如果它會覆蓋修改後的文件。 Git分支應該會顯示當前分支,而git log master允許您在不更改分支的情況下查看提交日誌。 – andi5

+0

這是真的;這樣做確實比較安全,而不是'git checkout'。我用'git branch'修改了它。 – Leigh

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,這是你與「爲一個新的東西」作出的一個,和名字branchB點提交C7,這是你與「對於B新東西」作出的一個。 (C3C4當你開始已經存在C6點回C3作爲其母公司,這是我們如何能夠遵循branchA向後的歷史;以及C7C5,這反過來又指向C4,等等。)

現在假設你回到branchAgit merge branchB。這使得「合併提交」 - 我們可以把它提交C8,但我們把它叫做M的合併:

$ git checkout branchA 
$ git merge branchB 

這改變了「提交圖」,現在我們有這樣的:

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

新的合併提交,M,有父母,提交C6C7。標籤branchA已更改爲指向承諾M

如果我們按照M向後,看看哪些是提交「的分支」,我們將井,git會,所以我們應該過: - ) - 跟隨雙方父母。提交C7現在「在分支上」,提交C5C4以及之前的任何歷史記錄都在C4之前。

然後,您可能會想知道在合併引入「一堆以前不相關的,但現在在婚姻中的家庭」提交之前,如何判斷哪個提交「最初」在分支上。

完全一般的答案是「你不能」。這是因爲標籤 - 分支名稱像branchB-不是永久性的。目前,很明顯,犯C7和它的歷史只是現在結婚了,但如果我們刪除branchB標籤:

$ git branch -d branchB 

那麼我們就只剩下這個畫面:

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

有時以下只有合併的「第一個父母」纔會給出「合理準確」的「主線」圖片,而git的--first-parent標誌只跟隨每個合併的第一個父代。


這種事情「自然產生」,當兩個不同的開發商克隆一些共享資源庫項目,都使(不同的)變化的一些分支,然後他們決定合併他們的更改。假設卡爾有四次提交回購:

A--B--C--D  <-- master 

愛麗絲使一個副本,並將提交E

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] 

這給了(我將離開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 

如果Alice和Bob現在取從卡爾的最新更新,他們已經有了自己的本地分支名稱(艾麗斯打電話Emaster尖端),他們沒有得到對方的名字(愛麗絲不「請參閱「鮑勃在這裏,只有卡爾」看到「鮑勃),所以愛麗絲添加承諾F沒有標籤,M與標籤origin/master(或者,如果她對名稱挑剔,她會重命名爲carl,以便這是carl/master)。然後,她可以將自己的master指向M

A--B--C--D-E-M <-- master, origin/master 
      \/
      F 

鮑勃同樣可以在新帶來的提交,對他來說,他們是EM代替FM(但M的「第一父」仍然是E):

A--B--C--D-E-M <-- origin/master 
      \/
      F  <-- master [before Bob does the merge] 

如果Bob選擇他master標籤向前滑動(如快進合併),他現在看到的圖片完全一樣愛麗絲..

因此,對於提交E和F,他們在哪個分支上?他們只是「主人」,他們甚至製造「在主人」,但卡爾並沒有使他們「在主人」,愛麗絲和鮑勃每個只做一個「在主人」。最後,git給你的唯一東西就是最終的提交圖。


要查看提交圖表,你可以使用gitk作爲意見提出,或:

git log --graph 

我覺得這是特別有用當--decorate --oneline給出。添加--all以查看所有分支,和/或-number-n number(如在-5-n 5中)以限制看到的提交數量。