2017-11-09 8 views
0

master 분기에 여러 버전의 코드를 유지해야하는 유스 케이스가 있습니다. 그러나 내가 이전 버전 (이전 커밋)에서 복제해야 할 경우가있을 수 있으며, 변경 한 다음 커밋 직후에 다시 밀어 넣어야합니다. 아래의 예를 참조 -이전 커밋에서 복제하고 최신 커밋 전에 병합

master 브랜치 - A-B-C-D-E-F

사용 예 - D에서 클론 (즉, D ')을 변경하고 D 후 밀어. 자식이 할 수있는 방법이 있나요 A-B-C-D-D'-E-F

- 또한, 어떤 복제 후 변경은 변경이 마스터 지점이 같아야 후 E와 F

에 반영되지해야합니까?

+0

나는 한 가지 방법은 E와 F를 먼저 리셋 한 다음 D '를 커밋하고 E와 F를 다시 커밋하는 것입니다. 나는 역사를 고치거나 다시 쓸 수있는 또 하나의 방법이 있다고 생각한다. https://git-scm.com/book/id/v2/Git-Tools-Rewriting-History –

+0

왜 E를 D '의 자식으로 만들어야 하는가? 역사를 분지로 남겨 둘 수 있습니다. – max630

답변

0

설명되지 않음, 아니오. 의 부모는 E 항상 D 커밋, 커밋 힘내에서

는 완전히 변하지-이고의 부모가 ED 확약 그래서 만약 커밋의 부모 해시는 커밋의 부분이다 .

부모가 D 인 새로운 커밋 D'을 만들 수 있습니다. 당신이 있음을 완료 한 후에는 은 "E하지만 더 좋아"의 그 E' 커밋 새에E을 복사 한 다음 새 F'F를 복사 할 수 있습니다 :

  D'-E'-'F' <-- master 
     /
A--B--C--D--E--F [abandoned] 

이 "다음 이동, 일부 커밋을 복사 지점 이름과 원래의 커밋을 "포기는 git rebase가하는 일입니다 :

$ git clone $url repo 
$ cd repo 
$ git checkout -b new-master master~2 # create new branch at commit D 
$ ... work to fix up D and make D' ... 
$ git add ...; git commit 

D 꼭대기 D'을 구축합니다. 다음 :

$ git checkout master 
$ git rebase new-master 

가 하나의 엄청난 단점입니다 : 모두 저장소를 복제 한 및 이전 masterF, 여전히을 기억 커밋 것을 기억들이 힘내 있습니다. 모두 저장소의 클론을 가진 사용자는 이전의 F이 아닌 반짝이는 새로운 F' 복사본으로 전환해야합니다.

+0

히스토리를 다시 쓸 수 없다. 커밋을 재정렬 할 수 없다. https://git-scm.com/book/id/v2/Git-Tools-Rewriting-History –

+0

@RamanSharma : 커밋을 복사 한 다음 커밋 할 수있다. 새로운 사본을 위해 원본을 포기하십시오. 이것은'git rebase'와 다른 역사 편집 작업이하는 일입니다. 원래의 커밋은 바꿀 수 없으며, 만약 다른 Git이 그것들을 가지고 있다면, 다른 Git은 Git 저장소로 어떤 특정한 행동을 취할 때까지 그 Git을 가지고있다. Git 책은 다른 사람들과 커밋을 공유하기 전에 * 다시 작성하는 것에 대해 이야기하지만, 다른 사람으로부터 커밋을받는다면 분명히 다른 사람은 이미 그 커밋을 가지고 있어야합니다. – torek

0

기본적으로 리모컨의 기록을 편집하고 싶으므로 몇 가지 방법이 있습니다. 나는 작업의 본질을 강조하기 위해 지형지 물에서 D '커밋을함으로써 나에게 자연스럽게 올 수있는 것을 설명 할 것이다. A-B-C-D

커밋 D '당신이 A-B-C-D-D를 얻을'당신이 지점이 모양을 갖추고에서이 시점에서 역사를 A-B-C-D-E-F

git checkout -b feature 
git rebase master~2 

:

은 전체의 repo를 복제 가정합니다. 이것은 D-D의 역사를 보존합니다. (D에서 E로 시작하는 대화식 리베이스를 똑같이 잘 수행 할 수 있는데, D는 D + D '로 대체됩니다.)이제 밀어 수있는 A-B-C-D-D'-E-F

: 같은

git cherry-pick E..F 

귀하의 역사는 이제 보인다. 그러나 푸시는 빨리 감기 병합 만 수행하므로 일반 푸시로 인해 오류가 발생합니다 (Git push rejected after feature branch rebase 참조). 따라서, 당신은해야 할 것입니다 :