2013-11-23 7 views
-1

내 마스터 브랜치에서 마지막 5 개의 커밋을보고 싶습니다. 나는해야한다 :마스터에서 커밋을 보는 방법은 무엇입니까?

git checkout master 
git log -p -5 

나는 커밋을 본다. 나는 확실히 마스터가 아니다. 하나의 메시지가 있기 때문에 : 내가 잘못하고있는 중이 분명

Merge branch 'feature/ABLE-1370' into develop 

아무것도?

+1

시각적 도구를 사용해보십시오. gitg, gitk 예를 들면. 그렇지 않으면이 병합이 정상적 일 수 있습니다. git에서 브랜치 헤드는 히스토리에서 포인터가되며, 이런 식으로 커밋은 더 많은 브랜치에 동시에 존재할 수 있습니다. 귀하의 경우 관련 커밋의 후임자가 마스터가 될 때까지 병합 된 경우 정상적인 수 있습니다. –

답변

4

이러한 명령은 마스터 분기의 git log을 보는 데 적합합니다.

'bad'또는 'weird'커밋 : develop에 다른 항목을 병합 한 다음 master에 병합 한 경우 커밋 메시지가 계속 유지됩니다.

확인하려면 git branch을 실행할 수 있습니다. 현재있는 지점은 옆에 *이있는 지점이됩니다.

+0

오류 메시지와 함께 오류 체크 아웃이 실패 할 수 있습니다 (예 : 수정 된 파일을 덮어 쓰는 경우. 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" 

하지만 다른 가지를 병합 시작하면 어떻게됩니까? 각 Cn는 커밋 대표

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

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

: 하나는 branchA 이상 branchB의 각 커밋 변경 한 후에는 다음과 같이있을 수 있습니다. branchAC6을 가리키며, "A for new things"로 작성한 것이고 branchB은 "B를위한 새로운 물건"으로 만든 C7을 커밋 할 것을 가리 킵니다. (. C3C4은 이미 시작했을 때 우리는 뒤로 branchA의 역사를 따를 수 어떻게 부모와 같은 C3C6 점 다시 존재하고, 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를 수행하면

, 우리는 잘 것, 자식, 그래서 우리가 너무해야 할 것 "지점에"있는 커밋 볼 수 있습니다.커밋 C7은 이제 "지점"에 있고 커밋은 C5C4이고 이전의 모든 내역은 C4입니다.

예를 들어, "이전에 관계가 없지만 지금은 결혼에 의해 가족에게"무리가 들어 오기 전에 지사에서 "원래"커밋을 알 수있는 방법을 궁금해 할 수 있습니다.

완전히 일반적인 대답은 "할 수 없다"입니다. 이는 branchB과 같은 지사 이름의 레이블이 영구적이지 않기 때문입니다. 지금이 순간, 그것은 C7을 커밋의 역사는 지금에 결혼했다,하지만 분명 우리는 branchB 라벨 삭제하는 경우 : 우리는이 그림으로 남아 있습니다

$ git branch -d branchB 

: 때때로

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

을 병합의 "첫 번째 부모"다음에 "본선"에 대해 "합리적으로 정확한"그림을 제공하고 자식은 각 병합의 첫 번째 부모만을 따르는 --first-parent 플래그를 갖습니다. 두 개의 서로 다른 개발자가 일부 공유 저장소에서 프로젝트를 복제, 모두가 어떤 지점에 (다른) 변경 한 다음 그들의 변경 내용을 병합하기로 결정 때


것은 이런 종류의 "자연적으로".

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

앨리스 복사본을 만들고 E 커밋 추가 : 칼이 네 개의 커밋과 REPO을 가지고 가정

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

밥은 칼의 원래의 사본을 만들고 커밋 추가 F :

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

Alice와 Bob은 Carl에게 멋진 기능이나 버그 수정에 대해 알려주고 Carl은 둘 다 원한다고 결정합니다. 그는 그들을 가지고 (git remote add 등과 함께) git fetch를 사용할 수 있습니다

  E  <-- remotes/alice/master 
     /
A--B--C--D  <-- master 
      \ 
      F  <-- remotes/bob/master 

지금 칼 쉬운 두 단계의 과정을 자신의 (칼의)의 repo에이 두 가지를 통합 할 수 있습니다.한 단계 A는 빨리 감기 뭔가를 데리러 병합 할 (의 앨리스의 변화를 가정 해 봅시다) :

이 제공
$ 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 

앨리스와 밥이 현재 Carl에서 최신 업데이트를 가져 오는 경우 이미 앨리스가 E 팁을 master이라고 부르며 자신의 로컬 브랜치 이름을 가지고 있으며 서로의 이름을 알 수 없습니다 (앨리스는 " "Bob 여기, 칼만"볼 "), 앨리스는 레이블이없고 레이블이 붙은 코드 F을 추가합니다 (이름이 까다 롭다면 리모컨의 이름을 carl으로 변경하여 이름을 바꿀 것입니다). carl/master). 그녀는 다음 M를 가리 키도록 자신의 master을 이동할 수 있습니다

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

밥도 마찬가지로 새로운에서 가져올 수 커밋-그를, 그들은 E하고 M 대신 FM은 (그러나 M의 "최초의 부모는"아직 E) : 밥) 빨리 감기 병합으로 (앞으로 그의 master 라벨을 슬라이드 선택하면

, 그는 지금 정확히 앨리스 같은 사진을 ..보고
A--B--C--D-E-M <-- origin/master 
      \/
      F  <-- master [before Bob does the merge] 

그래서 E 및 F 커밋의 경우 어떤 분기가 있습니까? 그들은 단지 "마스터"에 있으며, 은 "마스터에서"으로 만들었지 만 Carl은 "마스터"로 만들지 않았으며 Alice와 Bob은 각각 "마스터"로 만들었습니다. 결국 git이 제공하는 유일한 것은 최종 커밋 그래프입니다.


는 의견 제안 당신이 gitk를 사용할 수 커밋 그래프를 보거나하려면 --decorate --oneline로 주어 졌을 때
git log --graph 

내가이 특히 유용 찾을 수 있습니다. 모든 분기를 보려면 --all을 추가하고 표시되는 커밋 수를 제한하려면 -number 또는 -n number (예 : -5 또는 -n 5)을 추가하십시오.

관련 문제