$ git log commit a867b4af366350be2e7c21b8de9cc6504678a61b` Author: Me <me@me.com> Date: Thu Nov 4 18:59:41 2010 -0400 blah blah blah... commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4 Author: Me <me@me.com> Date: Thu Nov 4 05:13:39 2010 -0400 more blah blah blah... commit 0766c053c0ea2035e90f504928f8df3c9363b8bd Author: Me <me@me.com> Date: Thu Nov 4 00:55:06 2010 -0400 And yet more blah blah... commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 Author: Me <me@me.com> Date: Wed Nov 3 23:56:08 2010 -0400 Yep, more blah blah.
어떻게 11월 3일의 커밋으로 0d1d7fc 있습니까, 즉 commit 0d1d7fc ?
답변자 : Cascabel
이것은 "되돌리기"가 의미하는 바에 따라 크게 달라집니다.
일시적으로 다른 커밋으로 전환
일시적으로 그 상태로 돌아가고 싶다면, 바보짓을 한 다음 현재 위치로 돌아가서 원하는 커밋을 확인하기만 하면 됩니다.
# This will detach your HEAD, that is, leave you with no branch checked out: git checkout 0d1d7fc32
또는 거기에 있는 동안 커밋을 하고 싶다면 거기에 있는 동안 새 분기를 만드세요.
git checkout -b old-state 0d1d7fc32
당신이 있던 곳으로 돌아가려면, 당신이 있던 지점을 다시 확인하십시오. (분기를 변경할 때 항상 그렇듯이 변경을 수행한 경우 적절하게 처리해야 합니다. 재설정하여 버릴 수 있습니다. stash, checkout, stash pop을 사용하여 가져갈 수 있습니다. 커밋할 수 있습니다. 거기에 지점을 원하면 거기에 지점으로 보내십시오.)
게시되지 않은 커밋 영구 삭제
반면에 그 이후로 한 모든 것을 정말로 없애고 싶다면 두 가지 가능성이 있습니다. 하나, 이러한 커밋을 게시하지 않은 경우 간단히 재설정하십시오.
# This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there's work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts, if you've modified things which were # changed since the commit you reset to.
엉망이라면 이미 로컬 변경 사항을 버린 것입니다. 그러나 다시 재설정하면 최소한 이전 위치로 돌아갈 수 있습니다.
새 커밋으로 게시된 커밋 실행 취소
반면에 저작물을 출판했다면 분기를 재설정하고 싶지 않을 것입니다. 분기가 효과적으로 기록을 다시 쓰는 것이기 때문입니다. 이 경우 실제로 커밋을 되돌릴 수 있습니다. Git에서 revert는 매우 구체적인 의미를 갖습니다. 즉, 취소하기 위해 리버스 패치로 커밋을 생성합니다. 이렇게 하면 기록을 다시 쓰지 않습니다.
# This will create three separate revert commits: git revert a867b4af 25eee4ca 0766c053 # It also takes ranges. This will revert the last two commits: git revert HEAD~2..HEAD #Similarly, you can revert a range of commits using commit hashes (non inclusive of first hash): git revert 0d1d7fc..a867b4a # Reverting a merge commit git revert -m 1 <merge_commit_sha> # To get just one, you could use `rebase -i` to squash them afterwards # Or, you could do it manually (be sure to do this at top level of the repo) # get your index and work tree into the desired state, without changing HEAD: git checkout 0d1d7fc32 . # Then commit. Be sure and write a good message describing what you just did git commit
이것은 HEAD에서 커밋 해시로 모든 것을 되돌릴 것입니다. 즉, 0766c053 이후의 모든 커밋이 되돌아 간 것처럼 작업 트리에서 해당 커밋 상태를 다시 생성합니다. 그런 다음 현재 트리를 커밋하면 "되돌린" 커밋과 본질적으로 동일한 새로운 커밋이 생성됩니다.
( --no-commit 플래그를 사용하면 git이 모든 커밋을 한 번에 되돌릴 수 있습니다. 그렇지 않으면 범위의 각 커밋에 대한 메시지를 입력하라는 메시지가 표시되어 불필요한 새 커밋으로 기록을 흩뜨리게 됩니다.)
이것은 이전 상태로 롤백 하는 안전하고 쉬운 방법입니다. 히스토리는 삭제되지 않으므로 이미 공개된 커밋에 사용할 수 있습니다.
답변자 : boulder_ruby
로그 코더?
혼자서 작업하고 작동하기를 원하십니까? 아래 지침을 따르십시오. 저와 다른 많은 사람들에게 수년 동안 안정적으로 작동했습니다.
다른 사람들과 함께 일하고 계십니까? Git은 복잡합니다. 성급한 일을 하기 전에 이 답변 아래의 설명을 읽으십시오.
작업 복사본을 가장 최근 커밋으로 되돌리기
변경 사항을 무시하고 이전 커밋으로 되돌리려면:
git reset --hard HEAD
여기서 HEAD는 현재 분기의 마지막 커밋입니다.
작업 복사본을 이전 커밋으로 되돌리기
가장 최근 커밋보다 오래된 커밋으로 되돌리려면:
# Resets index to former commit; replace '56e05fced' with your commit code git reset 56e05fced # Moves pointer back to previous HEAD git reset --soft HEAD@{1} git commit -m "Revert to 56e05fced" # Updates working copy to reflect the new commit git reset --hard
git checkout <commit_id> git checkout -b <new branch> <commit_id> git checkout HEAD~X // x is the number of commits t go back
이것은 원하는 커밋을 가리키는 새 분기를 체크아웃합니다. 이 명령은 주어진 커밋을 체크아웃합니다.
이 시점에서 분기를 만들고 이 시점부터 작업을 시작할 수 있습니다.
# Checkout a given commit. # Doing so will result in a `detached HEAD` which mean that the `HEAD` # is not pointing to the latest so you will need to checkout branch # in order to be able to update the code. git checkout <commit-id> # Create a new branch forked to the given commit git checkout -b <branch name>
# This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there's work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts, if you've modified things which were # changed since the commit you reset to.
참고: ( Git 2.7부터git rebase --no-autostash 도 사용할 수 있습니다.
이 스키마는 어떤 명령이 무엇을 하는지 보여줍니다. 보시다시피 reset && checkoutHEAD 수정합니다.
Git에서 로컬 변경 사항을 되돌리기 위해 여러 가지 방법을 시도했지만 최신 커밋 상태로 되돌리기를 원할 때 가장 잘 작동하는 것 같습니다.
git add . && git checkout master -f
간단한 설명:
git revert 처럼 커밋을 생성하지 않습니다.
git checkout <commithashcode> 처럼 HEAD를 분리하지 않습니다.
모든 로컬 변경 사항을 무시하고 분기의 마지막 커밋 이후 추가된 모든 파일을 삭제합니다.
브랜치 이름에서만 작동하므로 이 방법으로 브랜치의 최신 커밋으로만 되돌릴 수 있습니다.
위의 결과를 얻는 훨씬 더 편리하고 간단한 방법을 찾았습니다.
git add . && git reset --hard HEAD
여기서 HEAD는 현재 분기의 최신 커밋을 가리킵니다.
boulder_ruby가 제안한 것과 동일한 코드이지만 git add . before git reset --hard HEAD 마지막 커밋 이후에 생성된 모든 새 파일을 지우려면 이것이 대부분의 사람들이 최신 커밋으로 되돌릴 때 내가 믿는 것이라고 생각하기 때문입니다.
답변자 : david.t_92
가장 좋은 방법은 다음과 같습니다.
git reset --hard <commidId> && git push --force
이렇게 하면 분기를 특정 커밋으로 재설정한 다음 로컬에서와 동일한 커밋으로 원격 서버를 업로드합니다.
--force 플래그는 복구 옵션 없이 선택한 커밋 이후의 모든 후속 커밋을 제거하므로 주의하십시오.
답변자 : Alireza
좋아요, Git에서 이전 커밋으로 돌아가는 것은 아주 쉽습니다...
변경 사항 을 유지하지 않고 되돌리기:
git reset --hard <commit>
변경 사항 을 유지하면서 되돌리기:
git reset --soft <commit>
설명:git reset 사용하여 특정 상태로 재설정할 수 있습니다. 위에서 볼 수 있듯이 커밋 해시와 함께 사용하는 것이 일반적입니다.
그러나 차이점은 두 플래그를 사용하는 것입니다 --soft 및 --hard 기본적으로 --soft 플래그를 사용하여 git reset 이지만 항상 플래그를 사용하는 것이 좋습니다. 각 플래그를 설명합니다.
--부드러운
설명된 기본 플래그는 제공할 필요가 없으며 작업 트리를 변경하지 않지만 커밋할 준비가 된 모든 변경된 파일을 추가하므로 파일 변경 사항이 준비되지 않은 커밋 상태로 돌아갑니다.
--딱딱한
이 플래그를 조심하십시오. 작업 트리와 추적된 파일에 대한 모든 변경 사항을 재설정하면 모두 사라집니다!
또한 Git으로 작업하는 실생활에서 발생할 수 있는 아래 이미지를 만들었습니다.
답변자 : markreyes
마스터와 해당 분기에 대해 이야기하고 있다고 가정하면(즉, 이것은 관심 있는 작업 분기가 될 수 있음):
# Reset local master branch to November 3rd commit ID git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 # Reset remote master branch to November 3rd commit ID git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master
블로그 게시물에서 답변을 찾았습니다(지금은 더 이상 존재하지 않음).
이것은 재설정하고 원격으로 변경을 강제하는 것이므로 팀의 다른 사람들이 이미 git pull을 받은 경우 문제를 일으킬 수 있습니다. 당신은 사람들이 처음에 git을 사용하는 중요한 이유인 변경 기록을 파괴하고 있습니다.
재설정보다 되돌리기(다른 답변 참조)를 사용하는 것이 좋습니다. 당신이 1인 팀이라면 그것은 아마도 중요하지 않을 것입니다.
답변자 : Lance Caraccioli
~/commits-to-revert.txt 라는 텍스트 파일에 다음 커밋이 있다고 가정해 보겠습니다( git log --pretty=oneline 을 사용하여 가져옴).
#!/bin/bash cd /path/to/working/copy for i in `cat ~/commits-to-revert.txt` do git revert $i --no-commit done
이렇게 하면 파일 및 디렉터리 생성, 삭제를 포함하여 모든 것이 이전 상태로 되돌려지고 분기에 커밋되고 기록은 유지되지만 동일한 파일 구조로 되돌아갑니다. Git에 git revert --to <hash> 가 없는 이유는 제가 이해할 수 없습니다.
답변자 : Community Wiki
Jefromi의 솔루션에 대한 추가 대안
Jefromi의 솔루션 은 확실히 최고의 솔루션이며 반드시 사용해야 합니다. 그러나 완전성을 위해 커밋을 되돌리는 데 사용할 수도 있는 이러한 다른 대안 솔루션도 보여주고 싶었습니다( git revert 가 하는 것처럼 이전 커밋의 변경 사항을 취소하는 새 커밋을 생성한다는 의미에서) .
분명히 말해서, 이러한 대안 은 커밋을 되돌리는 가장 좋은 방법은 아니지만Jefromi의 솔루션은 입니다git revert 와 동일한 결과를 얻기 위해 이러한 다른 방법을 사용할 수도 있다는 점을 지적하고 싶습니다.
# Reset the index to the desired commit git reset --hard <commit> # Move the branch pointer back to the previous HEAD git reset --soft HEAD@{1} # Commit the changes git commit -m "Revert to <commit>"
이것은 기본적으로 소프트 리셋이 인덱스/스테이징 영역에 스테이징된 이전 커밋 상태를 남겨두고 커밋할 수 있다는 사실을 사용하여 작동합니다.
상황이 긴급한 상황이고 프로젝트가 예를 들어 "my project"라는 디렉토리 아래에 있다고 가정하고 질문자가 요청한 것을 빠르고 더러운 방식으로 수행하려는 경우:
QUICK AND DIRTY : 상황에 따라 빠르고 더티는 실제로 매우 GOOD일 수 있습니다. 여기서 내 솔루션은 작업 디렉토리에 있는 파일을 .git/ 디렉토리 아래에 숨어 있는 git 저장소의 깊이에서 끌어올린/추출한 파일로 돌이킬 수 없을 정도로 교체 하지 않습니다. 많은. 재난 상황으로 보일 수 있는 상황을 복구하기 위해 그러한 심해 다이빙을 할 필요가 없으며 충분한 전문 지식 없이 그렇게 하려고 시도하면 치명적일 수 있습니다 .
전체 디렉토리를 복사하고 "my project - copy"와 같이 다른 이름으로 부르십시오. git 저장소("repo") 파일이 "my project" 디렉토리(기본 위치, ".git"이라는 디렉토리 아래)에 있다고 가정하면 이제 작업 파일과 repo 파일을 모두 복사한 것입니다.
이렇게 하면 "내 프로젝트" 아래의 저장소 상태를 커밋 당시의 상태로 되돌립니다("커밋"은 작업 파일의 스냅샷을 의미합니다). 그 이후의 모든 커밋은 "내 프로젝트"에서 영원히 손실되지만 .../.git 아래에 있는 파일을 포함하여 해당 파일을 모두 복사했기 때문에 "내 프로젝트 - 복사" 아래의 저장소에 여전히 존재합니다. /.
그런 다음 시스템에 두 가지 버전이 있습니다... 이전 커밋에서 관심 있는 파일 등을 검사하거나 복사하거나 수정할 수 있습니다. 복원된 커밋이 아무데도 진행되지 않았기 때문에 새 작업을 결정했다면 "내 프로젝트 - 복사" 아래에 있는 파일을 완전히 삭제할 수 있습니다.
검색된 커밋이 디렉토리 이름을 다시 변경하는 것이기 때문에 실제로 작업을 버리지 않고 프로젝트 상태를 계속 유지하려면 검색된 커밋이 포함된 프로젝트를 삭제(또는 임시 이름 지정)하고 " 내 프로젝트 - 복사" 디렉토리를 다시 "내 프로젝트"로 복사합니다. 그런 다음 여기에서 다른 답변 중 일부를 이해하려고 시도하고 곧 다른 커밋을 수행할 수 있습니다.
Git은 훌륭한 창조물이지만 아무도 "즉석에서 집어들" 수 없습니다. 또한 너무 자주 설명하려고 하는 사람들은 다른 VCS[버전 제어 시스템]에 대한 사전 지식을 가정하고 너무 깊이 파고듭니다. 너무 빨리, 그리고 "체크 아웃"에 대해 상호 교환 가능한 용어를 사용하는 것과 같은 다른 범죄를 저지르는 경우가 있습니다.
스트레스를 많이 받으려면 내 상처에서 배우십시오. Git에 대한 책을 거의 읽어야 합니다 . "Git으로 버전 관리"를 권장합니다. 더 늦기 전에 빨리하십시오. 그렇다면 Git의 복잡성 중 많은 부분이 분기 및 재병합에서 비롯된다는 점을 명심하십시오. 어떤 책에서든 해당 부분을 건너뛸 수 있습니다. 당신의 질문에 따르면 사람들이 과학으로 당신의 눈을 멀게 할 이유 가 없습니다.
특히 예를 들어 이것이 절망적인 상황이고 Git을 처음 사용하는 경우!
추신: 또 다른 생각: 작업 파일이 있는 디렉토리가 아닌 다른 디렉토리에 Git 저장소를 유지하는 것은 (지금) 실제로 매우 간단합니다. 즉, 위의 빠르고 더티한 솔루션을 사용하여 전체 Git 저장소를 복사할 필요가 없습니다. 여기--separate-git-dir 사용하여 Fryer의 답변을 참조하십시오. 그러나 경고 : 복사하지 않는 "별도의 디렉토리" 저장소가 있고 하드 리셋을 수행하는 경우 절대적으로 해야 하는 것처럼 리포지토리를 정기적으로 백업하는 것이 좋습니다. 특히 클라우드(예: Google 드라이브 )에 다른 위치에 저장하는 것이 좋습니다.
"클라우드에 백업"이라는 주제에 대해 다음 단계는 GitHub 또는 (내 견해로는 더 나은) GitLab으로 계정(물론 무료)을 여는 것입니다. 그런 다음 정기적으로 git push 명령을 수행하여 Cloud repo를 "적절하게" 최신 상태로 만들 수 있습니다. 그러나 다시, 이것에 대해 이야기하는 것은 너무 성급할 수 있습니다.
답변자 : Point Networks
이것은 최근 커밋으로 직접 재설정하는 또 다른 방법입니다.
git stash git stash clear
마지막 커밋 이후에 수행한 모든 변경 사항을 직접 지웁니다.
추신: 약간의 문제가 있습니다. 또한 최근에 저장한 모든 숨김 변경 사항을 삭제합니다. 대부분의 경우 중요하지 않아야 한다고 생각합니다.
답변자 : Sireesh Yarlagadda
되돌리기는 커밋을 롤백하는 명령입니다.
git revert <commit1> <commit2>
견본:
git revert 2h3h23233
아래와 같이 HEAD에서 범위를 취할 수 있습니다. 여기서 1은 "마지막 커밋 되돌리기"라고 말합니다.
git revert HEAD~1..HEAD
그리고 다음을 수행하십시오.
git push
답변자 : Chris Moschini
실수로 인한 변경 사항으로부터 코더의 디렉토리를 완전히 정리하기 위해 다음을 사용했습니다.
git add -A . git reset --hard HEAD
git reset --hard HEAD 는 수정 사항을 제거하지만 "새" 파일은 제거하지 않습니다. 그들의 경우에는 실수로 중요한 폴더를 임의의 위치로 드래그했고 해당 파일은 모두 Git에서 새 파일로 처리되었으므로 reset --hard 수정하지 않았습니다. git add -A . 를 실행하여. 사전에 git으로 모두 명시적으로 추적하여 재설정으로 지워졌습니다.
답변자 : nevster
어떤 사람들은 마스터에서 커밋된 변경 사항을 롤백하는 방법을 알고 싶어 이 질문에 올 수 있다고 생각합니다. 즉, 모든 것을 버리고 원본/마스터로 돌아가려면 다음을 수행하십시오.