'git push'실행 취소


591

안정적인 지점 에서 내가 한 일은 다음과 같습니다 .

% git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded alpha-0.3.0 to master.
% git status
# On branch alpha-0.3.0
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits.
#
nothing to commit (working directory clean)
% git push
Fetching remote heads...
  refs/
  refs/heads/
  refs/tags/
  refs/remotes/
'refs/heads/master': up-to-date
updating 'refs/heads/alpha-0.3.0'
  from cc4b63bebb6e6dd04407f8788938244b78c50285
  to   83c9191dea88d146400853af5eb7555f252001b0
    done
'refs/heads/unstable': up-to-date
Updating remote server info

나중에 깨달았을 때 그것은 모두 실수였습니다. 이 전체 프로세스를 취소하고 alpha-0.3.0 분기를 원래 상태로 되돌리고 싶습니다.

어떻게해야합니까?


이 스택 오버 플로우 게시물? stackoverflow.com/questions/134882/undoing-a-git-rebase
Steen

4
실제로 동일한 상황은 아니며, 리베이스 실행 취소는 로컬 리포지토리 시나리오이며, git push 실행 취소는 원격 리포지토리와 관련이 있으며 액세스에 따라 더 까다로울 수 있습니다.
CB Bailey

Steen-네 말이 맞아-아마 내가 생각 했어야 했어. 나는 모든 풀링 된 축복받은 저장소가 더 많은 관리 작업이므로 여기에 속한다고 일반 클라이언트 측 자식은 스택 오버 플로우 질문입니다.
Cyrus

빠른 설명- 부분 해시 값 으로 git commit을 참조하면 git 이 해시가 해당 문자열로 시작하는 commit에 대해 이야기한다고 가정합니다.
Gershom 2016

답변:


943

이 저장소의 다른 사용자가 히스토리를 되감 으려고하기 때문에 잘못된 변경 사항을 가져 오거나 제거하려는 커미트 위에 빌드하려고 시도하지 않아야합니다.

그런 다음 이전 참조를 '강제로'밀어야합니다.

git push -f origin last_known_good_commit:branch_name

또는 귀하의 경우

git push -f origin cc4b63bebb6:alpha-0.3.0

receive.denyNonFastForwards원격 저장소에서 설정 했을 수 있습니다 . 이 경우 문구가 포함 된 오류가 발생합니다 [remote rejected].

이 시나리오에서는 브랜치를 삭제하고 다시 작성해야합니다.

git push origin :alpha-0.3.0
git push origin cc4b63bebb6:refs/heads/alpha-0.3.0

이것이 작동하지 않으면-아마도 receive.denyDeletes설정 했기 때문에 저장소에 직접 액세스해야합니다. 원격 리포지토리에서 다음 배관 명령과 같은 작업을 수행해야합니다.

git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8

16
완벽하고 잘 설명 된 답변-대단히 감사합니다. 학문적 이유로 인해 처음부터 두 가지 방법을 모두 시도했지만 두 가지 방법 모두 효과적이었습니다. 첫 번째 방법이 효과가 있다면 가장 깨끗한 방법입니다. 찰스를 10 배나 높이면 :)
사이러스

139
빠른 참조를 위해 여기에서 첫 번째 줄은git push -f origin last_known_good_commit:branch_name
philfreo

5
git push -f origin cc4b63bebb6 : alpha-0.3.0 => 이것이 도움이되었습니다. 참고 alpha-0.3.0은 브랜치 이름이고 cc4b63bebb6은 되돌릴 커밋 ID입니다. 따라서이 명령을 수행 한 후 cc4b63bebb6 commit id에있게됩니다.
kumar

22
이 솔루션은 공유 리포지토리에서 작업하는 경우 매우 위험합니다. 모범 사례로서 공유 된 원격 저장소로 푸시 된 모든 커밋은 '불변'으로 간주해야합니다. 대신 'git revert'를 사용하십시오 : kernel.org/pub/software/scm/git/docs/…
Saboosh

1
jww-다른 모든 것에 비해 git은 가장 기능이 풍부하고 효율적인 소스 제어 도구입니다. 모든 팀은 다르게 사용합니다. 주말에는 새로운 저장소를 가지고 놀고 모든 일반적인 시나리오를 거치는 것이 좋습니다. 작업에 시간을 투자하면 개발 스트레스가 훨씬 줄어 듭니다.
user1491819

165

나는 당신도 이것을 할 수 있다고 믿습니다.

git checkout alpha-0.3.0
git reset --hard cc4b63bebb6
git push origin +alpha-0.3.0

이것은 원격 저장소에서 뭉칠 필요가 없다는 점을 제외하고는 마지막 방법과 매우 유사합니다.


9
이것은 나에게도 효과가 있었지만 이것이 원격에서 역사를 "다시 쓸 것"이라는 점은 주목할 가치가있다. 이것은 당신이 원하는 것일 수도 있지만 그렇지 않을 수도 있습니다!
Tom

3
정말 도움이되는이 답변에 +1. 또한 커밋 ID ( " --hard"매개 변수 뒤에 나오는 )가 브랜치를 재설정하려는 커밋의 ID 여야한다는 점 을 추가하고 명확하게하고 싶었 습니다.
Michael Dautermann

1
역사를 멋지게 다시 작성했습니다 ... 변경 사항을 가져올 수있는 사람이라면, git reset --hard [commit_id]우리는 시공간 연속체를 망칠 수 없도록 그렇게했습니다.
외국인 생활 양식

9
"git push origin + alpha-0.3.0"에서 +는 무엇입니까?
jpierson

1
@jpierson +은 푸시를 강제로 수행 -f하지만 (과 약간 다릅니다 : stackoverflow.com/a/25937833/1757149 ). 그것이 없으면 git push origin alpha-0.3.0푸시 를 시도 하면 실패 Updates were rejected because the tip of your current branch is behind합니다..
A__

106

git revert 여기에 제안 된 접근법 중 일부보다 덜 위험합니다.

prompt> git revert 35f6af6f77f116ef922e3d75bc80a4a466f92650
[master 71738a9] Revert "Issue #482 - Fixed bug."
 4 files changed, 30 insertions(+), 42 deletions(-)
prompt> git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
prompt>

35f6af6f77f116ef922e3d75bc80a4a466f92650을 자신의 커밋으로 바꾸십시오.


2
35f6af6f77f116ef922e3d75bc80a4a466f92650 ID를 어떻게 알 수 있습니까? 설명 할 수 있다면이 대답이 더 나을 것입니다.
Volomike

2
@Volomike (그리고 미래의 인터넷 검색 개발자),이 질문은 그것을 얻는 많은 방법을 설명합니다 : SO에 대한 버전 제어 및 해시 질문
Jaime

"git reset"을 사용하면 푸시 할 수 없어야합니다 (현재 브랜치의 팁이 원격 상대방 뒤에 있기 때문에 업데이트가 거부되었습니다). 그렇지 않으면 풀을 강제로 제거해야합니다.
Thomas Decaux

이것은 나를 위해 일하고있었습니다. 그러나 되돌리기는 로컬 파일의 모든 변경 사항을 되돌 리므로주의하십시오.
user1941537

나는이 방법을 여러 번을 선택했다하지만 난 자식 REBASE -i <ID-커밋 마지막으로 좋은-전>, 여기에 제안 대화 형 REBASE 및 정리 기록을 수행하는 사용 stackoverflow.com/questions/5189560/...을 .
Ernesto Allely 2016 년

35

공유 리포지토리에서 작업하는 경우 허용되는 솔루션 (@charles bailey)이 매우 위험합니다.

모범 사례로서 공유 된 원격 저장소로 푸시 된 모든 커밋은 '불변'으로 간주해야합니다. 대신 'git revert'를 사용하십시오 : http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes

https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things


처방하는 지침은 정확히 무엇입니까? 오래된 링크 만있는 것 같습니다.
jww

32

원하는 변경 사항을 잃지 않고 수행하는 방법 :

git reset cc4b63b 
git stash
git push -f origin alpha-0.3.0
git stash pop

그런 다음 푸시하려는 파일을 선택할 수 있습니다


19

이를 수행하는 다른 방법 :

  1. 다른 지점을 만들다
  2. "git checkout"을 사용하여 해당 브랜치에서 이전 커밋을 체크 아웃하십시오.
  3. 새 지점을 밀어 넣습니다.
  4. 이전 분기를 삭제하고 삭제를 누릅니다 (사용 git push origin --delete <branch_name> )
  5. 새 지점의 이름을 이전 지점으로 바꿉니다.
  6. 다시 밀어

2
당신의 repo에 이미 잘못된 커밋이 진정한 솔루션 등이 하나의 모습
Illarion 코발 추크


11

여러 커밋 실행 취소 git reset --hard 0ad5a7a6 (커밋 SHA1 해시 만 제공)

마지막 커밋 실행 취소

git reset --hard HEAD ~ 1 (마지막 커밋으로의 변경은 제거됩니다) git reset --soft HEAD ~ 1 (마지막 커밋으로의 변경은 커밋되지 않은 로컬 수정으로 사용 가능)


9

시나리오 1 : 마지막 커밋을 취소하려면 8123b7e04b3이라고 말하십시오. 아래 명령은 다음과 같습니다.

git push origin +8123b7e04b3^:<branch_name>

출력은 다음과 같습니다.

Total 0 (delta 0), reused 0 (delta 0)
To https://testlocation/code.git
 + 8123b7e...92bc500 8123b7e04b3^ -> master (forced update)

추가 정보 : 시나리오 2 : 경우에 따라 이전 명령을 통해 방금 실행 취소 한 (기본적으로 실행 취소) 항목을 되돌리고 아래 명령을 사용할 수 있습니다.

git reset --hard 8123b7e04b3

산출:

HEAD is now at cc6206c Comment_that_was_entered_for_commit

자세한 내용은 여기 : https://github.com/blog/2019-how-to-undo-almost-anything-with-git


질문 1에서 삭제할 커밋을 지정하지 않았기 때문에 시나리오 1에서 허용 된 답변을 제시해야합니다. 수락 된 답변은 마지막 커밋 만 삭제합니다 . 이 답변 커밋을 삭제 합니다 .
Dominic Cerisano

0

기존 답변은 정확하고 정확하지만 실행 취소해야하는 경우 push:

  1. 커밋을 로컬로 유지하거나 커밋되지 않은 변경 사항을 유지하려고합니다.
  2. 당신은 당신이 얼마나 많은 커밋을했는지 몰라

이 명령을 사용하여 변경 사항을 참조로 되돌립니다.

git push -f origin refs/remotes/origin/<branch>@{1}:<branch>

-2

원격 브랜치에서 마지막으로 푸시 한 마지막 커밋을 무시하려면 커밋을 제거하지 않고 git 포인터를 커밋으로 먼저 이동하여 무시합니다. HEAD ^ 또는 HEAD ^ 1

git push origin +HEAD^:branch

그러나 이미이 커밋을 푸시하고 다른 사람들이 브랜치를 끌어 올린 경우. 이 경우 브랜치 히스토리를 다시 작성하는 것은 바람직하지 않으며 대신이 커밋을 되돌려 야합니다.

git revert <SHA-1>
git push origin branch

1
예! 이것은 github으로 작업 할 때 매력처럼 작동했습니다. 감사.
cukabeka

문제는 "푸시"에 관한 것이며 리모트 브랜치에 관한 것입니다. git push origin + HEAD ^ : your_branch
mkebri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.