답변:
다음을 사용하여 개별 커밋을 되돌릴 수 있습니다.
git revert <commit_hash>
지정한 커밋의 변경 사항을 되 돌리는 새로운 커밋이 생성됩니다. 특정 커밋 만 되돌리고 그 이후에는 커밋하지 않습니다. 커밋 범위를 되돌리려면 다음과 같이하십시오.
git revert <oldest_commit_hash>..<latest_commit_hash>
지정된 커밋 사이에서 커밋을 포함하여 커밋을 되돌립니다.
상기 봐 자식-되돌리기 man 페이지 에 대한 자세한 내용은 git revert
명령. 또한 볼 이 답변 커밋을 되 돌리는에 대한 자세한 내용은.
git log
<oldest_commit_hash>
목록에 포함되었습니다
"실행 취소"의 흔적을 남기지 않는 솔루션.
참고 : 누군가가 이미 변경 사항을 가져간 경우이 작업을 수행하지 마십시오 (개인 저장소에서만 사용함)
하다:
git reset <previous label or sha1>
이것은 모든 업데이트를 로컬에서 다시 체크 아웃합니다 (git 상태는 모든 업데이트 된 파일을 나열합니다)
그런 다음 "작업을 수행"하고 변경 사항을 다시 커밋합니다 (참고 :이 단계는 선택 사항입니다)
git commit -am "blabla"
이 시점에서 로컬 트리가 리모컨과 다릅니다
git push -f <remote-name> <branch-name>
원격이 푸시를 고려하고 이전 푸시를 제거하도록 강제합니다 (원격 이름 및 분기 이름을 지정하는 것은 필수는 아니지만 업데이트 플래그로 모든 분기를 업데이트하지 않는 것이 좋습니다).
!! 조심 일부 태그는 여전히 삭제 커밋을 가리킬 수 있습니다! 원격 태그 삭제 방법
git push -f
마지막 커밋과 원격 기록을 정리했습니다! 감사!
이 경우 내가하는 일은 :
서버에서 커서를 마지막으로 알려진 올바른 커밋으로 다시 이동하십시오.
git push -f origin <last_known_good_commit>:<branch_name>
로컬에서 동일한 작업을 수행하십시오.
git reset --hard <last_known_good_commit>
# ^^^^^^
# optional
my_new_branch
이 목적으로 만든 지점에 대한 전체 예를 참조하십시오 .
$ 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
) 에서 변경된 파일이 "커밋 준비되지 않음"에 표시됩니다.
$ 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 명령 행을 통해 아래 주어진 단계를 수행하면 Git Commit BOTH를 로컬 및 원격으로 REVERT (또는 DELETE 라고도 함) 할 수 있습니다 .
되돌리려는 커밋 ID를 보려면 다음 명령을 실행하십시오.
git log --oneline --decorate --graph
웹 인터페이스를 통해 원격을 확인 하면 아래 표시된 것과 동일하다는 것을 알 수 있습니다.
현재 스크린 샷에 따라 커밋 ID e110322에 있지만 030bbf6 BOTH LOCALLY 및 REMOTELY 로 되돌리고 싶습니다 .
다음 단계를 수행하여 로컬로 커밋 + 원격 커밋 삭제
ID 030bbf6 을 커밋하기 위해 로컬로 처음 되돌리기
git reset --hard 030bbf6
뒤에
git clean -f -d
이 두 명령은 아래 그림과 같이 스테이지 030bbf6 을 커밋하도록 강제 재설정합니다.
이제 git status를 실행하면 아래와 같이 원격 브랜치에서 두 번 커밋되었음을 알 수 있습니다
다음을 실행하여 색인을 업데이트하십시오 (업데이트가있는 경우). 모든 개발자에게 주 원격 지점에서 끌어 오기 요청을 수락하지 않도록 요청하는 것이 좋습니다.
git fetch --all
당신이 그것으로 완료되면 아래에 표시된 것처럼 분기 앞의 + 기호를 사용 하여이 커밋을 강제 로 푸시 해야 합니다. 나는 여기에서 마스터 브랜치 로 사용 했습니다.
git push -u origin +master
이제 원격의 웹 인터페이스가 표시되면 커밋도 되돌려집니다.
푸시 된 커밋을 제거합니다.
git reset --hard 'xxxxx'
git clean -f -d
git push -f
git revert HEAD -m 1
위의 코드 라인에서. "마지막 논쟁은"
1-한 커밋을 되돌립니다.
2-마지막 두 커밋을 되돌립니다.
n-마지막 n 커밋을 되돌립니다.
원격에 영향을 미치려면이 명령을 누른 후 밀어야합니다. 되돌릴 커밋 범위 지정과 같은 다른 옵션이 있습니다. 이것은 옵션 중 하나입니다.
나중에 사용 git commit -am "COMMIT_MESSAGE"
후 git push
또는git push -f
git revert ref1..ref2
여기 내 방법이 있습니다.
지점 이름이이라고 가정 해 봅시다 develop
.
# Create a new temp branch based on one history commit
git checkout <last_known_good_commit_hash>
git checkout -b develop-temp
# Delete the original develop branch and
# create a new branch with the same name based on the develop-temp branch
git branch -D develop
git checkout -b develop
# Force update this new branch
git push -f origin develop
# Remove the temp branch
git branch -D develop-temp