현재 상태에서 특정 커밋으로 만들어진 스냅 샷으로 되돌리려면 어떻게해야합니까?
git log
를 수행하면 다음과 같은 출력이 표시됩니다.
$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date: Thu Nov 4 18:59:41 2010 -0400
blah blah blah...
commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date: Thu Nov 4 05:13:39 2010 -0400
more blah blah blah...
commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date: Thu Nov 4 00:55:06 2010 -0400
And yet more blah blah...
commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date: Wed Nov 3 23:56:08 2010 -0400
Yep, more blah blah.
11 월 3 일에 커밋으로 되돌리려면 0d1d7fc
를 (를) 커밋해야합니다.
이것은 "되돌리기"가 의미하는 것에 많이 달려 있습니다.
일시적으로 다시 돌아가서 바보짓을 한 다음 다시 돌아와서 원하는 위치로 돌아 가려는 경우 원하는 커밋을 확인하기 만하면됩니다.
# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32
또는 그곳에있는 동안 커밋을하고 싶다면 계속해서 새로운 지점을 만드십시오.
git checkout -b old-state 0d1d7fc32
당신이있는 곳으로 돌아가려면, 당신이 다시 있었던 지점을 체크 아웃하십시오. (브랜치를 전환 할 때 항상 변경된 사항과 같이 변경 사항을 적용한 경우 적절한 조치를 취해야합니다.이를 버리면 재설정 할 수 있고, 숨겨두고, 계산할 수 있으며, 팝업을 숨겨서 가져갈 수 있습니다. 거기에 가지를 원한다면 그곳에있는 가지까지.)
반면에, 당신이 정말로 그때 이후로 한 모든 것을 없애고 싶다면, 두 가지 가능성이 있습니다. 하나, 이러한 커밋을 게시하지 않은 경우 단순히 재설정하십시오.
# 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을 사용하면 되돌리기는 아주 특별한 의미가 있습니다 : 역 패치를 사용하여 커밋을 만들어서 취소하십시오. 이렇게하면 기록을 다시 쓰지 않아도됩니다.
# 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:
git revert a867b4af..0766c053
# 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
git-revert
맨 페이지 는 실제로이 설명에서 많은 부분을 다룹니다. 또 다른 유용한 링크는 this git-scm.com 섹션 인 git-revert 입니다.
결국 되돌리기를 원하지 않는다고 결정하면 되돌리기 (여기 설명 된대로)를 되돌 리거나 되돌리기 전에 다시 설정할 수 있습니다 (이전 섹션 참조).
이 답변은이 경우에 도움이 될 것입니다.
HEAD 이전 위치로 이동하는 방법? (분리 된 머리)
여기에 복잡하고 위험한 답변이 많이 있지만 실제로는 쉽습니다.
git revert --no-commit 0766c053..HEAD
git commit
이것은 HEAD에서 커밋 해시로 모든 것을 되돌릴 것입니다. 즉, 작업 트리 에서 커밋 상태를 마치 이후 모든 커밋이 취소되었습니다. 그런 다음 현재 트리를 커밋 할 수 있으며 "revert"한 커밋과 본질적으로 동일한 새로운 커밋을 만듭니다.
(--no-commit
플래그를 사용하면 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 [email protected]{1}
git commit -m "Revert to 56e05fced"
# Updates working copy to reflect the new commit
git reset --hard
크레딧은 비슷한 Stack Overflow 질문으로갑니다.Git에서 SHA hash를 사용하여 커밋으로 되돌립니다..
나와 다른 사람들에게 가장 좋은 옵션은 Git 재설정 옵션입니다.
git reset --hard <commidId> && git clean -f
이것은 나를 위해 최고의 선택이었습니다! 그것은 간단하고, 빠르고 효과적입니다!
참고 : 이전 커밋의 복사본을 가진 다른 사람들과 지사를 공유하는 경우 주석에 언급 된 바와 같이
덧붙여 말하자면, 덜 발랄한 방법을 원한다면
git clean -i
대답하기 전에 배경을 추가하고이 HEAD
이 무엇인지 설명합니다.
First of all what is HEAD?
HEAD
은 현재 분기의 현재 커밋 (최신)에 대한 참조입니다. 주어진 시간에 HEAD
이 하나만있을 수 있습니다 (git worktree
제외).
HEAD
의 내용은 .git/HEAD
안에 저장되며 현재 커밋의 SHA-1 40 바이트를 포함합니다.
detached HEAD
최신 커밋이 아니라면 - HEAD
이 이전 커밋을 가리키고 있다는 것을 의미합니다.detached HEAD
.
명령 줄에서 HEAD
이 현재 분기의 끝을 가리키고 있지 않기 때문에 분기 이름 대신 SHA-1처럼 보입니다.
git checkout
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>
git reflog
reflog
도 항상 사용할 수 있습니다. git reflog
는 HEAD
을 업데이트 한 변경 사항을 표시하고 원하는 reflog 항목을 체크 아웃하면 HEAD
이 다시 커밋됩니다.
HEAD가 수정 될 때마다 reflog
git reflog
git checkout [email protected]{...}
그러면 원하는 커밋으로 되돌아갑니다.
git reset HEAD --hard <commit_id>
머리를 원하는 커밋으로 "이동"하십시오.
# 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 rebase --no-autostash
도 사용할 수 있습니다.이 스키마는 어떤 명령이 무엇을하는지 설명합니다. 거기에서 볼 수 있듯이 reset && checkout
는 HEAD
을 수정합니다.
"uncommit"하고 마지막 커밋 메시지를 지우고 수정 된 파일을 다시 스테이징에 넣으려면 다음 명령을 사용합니다.
git reset --soft HEAD~1
--soft
는 커밋되지 않은 파일이 --hard
와 반대되는 작업 파일로 유지되어야한다는 것을 나타냅니다.HEAD~1
는 마지막 커밋입니다. 3 개의 커밋을 롤백하려면 HEAD~3
를 사용할 수 있습니다. 특정 개정 번호로 롤백하려면 SHA hash를 사용하여 수행 할 수 있습니다.이것은 잘못된 것을 커밋 한 상황에서 매우 유용한 명령이며 마지막 커밋을 실행 취소하려고합니다.
Git에서 로컬 변경 사항을 되돌릴 수있는 많은 방법을 시도했으며, 가장 최근의 커밋 상태로 되돌리려면이 방법이 가장 효과적으로 보입니다.
git add . && git checkout master -f
간단한 설명:
git revert
처럼 커밋을 생성하지 않습니다.git checkout <commithashcode>
처럼 HEAD을 (를) 분리하지 않습니다.위의 결과를 얻는 데 훨씬 편리하고 간단한 방법을 찾았습니다.
git add . && git reset --hard HEAD
여기서 HEAD는 현재 분기의 최신 커밋을 가리 킵니다.
그것은 boulder_Ruby가 제안한 코드와 동일하지만 git add .
전에 git reset --hard HEAD
를 추가하여 마지막 커밋 이후 작성된 모든 새 파일을 지우므로 대부분의 사람들은 최신 커밋으로 되돌릴 때이를 기대합니다.
다음 두 명령으로이 작업을 수행 할 수 있습니다.
git reset --hard [previous Commit SHA id here]
git Push Origin [branch Name] -f
이전 Git 커밋을 제거합니다.
변경 사항을 유지하려면 다음을 사용할 수도 있습니다.
git reset --soft [previous Commit SHA id here]
그런 다음 변경 사항을 저장합니다.
OK, git에서 이전 커밋으로 돌아가는 것은 아주 쉽다 ...
되돌리기 유지하지 않음 변경 사항 :
git reset --hard <commit>
되돌리기 유지 변경 :
git reset --soft <commit>
Explain : git reset을 사용하면 특정 상태로 재설정 할 수 있습니다. 위에서 보았 듯이 커밋 해시와 함께 사용하는 것이 일반적입니다.
그러나 차이점은 --soft
과 --hard
두 플래그를 git reset
플래그를 사용하여 기본적으로 --soft
사용하고 있지만 항상 플래그를 사용하는 것이 좋습니다. 각 플래그에 대해 설명합니다.
설명 된대로 기본 플래그는 작업 트리를 변경하지 않고 커밋 할 준비가 된 모든 변경 사항 파일을 추가하므로 파일 변경이 커지면 커밋되지 않은 상태로 돌아갑니다.
이 플래그를주의해서 작업 트리와 모든 변경 사항을 추적 된 파일로 재설정하면 모두 사라집니다!
나는 또한 git로 작업하면서 실제로 일어날 수있는 이미지를 아래에 만들었다.
이 정확한 조합을 제외하고는 아무 것도 나를 위해 일하지 않았습니다.
git reset --hard <commit_hash>
git Push Origin <branch_name> --force
여기서 중요한 것은 푸시를 강제하는 것입니다. 추가 커밋/커밋 메시지 등은 없습니다.
~/commits-to-revert.txt
라는 텍스트 파일에서 다음 커밋을했다고 가정 해 봅시다 (나는 그들을 얻기 위해 git log --pretty=oneline
를 사용했습니다)
fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca
Bash Shell 스크립트를 만들어 각각을 되돌립니다.
#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
git revert $i --no-commit
done
이렇게하면 파일 및 디렉토리 생성 및 삭제를 포함하여 모든 항목이 이전 상태로 돌아가며 지점으로 커밋하고 내역을 유지하지만 다시 동일한 파일 구조로 되돌릴 수 있습니다. 왜 힘내는 git revert --to <hash>
을 가지고 있지 않습니다.
Jefromi의 솔루션 는 확실히 최고의 솔루션이므로 반드시 사용해야합니다. 그러나 완전성을 기하기 위해 커밋을 되돌릴 때 사용할 수있는 다른 대안 솔루션을 보여주고 싶었습니다 ( 이전 커밋의 변경 사항을 취소하는 새로운 커밋을 만듭니다 , git revert
의 기능과 동일).
분명히, 이러한 대안 은 커밋을 되 돌리는 가장 좋은 방법은 아닙니다 , Jefromi의 솔루션은 , 하지만 다른 방법을 사용하여 git revert
와 같은 것을 달성 할 수 있다고 지적하고 싶습니다.
이것은 Charles Bailey의 솔루션을 약간 수정하여 Git의 SHA 해시로 커밋으로 되돌리기? :
# Reset the index to the desired commit
git reset --hard <commit>
# Move the branch pointer back to the previous HEAD
git reset --soft [email protected]{1}
# Commit the changes
git commit -m "Revert to <commit>"
이것은 기본적으로 소프트 리셋이 이전 커밋 상태를 인덱스/스테이징 영역에서 단계적으로 남겨두고 커밋 할 수 있다는 사실을 사용하여 작동합니다.
이 솔루션은 svick의 솔루션에서 이전 커밋을 체크 아웃하고 새로운 커밋으로 만듭니다 :
git rm -r .
git checkout <commit> .
git commit
대안 # 1과 마찬가지로 현재 작업 복사본에서 <commit>
상태를 재현합니다. git rm
은 (는) git checkout
이후에 추가 된 파일을 제거하지 않으므로 <commit>
을 (를) 먼저 수행해야합니다.
당신이 주인에 대해 이야기하고 있다고 가정하면, 해당 지점에서 (즉, 이것은 당신이 관심을 갖고있는 일하는 지점이 될 수 있습니다) :
# 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을 당긴 경우 문제가 발생할 수 있습니다. 당신은 변화의 역사를 파괴하고 있습니다. 이것은 사람들이 왜 자식을 사용하는지에 대한 중요한 이유입니다.
재설정보다 복귀 (다른 답변 참조)를 사용하는 것이 좋습니다. 만약 당신이 한 사람의 팀이라면 아마도 상관 없습니다.
여기에 훨씬 간단합니다 이전 커밋으로 돌아가는 방법 (그리고 커밋되지 않은 상태에서 원하는대로 할 수 있습니다) :
git reset HEAD~1
그래서, 커밋 ids 등등에 대한 필요가 없습니다 :)
모든 변경 후, 당신이 모든 명령을 밀어 때, 당신은 사용해야 할 수도 있습니다 :
git Push -f ...
뿐만 아니라 git Push
.
구 명령을 되 돌리거나 스테이징하기위한 커맨드가 있습니다 (코어 커밋의 일부는 아니지만, git-extras 패키지에 있습니다) :
git back
man 페이지 에 따라 다음과 같이 사용할 수도 있습니다 :
# Remove the latest three commits
git back 3
이러한 모든 초기 단계를 직접 완료하고 git repo로 되돌릴 수 있습니다.
git pull --all
명령을 사용하여 Bitbucket에서 저장소의 최신 버전을 가져옵니다.
터미널에서 -n 4와 함께 git log 명령을 실행하십시오. -n 다음의 숫자는 로컬 히스토리의 가장 최근 커밋에서 시작하여 로그에있는 커밋 수를 결정합니다.
$ git log -n 4
git reset --hard HEAD~N
를 사용하여 리포지토리 히스토리의 헤드를 재설정합니다. 여기서 N은 헤드를 다시 가져 오려는 커밋 수입니다. 다음 예제에서 헤드는 한 번의 커밋을 저장소 히스토리의 마지막 커밋으로 다시 설정합니다.
git Push --force
를 사용하여 git repo에 변경 사항을 강제 적용하여 변경 사항을 적용하십시오.
Git 저장소가 이전 커밋을 원한다면
git pull --all
git reset --hard HEAD~1
git Push --force
가장 최근 버전으로 되돌리기 모든 로컬 변경 사항을 커밋하고 무시합니다.
git reset --hard HEAD
필요한 커밋을 선택하고
git show HEAD
git show HEAD~1
git show HEAD~2
당신이 필요한 커밋을 얻을 때까지. HEAD가이를 가리 키도록하려면, 다음을 수행하십시오.
git reset --hard HEAD~1
또는 git reset --hard HEAD~2
또는 무엇이든간에.
git stash
git stash clear
마지막 커밋 이후에 변경 한 내용을 모두 지 웁니다.
추신 : 약간의 문제가 있습니다. 그것은 또한 당신이 최근 숨긴 변경 사항을 모두 삭제합니다. 나는 대부분의 경우에 그것이 중요하지 않아야한다고 생각한다.
이전 커밋의 변경 사항을 HEAD에 저장하고 이전 커밋으로 이동하려면 다음을 수행하십시오.
git reset <SHA>
이전 커밋에서 HEAD에 대한 변경이 필요하지 않고 모든 변경 사항을 무시한 경우 다음을 수행하십시오.
git reset --hard <SHA>
실수로 변경된 부분에서 코더의 디렉토리를 완전히 지우려면 다음을 사용했습니다.
git add -A .
git reset --hard HEAD
그냥 git reset --hard HEAD
는 수정을 없애 겠지만 "새"파일을 제거하지는 않습니다. 그들의 경우 우연히 어딘가에 중요한 폴더를 실수로 드래그하여 모든 파일이 힘내에 의해 새 것으로 취급되어 reset --hard
가 문제를 해결하지 못했습니다. 사전에 git add -A .
를 실행함으로써, 명시 적으로 모두 git으로 추적하여 재설정으로 지울 수 있습니다.
나는 어떤 사람들이 자신의 주인이 저지른 커밋 된 변화를 롤백하는 방법을 알고 싶어하는이 질문에 도달 할 것이라고 믿는다. 즉 모든 것을 버리고 Origin/master로 돌아가는 경우, 이렇게하면된다.
git reset --hard Origin/master
https://superuser.com/questions/273172/how-to-reset-master-to-Origin-master
되돌리기는 커밋을 롤백하는 명령입니다.
git revert <commit1> <commit2>
샘플 :
git revert 2h3h23233
HEAD에서 범위를 가져올 수 있습니다. 여기서 1은 "마지막 커밋을 되돌립니다"라고 말합니다.
git revert HEAD~1..HEAD
그런 다음 git Push
을 수행하십시오.
가장 최근 커밋 되돌리기 :
git reset --hard HEAD
HEAD
은 현재 분기의 현재 커밋 (최신)에 대한 참조입니다. 주어진 시간에 오직 하나의 HEAD
만있을 수 있습니다.
이전 커밋으로 되돌리기 : 이전 버전을 복원하는 가장 빠른 방법은 reset
명령을 사용하는 것입니다.
# Resets index to former commit
git reset 56e05fced
# Moves pointer back to previous HEAD
git reset --soft [email protected]{1}
# Updates working copy to reflect the new commit
git reset --hard
HEAD 브랜치를 지정된 버전으로 되감습니다. 이 버전 이후의 모든 커밋은 효과적으로 실행 취소됩니다. 귀하의 프로젝트는 그 시점에서와 똑같습니다.
재설정 명령에는 몇 가지 옵션이 있으며, 더 흥미로운 옵션 중 하나는 --soft
플래그입니다. --hard
대신 사용하면 Git은 "실행 취소 된"커밋의 모든 변경 사항을 로컬 수정으로 유지합니다.
이미 언급했듯이 HEAD
분기에서 reset 명령을 사용하는 것은 매우 과감한 조치입니다. 지정된 개정판 이후에 커밋 된 모든 커밋을 제거합니다. 이것이 당신이 원하는 것이라면 모든 것이 좋습니다.
그러나 현재 HEAD브랜치를 그대로 두는 것을 선호 할 경우에 대비하여 안전한 방법도 있습니다. "branch"는 Git에서 매우 저렴하고 쉽게 사용할 수 있기 때문에 이전 버전에서 시작하는 새 분기를 쉽게 만들 수 있습니다.
git checkout -b old-project-state 0ad5a7a6
일반적으로 checkout 명령은 분기를 전환하는 데 사용됩니다. 그러나 -b 매개 변수를 제공하면 새 분기 (이 예제에서는 old-project-state 라는 이름)를 만들 수 있습니다. 현재 HEAD 버전에서 시작하지 않으려면 복원 할 이전 프로젝트 개정판 인 커밋 해시를 제공해야합니다.
이제 다른 커밋이나 분기를 건드 리거나 제거하지 않고도 프로젝트의 이전 버전을 반영하여 old-project-state 라는 새 분기를 갖게되었습니다.
상황이 긴급이고 프로젝트가 "my project"디렉토리에 있다고 가정하면 질문자가 quick and dirty 방식으로 요청한 것을 수행하려고합니다.
전체 디렉토리를 복사하고 "my project-copy"와 같은 다른 디렉토리로 부릅니다.
해야 할 것:
git reset --hard [first-4-letters&numbers-of-commit's-SHA]
그런 다음 시스템에 두 가지 버전이 있습니다. 이전 커밋에서 관심있는 파일 등을 검사하거나 복사 또는 수정할 수 있습니다. 새 작업이 아무데도 진행되지 않으면 "내 프로젝트-복사"에서 파일을 완전히 버릴 수 있습니다.
검색된 커밋이 있기 때문에 실제로 작업을 버리지 않고 프로젝트의 상태를 계속 유지하려면 분명한 것은 디렉토리의 이름을 다시 바꾸는 것입니다. 검색된 커밋이 포함 된 프로젝트를 삭제하거나 임시 이름을 지정하십시오. 내 프로젝트- "디렉토리를"내 프로젝트 "로 다시 복사하십시오. 그렇다면 아마 곧 또 다른 커밋을 할 것입니다.
힘내는 훌륭한 창조물이지만 "즉시 집어들"수는 없다 : 또한 그것을 설명하려는 사람들 너무 자주 다른 VCS [Version Control Systems]에 대한 사전 지식을 가지고 탐구하다 "체크 아웃"이라는 용어를 바꾸는 것과 같은 다른 범죄를 저지르는 경우도 있습니다. 때때로 초보자를 혼동시키기 위해 계산되는 것처럼 보입니다.
스트레스를 많이 줄이려면 Git에 관한 책을 읽어야합니다. "Git Version Control" . 그리고 "해야 할 것"이라고 말할 때 저 (또는 오히려 내 흉터)를 믿을 수 있다면, 그렇게 할 수도 있습니다. NOW =. Git의 복잡성 대부분은 브랜칭 후 다시 발생합니다. 그러나 당신의 질문에는 사람들이 과학으로 당신을 눈 멀게 할 이유가 없습니다가 있습니다.
특히, 예를 들어 이것이 절박한 상황이고 Git의 초보자라면!
추신 : 다른 생각 : 실제로 Git 저장소 ( "repo")를 작업 파일이있는 디렉토리가 아닌 다른 디렉토리에 보관하는 것은 실제로 매우 간단합니다. 이것은 위의 빠르고 더러운 솔루션을 사용하여 전체 Git 저장소를 복사하지 않아도됨을 의미합니다. --separate-git-dir here 를 사용하여 Fryer의 답변을 참조하십시오. 경고, 그러나 : 복사하지 않는 "분리 된 디렉토리"저장소가 있고 강제 재설정을 수행하면 재설정 커밋 이후의 모든 버전은 영구적으로 손실됩니다. 절대적으로 필요에 따라 저장소를 정기적으로 백업하는 것이 좋으며 다른 곳 중에서도 클라우드 (예 : Google Drive )입니다.
이 "클라우드로 백업"이라는 주제에서 다음 단계는 GitHub 또는 (나의 관점에서 더 나은) GitLab으로 계정을 개설하는 것입니다. 그런 다음 정기적으로 git Push
명령을 수행하여 Cloud 저장소를 "적절하게"백업 할 수 있습니다. 그러나 다시 말하지만, 이것에 대해 너무 빨리 이야기 할 수 있습니다.
원하는 커밋으로 재설정 해보십시오.
git reset <COMMIT_ID>
(COMMIT_ID를 확인하려면 git log
를 사용하십시오)
이렇게하면 변경된 모든 파일이 추가되지 않은 상태로 재설정됩니다.
이제 모든 추가되지 않은 파일을 checkout
할 수 있습니다.
git checkout .
변경 사항을 확인하려면 git log
를 확인하십시오.
업데이트
Repo에서 유일한 커밋이있는 경우
git update-ref -d HEAD
주의! 이 커맨드는 사용자가 잘못 커밋 한 경우 커밋 기록을 잃을 수 있습니다. 항상 git의 여분의 백업을 가지고 있어야합니다. 실수로 실수를 저지를 경우를 대비해서, 조금 더 안전 할 것입니다. :)
비슷한 문제가 있었고 이전 커밋으로 되돌아 가고 싶었습니다. 내 경우에는 새로운 커밋을 유지하기 위해 intetessered하지 않았으므로 나는 Hard
을 사용했습니다.
이것이 내가 한 일이다.
git reset --hard CommitId && git clean -f
이것은 로컬 저장소에서 되돌릴 것이며, git Push -f
를 사용하면 원격 저장소가 업데이트됩니다.
git Push -f
커밋이 원격으로 푸시됨에 따라 커밋을 제거해야합니다. 당신의 지점이 개발 중이며 그것이 Origin으로 푸시되었다고 가정합시다.
먼저 Origin에서 개발을 제거해야합니다.
git Push Origin :develop (note the colon)
그런 다음 당신이 원하는 상태로 발전 할 필요가 있습니다. 커밋 해시가 EFGHIJK라고 가정 해 봅시다.
git reset --hard EFGHIJK
마지막으로 푸시가 다시 개발됩니다.
git Push Origin develop
마지막 커밋에서 어떤 에러를 정정하고자한다면 좋은 대안은 git commit --amend command를 사용하는 것이다. 마지막 커밋이 어떤 참조에 의해서도 가리키고 있지 않으면, 이것은 마지막 커밋과 같은 부모를 가진 커밋을 생성하기 때문에 트릭을 수행 할 것이다. 마지막 커밋에 대한 참조가 없다면, 단순히 폐기되고이 커밋이 마지막 커밋이됩니다. 이는 커밋을 되 돌리지 않고 커밋을 수정하는 좋은 방법입니다. 그러나 그것은 그것의 자신의 한계가 있습니다.
먼저, 어떤 날짜에 커밋을 식별하는 문자열을 얻습니다.
git rev-list -n 1 --before="2009-07-27 13:37" Origin/master
커밋 식별자를 출력하고 문자열 (예 : XXXX)을 가져 와서 다음을 수행합니다.
git checkout XXXX
롤백 (또는 되돌리기) :
- git revert --no-commit "커밋 코드 제거"HEAD (예 : git revert --no-commit d57a39d HEAD)
- 자식 커밋
- git 푸시
위의 두 단계를 시도해보고 이것이 원하는 경우 git Push를 찾으십시오.
잘못된 것을 발견하면 다음을 수행하십시오.
자식 되돌리기 - 녀석
SourceTree 를 사용하면 훨씬 쉽게 작업을 수행 할 수 있습니다. 찾고자하는 커밋을 마우스 오른쪽 버튼으로 클릭하고 메뉴에서 '체크 아웃'을 선택하십시오.
또 다른 간단한 해결책; 이 작업을 수행하려면 지점을 변경해야하지만 이후에는 다음을 실행할 수 있습니다.
git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
어떤 이유로 수동으로 광산을 되돌릴 수 없으므로 여기에서 광산을 끝내는 방법이 있습니다.
git reflog
Git reflog의 HEAD 수를 선택하십시오. 여기서 되돌리려 고 할 곳을 선택하십시오 (이 예에서는 12를 선택합니다).
git reset [email protected]{12} --hard
분기를 특정 커밋으로 되돌리려면 내가 찾은 내역을 변경할 수없는 가장 복잡한 방법은 다음과 같습니다.
예를 들면 :
echo 'ref: refs/heads/example' > .git/HEAD
Git status 명령을 사용하면 현재 실행중인 브랜치와 되돌리려는 브랜치 사이의 모든 변경 사항을 볼 수 있습니다.
모든 것이 잘되면 당신은 커밋을 할 수 있습니다. git diff revert..example을 사용하여 동일 함을 확인할 수도 있습니다.
변경 사항을 일시적으로 되돌리려는 경우
Git log를 사용하여 마지막으로 작업 한 커밋을 검색 한 다음 실행할 수 있습니다.
git rebase --onto <commitId>
원격 지점이 다시 작동하면 다음을 수행 할 수 있습니다.
git pull --rebase
이 방법은 분리 된 상태가 아니기 때문에 git checkout보다 임시 변경 사항이 더 좋습니다.
단계별 변경 사항 및 커밋 재설정
git reset
명령을 사용하면 작업 트리가 가리키는 가장 최근의 커밋 인 HEAD를 저장소로 변경할 수 있습니다. 스테이징 영역 또는 스테이징 영역과 작업 트리를 수정합니다. Git이 당신이 원하는 것과 똑같이 커밋을 만드는 기능은 git add 명령을 사용하여 수행 한 변경 사항의 변경 사항을 취소해야하는 경우가 있음을 의미합니다. git reset HEAD <file to change>
를 호출하여이를 수행 할 수 있습니다. 변경 사항을 완전히 없애는 두 가지 옵션이 있습니다. git checkout HEAD <file(s) or path(s)>
은 준비 영역 및 작업 트리에 대한 변경 사항을 신속하게 취소 할 수있는 방법입니다. 그러나 작업 트리의 모든 변경 사항이 제거되므로이 명령을주의하십시오. 힘내는 결코 커밋되지 않았기 때문에 그 변화에 대해 알지 못한다. 이 명령을 실행하면 변경 사항을 되돌릴 방법이 없습니다. 처리 할 수있는 또 다른 명령은 git reset --hard
입니다. 그것은 작업 트리에 동등하게 파괴적입니다. 커밋되지 않은 변경이나 단계적 변경은 실행 후 손실됩니다. git reset -hard
HEAD는 git checkout HEAD와 동일한 작업을 수행합니다. 파일이나 경로가 작동하지 않아도됩니다. git reset과 함께 --soft
를 사용할 수 있습니다. 저장소를 지정한 커밋으로 재설정하고 모든 변경 사항을 단계적으로 수행합니다. 이미 수행 한 변경 사항은 영향을받지 않으며 작업 트리의 변경 사항도 없습니다. 마지막으로 --mixed
를 사용하여 변경 사항을 준비하지 않고 작업 트리를 재설정 할 수 있습니다. 또한 변경된 모든 변경 사항을 취소합니다.
되돌리기 커밋
때때로 우리는 실수를합니다. 공유되지 않아야하는 커밋은 공개 저장소로 푸시되고 커밋에는 해결할 수 없으며 실행 취소해야하는 버그가 있거나 어쩌면 더 이상 해당 코드가 필요하지 않을 수도 있습니다. 이러한 모든 경우 git revert
를 요구하십시오. git revert
명령은 여러분이 기대하는 바를 수행합니다. 히스토리에 역방향 커밋을 적용하여 단일 커밋을 되돌립니다. 가끔은 여러 커밋을 되돌려 변경을 완전히 취소해야합니다. -no-commit
를 사용할 수도 있고, -n
를 사용하여 Git에게 되돌리기를 지시 할 수도 있지만, 변경을 저지하는 것을 멈출 수는 있습니다. 이렇게하면 모든 되돌리기 커밋을 하나의 커밋으로 결합 할 수 있습니다. 이는 여러 커밋에 걸쳐있는 기능을 되돌려 야 할 때 유용합니다. 커밋을 역순으로 되돌 리도록하십시오. 가장 새로운 커밋이 먼저옵니다. 그렇지 않으면, 아직 존재하지 않는 코드를 되돌리려 고 함으로 Git을 혼란스럽게 할 수 있습니다.