bitbucket에서 마지막 커밋 삭제


103

실수를했는데 리포지토리에서 최근 푸시를 삭제하는 방법을 모르겠습니다. 앱의 최신 업데이트를 가져 왔지만 충돌이 발생하여 저장소로 푸시합니다.

마지막 커밋을 삭제하는 방법? 아니면 그것을 고치는 방법?

답변:


102

같은 코드 저장소에서 다른 사람들과 함께 작업하는 경우 첫째로, 당신은 리포지토리에 업데이트를 강제 할 때이 경우는 (불법 상태 예를 동료의 로컬 저장소를 떠나 이후 커밋 삭제 삭제 한 후 커밋을 수행 한 경우 해당 커밋은 현재 존재하지 않는 커밋을 기반으로했기 때문에 유효하지 않습니다.

당신이 할 수있는 일은 커밋을 되 돌리는 것입니다. 이 절차는 사용중인 CVS에 따라 다르게 수행됩니다 (다른 명령).

자식 :

git revert <commit>

수은 :

hg backout <REV>

편집 : 되돌리기 작업은 되 돌린 커밋과 반대되는 새로운 커밋을 생성합니다 (예 : 원래 커밋에 라인이 추가 된 경우 되돌리기 커밋은 해당 라인을 삭제함).


정보 주셔서 감사합니다. 커밋을 삭제하면 결과를 알지만 처음으로 실수를했기 때문에 내 작업을 취소하는 방법을 모르겠습니다. 시스템이 이미 사용 중이므로 커밋을 취소해야합니다. 우리는 그 저장소로 작업하는 두 사람뿐입니다.
catherine 2013

git backout <REV>? 또는 : hg backout <REV>?
Armando Pérez Marqués 2013

그러나 되돌릴 커밋 이후에 추가 된 커밋이 삭제되는 줄을 수정했다면 어떻게 될까요?
rahs

@RahulSaha 당신이하고있는 일은 기본적으로 커밋을 브랜치에 병합하려고하기 때문에 해결해야 할 병합 충돌을 줄 것이라고 확신합니다.
asermax

98

다른 사람과 함께 작업 하지 않는 경우 (또는 큰 불편을 끼쳐서 기뻐하는 경우) , bitbucket 브랜치에서 커밋을 제거 할 수 있습니다.

비 마스터 브랜치를 변경하려는 경우 :

git reset HEAD^               # remove the last commit from the branch history
git push origin :branch_name  # delete the branch from bitbucket
git push origin branch_name   # push the branch back up again, without the last commit

마스터 브랜치를 변경하려는 경우

git에서 일반적으로 master 브랜치는 특별하지 않습니다. 단지 관례 일뿐입니다. 그러나 bitbucket 및 github 및 유사한 사이트에는 일반적으로 기본 브랜치가 있어야합니다 (저장소에 브랜치가 없다는 이벤트를 처리하기 위해 더 많은 코드를 작성하는 것보다 쉽기 때문에-확실하지 않음). 따라서 새 브랜치를 생성하고이를 기본 브랜치로 만들어야합니다.

# on master:
git checkout -b master_temp  
git reset HEAD^              # undo the bad commit on master_temp
git push origin master_temp  # push the new master to Bitbucket

Bitbucket에서 저장소 설정으로 이동하여 "Main branch"를 master_temp(Github에서 "Default branch"변경)로 변경합니다.

git push origin :master     # delete the original master branch from Bitbucket
git checkout master
git reset master_temp       # reset master to master_temp (removing the bad commit)
git push origin master      # re-upload master to bitbucket

이제 Bitbucket으로 이동하면 원하는 기록이 표시됩니다. 이제 설정 페이지로 이동하여 메인 분기를 master.

이 프로세스는 다른 기록 변경 (예 :)에도 적용 git filter-branch됩니다. 새 기록이 이전 기록과 분리되기 전에 적절한 커밋으로 재설정해야합니다.

편집 : 분명히 리셋 브랜치를 강제 푸시 할 수 있으므로 github 에서이 모든 번거 로움을 갈 필요가 없습니다 .

성가신 협력자 다루기

다음에 누군가가 저장소에서 가져 오려고하면 (이미 잘못된 커밋을 가져온 경우) 가져 오기가 실패합니다. 변경된 기록 이전의 커밋으로 수동으로 재설정 한 다음 다시 가져와야합니다.

git reset HEAD^
git pull

그들이 나쁜 커밋을 가져와 그 위에 커밋 했다면 , 재설정해야 할 것이고, 그리고 나서 git cherry-pick그들이 만들고자하는 좋은 커밋을 다시 만들어서 나쁜 커밋없이 전체 브랜치를 효과적으로 다시 생성해야합니다.

그들이 나쁜 커밋을 가져 오지 않았다면,이 전체 프로세스는 그들에게 영향을주지 않을 것이고, 그들은 정상적으로 풀 수 있습니다.


1
SourceTree 사용에 더 익숙한 사용자를 위해 : 1) BitBucket 용 웹 UI에서 메인 브랜치를 변경하려면 Repo 설정을 참조하십시오. 2) 웹 UI에서 분기를 삭제하려면 분기 페이지를보십시오. 3) 위와 같이 로컬 리포지토리를 재설정하십시오. 4) 로컬 변경 사항을 푸시하여 해당 분기를 다시 만듭니다.
Richard Le Mesurier 2015 년

2
우연히 비밀을 밀었던 사람으로서이 답변의 철저함에 감사드립니다. 감사!
토크

48

재설정 HEAD^한 다음 강제로 밀어 넣을 수 있습니다.

git reset HEAD^
git push -u origin master --force

마지막 커밋을 삭제하고 커밋이 삭제되면 bitbucket에 반영되지만 서버에는 계속 남아 있습니다.


Github에서이를 허용하지만이 글을 쓰는 시점에서 Bitbucket은 강제 푸시를 허용하지 않습니다.
JamesQMurphy

4
실제로 bitbucket은 추적되지 않은 커밋을 완전히 제거하는 대신 diff 만 강제 푸시를 지원합니다.
Shubanker 2015 년

bitbucket에서 권장하는 방법은 되돌리기를 사용하는 것입니다. 하지만 제 경우에는 이것이 더 적절하다고 생각합니다. 나는 그것을 사용하는 유일한 사람이기 때문에 되돌리기를 사용하는 것보다 더 깨끗합니다. 감사.
nafsaka

1
예, 이것은 Bitbucket에서 여전히 작동합니다. 당신은 저에게 큰 시간을 절약했습니다! 내 Eclipse에서 커밋 / 푸시를 수행하고 내가 가진 다른 프로젝트와 섞여 있습니다. 부분적으로는 git 작업을 위해 명령 줄과 내장 이클립스를 모두 사용하여 내 부분의 나쁜 관행 때문입니다.
DarkCygnus

brilliant, or easy : 현재 분기를이 커밋으로 재설정 한 다음 서버에 강제 푸시를 사용하여 내 문제를 해결합니다
Anthony Kal

3

나는 과거에 git revert에 문제가있었습니다.

내 간단한 해결책은 이것입니다.

1 단계.

 git clone <your repos URL> .

프로젝트를 다른 폴더에 저장 한 다음 :

2 단계.

git reset --hard <the commit you wanna go to>

그런 다음 3 단계.

최신 (및 기본) 프로젝트 디렉토리 (마지막 커밋에 문제가있는 파일)에 2 단계의 파일을 붙여 넣습니다.

4 단계.

git commit -m "Fixing the previous messy commit" 

5 단계.

즐겨


1
자르고 붙이기는 정말 지저분합니다. 또한 이것은 질문의 문제를 해결하지 못할 것입니다.
다니엘 리

1
git revert간단합니다. 이전 커밋 (또는 여러 커밋)의 변경 사항을 반대로 수행하는 새 커밋을 만듭니다. 커밋을 삭제하지 않으므로이 질문과 관련이 없습니다. 또한 여기에서 복제 단계는 실제로 필요하지 않습니다.
naught101

1
Git 되돌리기는 위와 같은 메커니즘입니다.
nafsaka

3

다음은 최대 4 단계의 간단한 접근 방식입니다.

0-리포지토리를 수정할 팀에 알립니다.

팀과 연결하여 향후 변경 사항을 알립니다.

1-마지막 커밋 제거

대상 분기가 master다음과 같다고 가정합니다 .

$ git checkout master              # move to the target branch
$ git reset --hard HEAD^           # remove the last commit
$ git push -f                      # push to fix the remote

이 시점에서 혼자 일하는 경우 완료됩니다.

2-팀원의 로컬 저장소 수정

팀원의 :

$ git checkout master              # move to the target branch
$ git fetch                        # update the local references but do not merge  
$ git reset --hard origin/master   # match the newly fetched remote state

팀원에게 새로운 커밋이 없다면이 시점에서 완료되었으며 동기화 상태 여야합니다.

3-잃어버린 커밋 가져 오기

팀원이이 프로세스에서 손실 된 새롭고 게시되지 않은 커밋을 가지고 있다고 가정 해 보겠습니다.

$ git reflog                       # find the new commit hash
$ git cherry-pick <commit_hash>

필요한만큼 커밋에 대해이 작업을 수행합니다.

이 방법을 여러 번 성공적으로 사용했습니다. 모든 것이 동기화되도록하려면 팀의 노력이 필요합니다.


2

다른 사람들이 말했듯이 일반적으로 hg backout또는 git revert. 그러나 때로는 커밋을 제거하고 싶을 때가 있습니다.

먼저, 저장소 설정으로 이동해야합니다. Strip commits링크를 클릭하십시오 .

bitbucket 설정에서 커밋 링크 제거

삭제할 변경 세트의 변경 세트 ID를 입력하고을 누릅니다 Preview strip. 이를 통해 수행하기 전에 어떤 종류의 손상을 입히고 있는지 확인할 수 있습니다. 그런 다음 클릭하면 Confirm커밋이 더 이상 기록이 아닙니다. 모든 공동 작업자에게 자신이 한 일을 말하여 실수로 문제가되는 커밋을 되 돌리지 않도록하십시오.


어떤 버전이며 어떤 권한이 필요합니까? 제가보고있는 v6.4.3에서는 다르게 보이지만이 항목은 없습니다. 나는 오전 저장소 관리자를.
Raphael

1

변경 사항이 커밋되면 삭제할 수 없습니다. 커밋의 기본 특성은 삭제가 아니기 때문입니다.

할 수있는 일 (쉽고 안전한 방법),

인터랙티브 리베이스 :

1) git rebase -i HEAD~2 # 최근 2 개의 커밋을 표시합니다.

2) 커밋은 다음과 같이 나열됩니다. 최근 항목은 페이지 하단에 표시됩니다. LILO (last in Last Out)

여기에 이미지 설명 입력

마지막 커밋 행을 완전히 삭제

3) ctrl+X또는로 저장ESC:wq

이제 분기가 마지막 커밋없이 업데이트됩니다.


1

Dustin이 언급 한 Bitbucket에 대한 명령도 작성할 수 있습니다 .

git push -f origin HEAD^:master

참고 : 마스터 대신 모든 분기를 사용할 수 있습니다. 그리고 Bitbucket에서 푸시 만 삭제합니다.

git에서 마지막 커밋을 로컬 에서 제거하려면 다음을 사용하십시오.

git reset --hard HEAD~1

0

지금까지 클라우드 bitbucket (어떤 버전인지 모르겠 음)은 다음과 같이 파일 시스템에서 커밋을 되돌릴 수 있습니다 (Chrome 브라우저의 Bitbucket 인터페이스에서 되 돌리는 방법을 볼 수 없음).

-실수로 커밋 한 변경 사항을 보호하기 위해 전체 디렉토리 백업

-체크 아웃 된 디렉토리 선택

-마우스 오른쪽 버튼 : 거북이 자식 메뉴

-repo-browser ( 'revert'메뉴 옵션은 커밋되지 않은 변경 사항 만 취소합니다)

-HEAD 버튼을 누릅니다.

-맨 위 줄 선택 (마지막 커밋)

-마우스 오른쪽 버튼 :이 커밋에 의한 변경 되돌리기

-파일 시스템에서 변경 사항을 취소 한 후 commit을 누릅니다.

-이것은 '되돌리기 (이전 메시지)'메시지로 GIT를 업데이트합니다. 이것은 커밋을 되돌립니다.

- '커밋 및 푸시'를 선택하십시오.

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