2014-01-10 2 views
3

내 Git 저장소의 로컬 항목 분기에 대한 일련의 변경 사항을 커밋했습니다. 각각의 커밋 (commit) 후 가능한 경우 기능을 확인하기 위해 일련의 연기 테스트를 실행합니다. 끌어 오기 요청을 제출하기 전에 나중에 더 많은 테스트를 실행하면 이전에 놓친 버그가 더 많이 발견됩니다. 버그 수정을 위해 새로운 커밋을 만들 수는 있지만 이미 로컬 토픽 브랜치이므로 이미 갖고있는 커밋을 수정하고 싶습니다. 내가 해왔 던 두 가지 방법이 있습니다 :Git을 사용하여 비 헤드 커밋을 어떻게 수정할 수 있습니까?

  1. 변경하고 테스트하십시오. 그 (것)들을 숨기고 그 후에 rebase-i 동안에 적합한 지점에 터십시오.
  2. 새 커밋을 만든 다음 rebase -i를 사용하여 재정렬하고 스쿼시를 겁니다.

마지막 커밋에서 버그 수정이 필요한 경우 --amend를 사용하여 문제를 해결할 수 있습니다. Git이 HEAD의 부모를 수정하는 지름길을 제공합니까, 아니면 현재의 방법을 고수하고 있습니까?

답변

2

다음과 같은 방법으로 TopGit을 사용하는 다른 방법이 있습니다. 주제 분기의 각 커밋이 대신 자체 분기가됩니다 (커밋이 이미 존재하는 경우 tg import을 사용할 수 있음). 커밋을 편집하려면 해당 브랜치로 전환하고 git commit it을 편집 한 다음 tg update -a을 실행하여 변경 사항을 종속 된 모든 패치로 리플 렉합니다. 마지막으로 tg export (적절한 명령 행 옵션 선택)을 실행하여 임시 TopGit 분기를 최종 수정본 시리즈로 변환하십시오.

+0

매우 멋지다. 그것은 내 문제를 확실히 해결할 것입니다. 감사! – dromodel

5

힘내주는 현재 머리가 아닌 다른 커밋을 수정하기위한 바로 가기를 제공하지 않습니다. 커밋의 모든 변경은 이전의 커밋과 호환되지 않는 완전히 새로운 커밋 개체를 효과적으로 생성하기 때문입니다. 즉, HEAD의 직접적인 부모를 변경할 때 HEAD도 변경해야합니다. 이것은 분명하지 않으며 파괴적인 행동입니다. 이전에 커밋 한 커밋을 편집하는 것은 매우 바람직하지 않습니다.

정말로 원하는 경우 대화 형 리베이스를 수행해야합니다. 영향은 매우 명확합니다. 모든 리베이스가 새로운 호환되지 않는 커밋 오브젝트를 작성합니다.

올바른 해결책은 오류가있는 경우에도 기록을 그대로 유지하고 이전에 소개 된 버그를 수정하는 새로운 커밋을 추가하는 것입니다. 힘내는 프로젝트의 역사를 존중해야한다. 나중에 버그를 확인하고 수정 한 것처럼 나중에 버그를 수정하는 커밋을 만들어야합니다. 역사의 일부로 완벽하지 않은 코드를 갖는 것은 잘못된 것이 아닙니다. 끊임없이 변화하는 커밋은 과거의 커밋과 함께 해결할 수있는 더 많은 문제를 소개 할뿐 아니라 "소스 제어의 정신"에 위배됩니다.

+0

저는 토픽 브랜치를 그대로 편집 할 수있는 스토리로 생각합니다. 변경 사항에서 가장 큰 변경 사항을 제거하여 코드 검토 작업을 줄이는 데 도움이됩니다. 하지만 일단 병합 된 재 작성 기록이 매력적이지 않다는 것에 동의합니다. – dromodel

2

당신은 local branch라고 말했고 나는 아직 아무 것도하지 않았다고 가정하고 대답하지 않을 것입니다. 그렇지 않으면 이것을하지 마십시오. (가) 편집 할 커밋 가정

이 편집기가 시작될 때 당신은 당신이 pick에서 edit 또는 e에 편집 할 커밋 변경,

git rebase abcdef~ 
# the ~ is needed, you need the parent of the commit you want to edit 

그런 다음 REBASE를 실행하겠습니다 'ABCDEF'이다, 저장 닫고 HEAD이 그 위치에서 멈추고 원하는대로 변경 한 다음 commit 또는 rebase --continue을 실행하면 rebase가 계속됩니다.

+0

잠깐,'abcdef ^'를 의미합니까? '~'는 항상 숫자를 취해야한다고 생각했습니다. 'abcdef ~ 1' –

+0

그게 제가 이미하고있는 것입니다 (# 2). 지름길이 있는지 알고 싶었습니다. 내 리포지토리는 매우 커서 제한 할 수 없지만 이러한 작업을 수행하는 데 걸리는 시간 (일반적으로 몇 분)을 피할 수 있습니다. – dromodel

+0

숫자가없는'~'는 하나의 부모를 의미합니다. 단지'^'와 같습니다. –

관련 문제