이전 git 커밋 제거


88

나는 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.

이것이 가능한가?

답변:


63

이것은 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

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


25
커밋을 짓 누르는 것이 아니라 삭제하는 것에 대한 질문이 아닙니까?
리처드

3
@Stony : 글쎄, 당신은 아마 그들을 삭제할 수도 있습니다. 그러나 OP의 커밋 주석 ( "Screw up"및 "Fixed screw up")에서 나는 하나가 다른 하나를 실행 취소하고 두 개를 스쿼시 할 수 있다고 가정했습니다.
Deve

85

진정으로 삭제하려면 (기록에서 삭제하고 더 이상 표시되지 않음)

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

2
나는 github를 처음 사용합니다. 그 후에 변경 사항을 어떻게 푸시합니까 (동기화를 클릭하면 내가 한 작업을 되돌립니다). 나는 그것을 거 같아요 : git push origin HEAD --force
니콜라스 Thery

@NicolasThery하지 않습니다. 이것이 바로 git push가 --force 없이는 작동하지 않는 이유입니다. 역사를 다시 작성하고 다른 사람들의 저장소를 깨뜨릴 것이기 때문입니다. 이미 푸시 한 경우 유일한 옵션은 git revert. 다른 사람의 코드를 뽑았다면 어떤 종류의 기록 없이는 이전 커밋을 지울 수 없도록하기를 원하기 때문에 합리적이라고 생각할 때 어느 것입니까?
Angry Dan

나는 이것이 현재 Git 리포지토리에서 단순히 작동하고 업스트림 / 다른 Git 노드를 변경하지 않는다고 가정합니다.
Alexander Mills

2
@AlexanderMills 푸시하지 않는 한 업스트림은 변경되지 않습니다 (그렇게하면 Angry Dan이 말한대로 --force 플래그를 추가해야합니다).
Shathur

d또는 drop기록에서 커밋을 제거하는 명령입니다.
버려진 카트

5

커밋을 완전히 삭제하려면 drop이제 git 인터랙티브 리베이스에 대한 새로운 옵션 이 있습니다. 첫 실행 :

git rebase -i HEAD~4

그리고 교체 pick와 함께 drop(가) 감소 할 (들) 커밋 :

pick 2f05aba ... #will be preserved
drop 3371cec ... #will be dropped
drop daed25c ... #will be dropped
pick e2b2a84 ... #will be preserved

이것은 다음 버전으로 나를 위해 Fedora에서 작동했습니다.

$ git version
git version 2.21.0

2

Squash는 단일 해시 아래에 병합 된 커밋 목록을 생성하려는 경우 유용하지만 세 개의 개별 커밋을 사용하고 단일 커밋처럼 보이는 최종 출력이있는 경우에는 권장합니다. fixup

git rebase -i HEAD~4

pick 2f05aba ... will be preserved
fixup 3371cec ... will be merged with daed25c
fixup daed25c ... will be merged with e2b2a84
pick e2b2a84 .. will include 3371cec and daed25c, but only the commit message of e2b2a84

대화 형 rebase UI의 명령 목록에서 자세한 정보를 찾을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.