programing

git를 사용하여 푸시된 커밋을 취소하려면 어떻게 해야 합니까?

i4 2023. 4. 26. 22:58
반응형

git를 사용하여 푸시된 커밋을 취소하려면 어떻게 해야 합니까?

원격 저장소에 로컬 저장소(개발) 및 서버 1(prod)과 동기화된 프로젝트가 있습니다.이미 원격으로 푸시되어 서버에서 가져온 변경 사항을 커밋했습니다.이제 이러한 변경 사항을 취소합니다. 그냥 그서저그냥는래▁just.git checkout변경하기 전에 커밋하고 새 변경 사항을 커밋합니다. 하지만 원격으로 다시 푸시하는 데 문제가 있을 것 같습니다.제가 어떻게 진행해야 하는지에 대한 제안이 있습니까?

다음을 사용하여 개별 커밋을 되돌릴 수 있습니다.

git revert <commit_hash>

지정한 커밋의 변경 내용을 되돌리는 새 커밋이 만들어집니다.특정 커밋만 반환하고 이후 커밋은 반환하지 않습니다.커밋 범위를 되돌리려면 다음과 같이 수행할 수 있습니다.

git revert <oldest_commit_hash>..<latest_commit_hash>

다음 이후의 모든 커밋을 반환합니다.<oldest_commit_hash>까지 <latest_commit_hash>Git의 일부 버전에서는 또한 다음을 되돌립니다.<oldest_commit_hash>그래서 그 커밋이 되돌리는지 다시 확인합니다.커밋(커밋을 은할 수 .g reset --hard HEAD~.

사할수있커해확시면인려를 사용할 수 git log.

Git-revert man 페이지에서 더 많은 정보를 확인하십시오.git revert지휘권또한 커밋을 되돌리는 방법에 대한 자세한 내용은 이 답변을 참조하십시오.

실행 취소의 흔적을 남기지 않는 솔루션.

참고: 다른 사용자가 이미 거스름돈을 인출한 경우에는 이 작업을 수행하지 마십시오(개인 보관소에서만 사용합니다).

실행:

git reset <previous label or sha1>

그러면 모든 업데이트가 로컬로 다시 표시됩니다(Sogit 상태에 모든 업데이트된 파일이 나열됨).

그런 다음 "작업을 수행"하고 변경 사항을 다시 커밋합니다(참고: 이 단계는 선택 사항입니다).

git commit -am "blabla"

현재 로컬 트리가 원격 트리와 다릅니다.

git push -f <remote-name> <branch-name>

원격 분기가 강제로 이 푸시를 수행하고 이전 항목을 제거합니다(remote-name 및 branch-name 지정은 필수 사항은 아니지만 업데이트 플래그로 모든 분기를 업데이트하지 않는 것이 좋습니다).

주의 일부 태그는 여전히 제거된 커밋을 가리키고 있을 수 있습니다!!원격 태그 삭제 방법

이 경우 제가 수행하는 작업은 다음과 같습니다.

  • 서버에서 마지막으로 확인된 정상 커밋으로 커서를 다시 이동합니다.

    git push -f origin <last_known_good_commit>:<branch_name>
    
  • 로컬에서 동일한 작업을 수행합니다.

    git reset --hard <last_known_good_commit>
    #         ^^^^^^
    #         optional
    



my_new_branch목적으로 것: 목 적 위 만 든 것 해 을 이 것 ▁that

$ git branch
my_new_branch

은 이은몇가추후최기다니록입근의가에 몇 가지를 입니다.myfile.py:

$ git log
commit 80143bcaaca77963a47c211a9cbe664d5448d546
Author: me
Date:   Wed Mar 23 12:48:03 2016 +0100

    Adding new stuff in myfile.py

commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit

이미 푸시된 마지막 커밋을 제거하고 싶어서 실행합니다.

$ git push -f origin b4zad078237fa48746a4feb6517fa409f6bf238e:my_new_branch
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:me/myrepo.git
 + 80143bc...b4zad07 b4zad078237fa48746a4feb6517fa409f6bf238e -> my_new_branch (forced update)

좋아요! 이제 그 커밋에서 변경된 파일이 보여요 (myfile.py는 " commit "commit"에 표시됩니다.

$ git status
On branch my_new_branch
Your branch is up-to-date with 'origin/my_new_branch'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   myfile.py

no changes added to commit (use "git add" and/or "git commit -a")

이러한 변경을 원하지 않기 때문에 커서를 로컬로 다시 이동합니다.

$ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e
HEAD is now at b4zad07 Initial commit

이제 HEAD는 로컬 및 원격 모두에서 이전 커밋에 있습니다.

$ git log
commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date:   Tue Mar 18 12:46:59 2016 +0100

    Initial commit

푸시된 커밋이 제거됩니다.

git reset --hard 'xxxxx'

git clean -f -d

git push -f

만일의 경우를 대비하여 백업을 만듭니다.

댓글에서 두 개의 메모가 튀어나왔습니다.

  • 'xxxxx'유지하려는 마지막 커밋의 해시 코드입니다.

  • clean관리가 파일을합니다!버전 제어가 아닌 파일을 제거합니다!

git 명령줄을 통해 아래와 같은 단계에 따라 Git Commit BOTH 로컬 및 원격으로 Git Commit(Git 커밋)을 되돌릴 수 있습니다(또는 DELETE라고도 할 수 있습니다.

다음 명령을 실행하여 되돌리려는 커밋 ID를 확인합니다.

git log --oneline --decorate --graph

당신은 다음 스크린샷처럼 될 것입니다.

(웹 인터페이스를 통해) 원격도 선택하면 아래와 같은 것을 확인할 수 있습니다.

여기에 이미지 설명 입력

현재 스크린샷에 따르면 귀하는 커밋 ID110322에 있지만 로컬원격 모두에서 030bbf6으로 되돌리려고 합니다.

로컬에서+원격으로 커밋을 삭제/반환하려면 다음 단계를 수행합니다.


처음 로컬에서 커밋 ID 030bbf6으로 되돌리기

git reset --hard 030bbf6

다음에

git clean -f -d

이 두 명령은 아래 스냅샷에 표시된 것처럼 030bbf6 단계로 강제 재설정됩니다.

여기에 이미지 설명 입력

이제 git 상태를 실행하면 아래와 같이 원격 분기에서 두 개의 커밋이 뒤에 있음을 알 수 있습니다.

인덱스를 업데이트하려면 다음을 실행합니다(업데이트가 있는 경우).모든 개발자에게 주 원격 분기에서 꺼내기 요청을 수락하지 않도록 요청하는 것이 좋습니다.

git fetch --all

작업을 마치면 아래와 같이 분기 앞에 + 기호를 사용하여 이 커밋을 강제로 푸시해야 합니다.여기를 마스터 브랜치로 사용했습니다. 아무 것이나 사용할 수 있습니다.

여기에 이미지 설명 입력 코드

git push -u origin +master

이제 원격의 웹 인터페이스가 보이면 커밋도 되돌려야 합니다.

여기에 이미지 설명 입력

61234유지하려는 마지막 양호한 커밋의 샤 번호입니다.

git reset --hard 61234
git push -f

추적 없이 모든 잘못된 커밋을 완전히 제거합니다.

참고: (재설정한 커밋을) 사용할 특정 분기로 푸시하려면git push -f origin branch-name대신.

2020 간단한 방법:

git reset <commit_hash>

(유지할 마지막 커밋의 해시).

현재 커밋되지 않은 변경사항을 로컬로 유지합니다.

다시 푸시하려면 다음 작업을 수행해야 합니다.

git push -f
git revert HEAD -m 1

위의 코드 라인에서."마지막 인수는 다음을 나타냅니다."

  • 1-자신의 커밋을 되돌립니다.

  • 2 - 마지막 두 커밋을 되돌립니다.

  • n - 마지막 n개의 커밋을 되돌립니다.

원격에 영향을 미치려면 이 명령 뒤에 를 눌러야 합니다.되돌릴 커밋 범위 지정과 같은 다른 옵션도 있습니다.이것은 옵션 중 하나입니다.


나중에 사용git commit -am "COMMIT_MESSAGE"그리고나서git push또는git push -f

제 방법은 다음과 같습니다.

지점 이름을 다음과 같이 가정합니다.develop.

# Checkout a new temp branch based on one history commit
# (command to get history commit hashes: git log --oneline)
git checkout <last_known_good_commit_hash>

# Delete the original develop branch 
git branch -D develop
# Create a new develop branch based on the temp branch
git checkout -b develop

# Force update the remote with the new branch
git push -f origin develop

재설정 작업은 저에게 매우 효과적이었습니다.@MoD Genensis 및 @vibs 2006에 감사드립니다.


git reset --hard 'your last working commit hash'

git clean -f -d

git push -f

git reset <commit_hash>(<commit_commit>를 가져오려면 git log --oneline을 사용합니다.)

git restore .변경된 모든 파일을 대상 커밋의 버전으로 복원합니다.

git push origin master --force원격 마스터 분기에 강제로 푸시합니다.그러나 같은 지점에서 함께 작업하는 사람이 있는 경우에는 강제 푸시를 사용할 때 주의해야 합니다.

깨끗하게 하는 방법:

git rebase -i <hash of last good commit, 9 chars is enough>

이제 마지막 양호한 커밋부터 다음 커밋까지의 커밋 목록을 얻을 수 있습니다.HEAD각 커밋에 대해 수행할 작업 옵션이 있습니다. DROP그 약속을 버릴 겁니다파일을 저장합니다.

이제 업스트림을 수정하려면 다음을 수행합니다.

git push --force-with-lease

(누른 업데이트 작업을 하는 다른 사람에게 실수로 문제를 일으키지 않도록 임대)

이렇게 하면 이전의 잘못된 커밋을 수정하는 새로운 커밋을 도입하는 대신 잘못된 커밋을 제거하여 로그를 깨끗하게 유지할 수 있습니다.

당신은 다음과 같은 것을 할 수 있습니다.

git push origin +<short_commit_sha>^:<branch_name>

되돌리지 않고 이 작업을 수행하는 다른 방법(실행 취소 흔적):

다른 사용자가 다른 커밋을 푸시한 경우 수행 안 함

분기에 있는 분기의 백업을 만듭니다.my-branch따라서 문제가 발생할 경우 작업 손실 없이 프로세스를 다시 시작할 수 있습니다.

git checkout -b my-branch-temp

지점으로 돌아가십시오.

git checkout my-branch

재설정, 마지막 커밋을 취소하려면(실행 취소):

git reset --hard HEAD^

원격에서 분기를 제거합니다(예: origin원격).

git push origin :my-branch

원하지 않는 커밋 없이 원격으로 분기를 다시 누릅니다.

git push origin my-branch

알았어!

그게 도움이 되길 바랍니다!;)

언급URL : https://stackoverflow.com/questions/22682870/how-can-i-undo-pushed-commits-using-git

반응형