2013-09-08 1 views
33

여기에도 비슷한 질문이 있지만 내 문제가 해결되지 않았다는 것을 알고 있습니다. 아마도 내가 잘 이해하지 못하는 것이있을 것입니다. I는 2 해시 커밋 사이 커밋 목록을 원하는리스트 2 커밋 해시를 git으로 커밋 함

* | | | | | | | | | | | | | | | fa86be8 Avoid possible issue when using CachingPage under heavy memory load. 
|/////////////// 
* | | | | | | | | | | | | | | 7b4a07a Merge pull request #256 from barredijkstra/fitnesse_issue_250 
|\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 
| * | | | | | | | | | | | | | | ecf5891 Fixed test checking for OS specific exception message. 
| * | | | | | | | | | | | | | | 082236e Added rendering of cause exceptions. Fix for unclebob/fitnesse#250 
* | | | | | | | | | | | | | | | a92b37f Merge pull request #243 from amolenaar/fix/243-hash-table-rendering 

:

이것은 fitnesse (https://github.com/unclebob/fitnesse/)의 커밋 이력의 일부이다. 이 특정한 경우에, 나는 ecf58917b4a07a 사이의 커밋을 원하고, 내가 기대했던 결과는 :

ecf5891 
7b4a07a 

시까지 내가 을 사용하고 있으며 선형 역사를 잘 일했다. 그러나,이 경우에는 커밋이 더 많이 발생합니다.

나는 이것을 시도하고 그것은 예상대로 작동합니다

git log --since='<date ecf5891>' --until='<date 7b4a07a>' 

는 (내가 직접 그 2 날짜 검색 한).

하나의 가능한 해결책은 2 개의 날짜를 가져 와서 그 작업을 수행하는 것이지만 더 나은 방법이 있어야한다고 생각합니다.

편집 : 부모는 ecf5891a92b37f입니다. 지금까지 솔루션은 내가 ecf5891에서 7b4a07a로 이동하려는 경우 잘 작동,하지만 난 a92b37f에서 7b4a07a에 가고 싶은 경우에 나는 싶어 :

7b4a07a 
ecf5891 
082236e 
a92b37f 

을하지만 난 a92b37f

답변

3

을하지 않습니다^7b4a07a ~를 추가하여 병합의 첫 번째 부모로부터 도달 할 수있는 모든 것을 제외하십시오. 두 번째 부모로부터 도달 할 수있는 것만 제외합니다.

+0

타입 오식, 앞에서'^'가 필요합니다 (또는'--not') – torek

+0

어디에서 그 부분을 추가해야합니까? 전체 라인은 어떻게 될까요? – Nico

+0

다른 사양에 추가하면됩니다. @torek : :-P yow. 감사. – jthill

20

"사이"는 git 커밋과 관련하여 다소 미끄러운 개념입니다. from^..to 그냥 두 커밋보다 더 생산하는 이유

당신이 그래프 출력의 조각으로, 위에서 보여 텍스트는 보여줍니다 다음 to 부분은 병합 커밋이다.

표기법 A..B 정말 B ^A 단지 속기이다. 즉, "B에서 시작하여 뒤로 이동하는 작업부터 모두 A부터 시작하여 뒤로 작업하는 모든 작업을 제외합니다. 그러나 B은 병합 커밋이므로 "그곳에서 시작하여 뒤로 작업"은 부모 모두을 사용합니다.

여기서 7b4a07a의 첫 번째 부모는 a92b37f입니다 (위의 [원본] 코드 조각에는 없지만 링크 된 복제본을 복제하여 발견했습니다). 우리는 그것을 상징적으로 언급 할 수 있습니다. 7b4a07a의 두 번째 상위 항목은 ecf5891이며 관심있는 '보낸 사람'부분입니다.당신이 물어 보면

는 :

ecf5891^..7b4a07a 

의미 :

7b4a07a ^082236e 
당신에게 병합의 부모를 가져

다음 :와 동일합니다

7b4a07a ^ecf5891^ 

082236e의 모든 것을 다듬습니다. 당신은 - 첫번째 부모 - 다시뿐만 아니라 7b4a07a^ 모든 것을 잘라내해야합니다 일반적으로

git rev-list 7b4a07a ^ecf5891^ ^7b4a07a^ 
git log --oneline 7b4a07a ^ecf5891^ ^7b4a07a^ 

하지만, 당신이 들어온다 오프를 할 수있는 하위 라인 (들)을 파악해야합니다.

편집 : 당신이 A..B 표기를 고수 할 수 있지만 추가는 "제외"추가 할 필요가 없습니다. 따라서 모자를 앞쪽으로 움직이면 jthill's answer도 작동합니다. 당신의 편집 다시


는 ("나는 a92b37f에서 7b4a07a로 이동하려는 경우") : 우리가 "사이"의 문제에있어 미끄러운 개념 인. 어떤 커밋이 "중간"입니까? a92b37f에서 7b4a07a까지의 직선이 있습니다. 왜냐하면 a92b37f은 병합 커밋 7b4a07a의 두 부모 중 하나이기 때문입니다. 그래서 이전의 논리 ("조상의 선에 직접적으로", 아마도 "포괄적"으로 쓰임)에 의해 그 두 커밋 중 하나 또는 둘 다가 될 것입니다. 그러나 당신은 어떤 조상의 의미로도, a92b37f과 관련이없는 두 가지 커밋을 원한다고 말합니다. 이 두 가지 커밋이 필요합니까? 무엇이 082236e을 "흥미롭게"만들고 082236e^, 그 부모를 "흥미롭지 않게"만드는 이유는 무엇입니까?

+0

좋아, 네가 "다시 돌아 왔어.하지만 그 말은 두 부모에게 적용된다"고했을 때 나는 이해한다. 그런 다음, 이전에했던 일을하고'^ a92b37f' 인'^ 7b4a07a^'을 실행하여 여분 부모 부분을 잘라냅니다. '7b4a07a ^'가'ecf5891'이 아닌'다른 부모 '가 될 것이라는 것을 어떻게 알 수 있습니까? 나는 이것을 스크립트에서하고 있기 때문에 수동으로 찾을 수는 없다. – Nico

+0

"예, 문질러가 있습니다"- 햄릿. 병합에서 어느 부모가 단절되는지를 알 수있는 선험적 방법이 없습니다. 더 많은 배경을 제공해야합니다. – torek

+0

지금 나는 커밋을 연대순으로 원한다. "사이"라는 개념은 A와 B를 시간순으로 그래프로 표시하고 A와 B를 포함한 커밋을 모두 찾는다. 나는 너무 svn- 방법을 생각하고있다. 지금까지 솔루션은 가장 쉽고 못생긴 것이 었습니다. A를 검색하고 B를 찾을 때까지 모든 커밋 해시를 검색하고 목록에 추가하십시오. 어쨌든 감사합니다. 몇 가지 사항을 정리하고 연대순으로 생각하면 만들었습니다. 내가 찾고 있어요. – Nico

1

먼저 관련이 당신이 그럼 당신은 관련 두 해시를 커밋 선택과 그들 사이에 해시를 커밋 찾을 수 있습니다

git log --oneline 

를 사용하여 그들 사이에 해시를 커밋의 목록을 얻기 위해 필요한 해시를 커밋 확인

git log <commit hash 1> <commit hash 2> --oneline | cut -d " " -f 1 
+0

이 답변을 테스트 했습니까? 그것의 [예상 된 결과를 생산하지] (http://stackoverflow.com/q/41688733). – jww

+1

다음과 같이하면됩니다 :'git log --online hashone ..hashtwo' –

11

를 사용하여 나는 다시`당신의 경우, --ancestry-path을 찾고 있다고 생각 :

git rev-list --ancestry-path 7b4a07a..ecf5891