2014-04-20 3 views
2

필자는 필자가 본 적이없는 1 년 전에 내 repo에 커밋 된 파일을 발견했다. repo 공개를 설정하기 전에이 파일을 소개 한 커밋을 되돌리려 고하거나 실제로이 파일에 액세스 할 수 없도록 제거하고 싶습니다.git 히스토리에서 커밋 제거하기

대화 형 rebase을 사용하여 원하지 않는 커밋을 삭제할 수있었습니다. 그것은 유망 해 보였지만 800에서 약 400 개의 커밋을 적용한 후에 충돌이 있습니다.

비선형 히스토리에 의해 충돌이 발생합니다. 브랜치가 있고 두 개의 브랜치에 하나의 파일이 수정되었습니다 (feature1과 feature2라고 말하면됩니다). 필자가 보았 듯이 git rebase은이 병렬 히스토리를 선형으로 만들려고했는데, 평행하고 충돌하는 수정에서는 실패했습니다. 나는 더 많은 상황이 있기 때문에 그것을 고치려고하지 않으며, 그것들을 모두 고치는 큰 노력이 될 것입니다.

내 질문은 : 단순히 다른 커밋에 영향을주지 않고 분기 기록을 재구성하여 커밋 하나를 제거 할 수 있습니까?

내 파일이 한 번 추가되었으며 수정되지 않았으므로 다른 커밋 중 하나도 만지지 않았습니다.

+2

관련 항목 : [Git 내역에서 중요한 파일 및 그 위탁 사항 제거] (http://stackoverflow.com/q/872565/456814), [Git 저장소의 커밋 기록에서 큰 파일 삭제/삭제 방법 ?] (http://stackoverflow.com/q/2100907/456814), [모든 Git 저장소 커밋 내역에서 파일을 완전히 제거] (http://stackoverflow.com/q/307828/456814), [git에서 파일 제거 저장소 (기록)] (http://stackoverflow.com/q/2164581/456814). –

+0

기본적으로'git rebase'는 병합 커밋을 보존하지 않습니다. 그러나, [병합 커밋을 유지하려고 시도하면 이라고 말할 수 있습니다.] (https://www.kernel.org/pub/software/scm/git/docs/git-rebase.html#_options) preserve-merges' 또는 '-p' 플래그를 사용하십시오. 이전에 만든 충돌 해결 방법을 다시 적용 할 지 모르겠습니다. –

답변

2

filter-branch 명령을 사용해보십시오.

git filter-branch --prune-empty --tree-filter 'rm <filename-to-delete> || true' HEAD 

잘못된 커밋이 제거 할 파일을 추가 한 경우 전체 커밋을 건너 뜁니다 (옵션 --prune-empty).

나는 브랜치와 머지가 포함 된 간단한 레포로 이것을 테스트했으며 머지는 영리하게 보존되었다. 그래서 당신은 갈등을 기대해서는 안됩니다. filter-branch도 백업 분기를 만듭니다. :-)