2014-01-28 2 views
4

다음과 같은 내 기록이 있습니다.Git에서 푸시 된 커밋을 제거하십시오.

  • (원/주)
  • "2 커밋"
  • "1 커밋"(뒤에 마스터 2)
  • 이 ... 이전이

내가 원하는 커밋 "3 커밋" 기록에서 커밋 2와 3을 제거합니다. 그래서 커밋 1은 최신입니다. 나는이 저장소를 사용하는 유일한 사람입니다.

git rebase -i 

그럼 내가 명령을 입력 할 수 없습니다 화려한 화면을 얻을 : 나는 SourceTree를 사용하여 터미널에서 오전

나는 다음과 같은 들어갔다. 내가 무엇을 할 수 있을지?

편집 :

푸시 오류

ssh: connect to host <myhost> port 22: Bad file number 
fatal: Could not read from remote repository. 

Please make sure you have the correct access rights 
and the repository exists. 
+1

당신은'vim'에 던져 졌을 가능성이 가장 큽니다 -'git config --global core.editor EDITOR_OF_CHOICE' – Eric

+0

로컬 리포 또는 로컬과 리모트에서 커밋을 제거하고 싶습니까? – R0MANARMY

+0

로컬 및 리모컨 – Nfear

답변

2

당신이 커밋을 취소하지만, 당신이 파일에서 만든 수정을 유지하려면 :

git reset --soft HEAD^2 

당신은 모두를 취소하려면 로컬 파일의 수정 내용을 커밋하고 취소합니다.

git reset --hard HEAD^2 

Head^X은 현재 분기에서 마지막 커밋 이전의 X 번째 커밋을 의미합니다.

+0

모호한 인수 'HEAD^2'을 (를) 얻을 수 없습니다 : 알 수없는 개정 또는 경로 " – Nfear

+0

색인이 분기에서 분리 되었습니까? 또 다른 옵션은 HEAD^2를 돌아가고 자하는 커밋의 식별자로 대체하는 것입니다. – kgautron

+0

현재 분기를 설정하는 방법을 알고 있습니다. 문제는 최신 두 커밋을 가져올 수 있다는 것입니다. 나는 그들을 완전히 제거하고 싶다. – Nfear

0

당신은 그 두 커밋에 복귀 할 수 : 2, 3 :

git revert "commit 3" 
git revert "commit 2" 

또는 자식 리셋 :

git reset --hard "commit 1" 
+0

두 명령의 차이점은 무엇입니까? – DougM

+0

'git revert'는 commit2와 commit3의 영향을 되돌리기 위해 새로운 커밋을 생성합니다. 그러나 원래 commit2 & commit3은 물론 여전히 존재합니다. 'git reset --hard commit1'은 HEAD 브랜치에 대한 포인터를 commit1로 다시 옮기므로 거기서 작업 할 수 있습니다. commit2 & commit3조차하지 않은 것처럼 가장 할 수 있습니다. –

0

당신이 정확한 상태와 현재 HEAD의 상부에 커밋하려면 다른 커밋에서 모든 중간 커밋을 실행 취소 한 다음 리셋을 사용하여 커밋 할 인덱스의 올바른 상태를 만들 수 있습니다.

# reset the index to the desired tree 
git reset 56e05fced 

# move the branch pointer back to the previous HEAD 
git reset --soft [email protected]{1} 

git commit -m "Revert to 56e05fced" 

# Update working copy to reflect the new commit 
git reset --hard 
1

이 모든 답은 로컬 저장소에서 commit2 & commit3을 제거하는 것이 아니라 원격 저장소를 해결하지 않는 방법을 보여 것 같다.

먼저 로컬 기록에 영향을주는 대화 형 리베이스를 종료하십시오. 현재있는 텍스트 편집기를 종료하거나 git rebase --abort을 실행해야 할 수도 있습니다. 나는 당신의 정확한 상태를 확신하지 못합니다.

일단 정상 커맨드 라인으로 돌아 오면, 이미 원하는 커밋 1에 있기 때문에 체크 아웃 마스터.

git checkout master

그런 다음 마스터로 업데이트 원산지/마스터를 강제로.

경고로 git push -f

다른 독자들에게, 다른 개발자와 공유 저장소에 강제로 밀어하지 않을! 원래 포스터는 원격 포털을 사용하는 유일한 포스터이기 때문에이 기능이 작동합니다.

+0

이것이 해결책 인 것 같지만 push 명령을 입력하면 "잘못된 파일 번호", "원격 저장소에서 읽을 수 없습니다"라고 표시됩니다. 그러나 사용자 인터페이스를 통해 푸시 할 수 있습니다. – Nfear

+0

오류의 전문을 입력 할 수 있습니까? 그리고 사용자 인터페이스 (SourceTree, 나는 가정)에서 강제로 밀어 넣기가 작동 했습니까? –

+0

UI를 통해 작동하지만 터미널에는 작동하지 않습니다. OP에 오류가 추가됩니다. – Nfear

관련 문제