2017-12-14 2 views
0

거대한 프로젝트에서 저는 git를 사용하고 있습니다. 3 개월 동안 거대한 기능을 수행하고있는 팀이 있습니다. 그 기간의 두 번째 달에 한 개발자는 아무런 변화없이 모든 파일이 준비되어있는 지형지 물 지점에서 어떻게 든 커밋을 생성 할 수있었습니다.커밋하지 않고 Git Branch 재 작성

이 기능 브랜치를 주 기능으로 병합하려고하면 큰 문제가 발생합니다.

1 개의 나쁜 커밋없이 모든 3 개월의 커밋을 다시 만들 수있는 방법이 있습니까?

+0

자식이 N ~ -i HEAD를 리베이스 : 이것은 모든 개발자가 지금 feature 분기를 가져오고 오히려 git pull을하는 것보다으로 재설정해야한다는 것을 의미합니다. 여기서 n은 삭제하려는 커밋 뒤에 하나의 커밋입니다. 커밋을 버리십시오. 주 브랜치에 병합하기 전에 나중에 을 리베이스하십시오. –

+0

feature 브랜치에서 * one commit이라는 문구는 전혀 변경되지 않은 모든 파일을 가지고 있습니다. * staged *는 Git에서 "인덱스에 있음"을 의미합니다. 커밋에는 색인이 없습니다. 커밋은 스냅 샷이며 각 스냅 샷에는 * 모든 * 파일이 있습니다. 일반적으로 스냅 샷과 상위 커밋의 스냅 샷을 비교하여 "변경된 사항"을 확인합니다. 아무것도 변경하지 않으면, 결과적인 커밋은 때때로 "empty"라고 불리지 만 비어있는 커밋은 무해하므로 걱정할 것이없고 실제적인 문제는 발생하지 않습니다. 따라서 문제가 *있는 경우,이 설명은 옳지 않습니다. – torek

답변

1

사용 git-revert :

git revert <errantcommithash> 

이 취소됩니다 잘못된에서 일어난 어떤 커밋 커밋 새로운 등의 변경 사항을 커밋합니다.

+0

새로운 커밋을 사용하여 "실행 취소"됩니다. 변경 사항을 유지하려는 다른 지점으로 병합하면이 작업이 번거로울 수 있습니다. – evolutionxbox

0

가장 안전한 방법은 <commit>이 커밋 문제의 SHA1 해시입니다

$ git revert <commit> 

을하는 것입니다.

커밋을 히스토리에서 완전히 제거하려면 git rebase을 사용할 수 있습니다. feature이 작업으로 분기 인 경우, 다음을 수행하십시오 이것은 현재까지 커밋에서 전체 역사를 다시 쓰는 것을

$ git checkout feature 
$ git rebase --onto <commit>~ <commit> 

참고.

$ git checkout feature 
$ git fetch origin feature 
$ git reset --hard origin/feature 
+0

왜 이것이 가장 안전한 방법입니까? – evolutionxbox

+0

@evolutionxbox'git revert'는 주어진 커밋의 변화를 뒤집는 새로운 커밋을 만듭니다. 모든 개발자는 지사를'git pull '할 수 있으며 즉시 최신 정보를 얻을 수 있습니다. 그러나'git rebase'는 브랜치의 히스토리를 다시 작성하고 각 개발자가 내 대답에서 마지막 세 단계를 수행하도록 요구합니다. 어떤 개발자가'git pull '을 대신 수행한다면 원래의 문제가있는 커밋은 히스토리에 남아있을뿐만 아니라 커밋의 원래 시퀀스와 리베이스 작업에 의해 생성 된 커밋의 새로운 시퀀스 모두로 모든 변경 사항의 복제본으로 남아있게됩니다. –