2012-03-15 3 views
46

나는 매우 힘내, 새로운 일이 가능한지 궁금 해서요?오래된 git 커밋을 제거하십시오

>git log --pretty=oneline --abbrev-commit 
2f05aba Added new feature 
3371cec Fixed screw up <-- I want to remove this 
daed25c Screw up   <-- and remove this. 
e2b2a84 First.    So it's like they never happend. 

이것이 가능합니까?

답변

42

git rebase으로 가능합니다. 다음을 시도하십시오.

git rebase -i HEAD~4 

다음 편집자의 대화식 지침을 따르십시오. 첫 번째 단계에서는 커밋을 "스쿼시"합니다. 다음과 같이 표시되어야합니다.

pick 2f05aba ... will be preserved 
squash 3371cec ... will be squashed with daed25c 
squash daed25c ... will be squashed with e2b2a84 
pick e2b2a84 .. will contain this and 3371cec and daed25c 

두 번째 단계에서 커밋 메시지를 편집 할 수 있습니다.

+10

커밋을 지우지 않고 삭제하는 것에 대한 질문이 아닙니까? – Richard

+1

@Stony : 아마도 삭제할 수도 있습니다. 그러나 OP ("Screw up"과 "Fixed screw up")에 대한 커밋 코멘트에서 나는 다른 하나를 취소하고 그 둘을 스쿼시 할 수 있다고 생각했습니다. – Deve

54

당신이 진정을 (더 이상 볼 수 없습니다 결코 역사에서 닦아) 삭제하려면 할 수 있습니다

실행 REBASE :

git rebase -i HEAD~4 

후 바로 삭제 (또는 주석) 다음과 같이 삭제하려는 커밋에 해당하는 줄을 지정하십시오.

pick 2f05aba ... #will be preserved 
#pick 3371cec ... #will be deleted 
#pick daed25c ... #will be deleted 
pick e2b2a84 ... #will be preserved 
+0

저는 github에 익숙하지 않습니다. 그 후에 변경 사항을 어떻게 푸시합니까 (내가 동기화를 클릭하면, 내가 한 일을 되돌릴 수 있습니다). 나는 그것을 얻었다 고 생각한다 :'git push origin HEAD --force' –

+0

@NicolasThery 그렇지 않습니다. 이것이 git push가 --force없이 작업하는 것을 거부하는 이유입니다. 왜냐하면 여러분은 역사를 다시 쓰고 다른 사람들의 저장소를 깨뜨릴 것이기 때문입니다. 이미 푸시했다면 유일한 옵션은'자식 되돌리기 '입니다. 어떤 사람이 다른 사람의 코드를 뽑아 내면 일종의 역사가 없으면 과거의 커밋을 지울 수 없기를 바랄 것입니다. –

+0

나는 이것이 현재 Git repo에서 간단하게 작동한다고 가정하고 업스트림/다른 Git 노드를 변경하지 않는다고 가정합니까? –

관련 문제