source

Git 저장소를 이전 커밋으로 되돌리려면 어떻게 해야 합니까?

nicesource 2023. 5. 4. 20:03
반응형

Git 저장소를 이전 커밋으로 되돌리려면 어떻게 해야 합니까?

현재 상태에서 특정 커밋 시 스냅샷으로 되돌리는 방법은 무엇입니까?

내가 하면,git log그러면 다음과 같은 출력이 표시됩니다.

$ 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.

즉 commit 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를 사용하면 revert는 매우 구체적인 의미를 가집니다. 즉, 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

페이지는 실제로 이것의 많은 부분을 설명에서 다루고 있습니다.또 다른 유용한 링크는 git-timeout에 대해 논의하는 이 git-scm.com 섹션입니다.

결국 되돌리기를 원하지 않는다고 결정한 경우에는 되돌리기(여기서 설명) 또는 되돌리기 전으로 재설정할 수 있습니다(이전 섹션 참조).

은 이에 이 이 될 : 경 우 같 답 도 될 수 있 니 습 다 이 움 이 이 변 에 도 다 음 은 과 다 니 있 습 ▁you ▁helpful 수 이 될 ▁find▁this ▁answer
HEAD를 이전 위치로 다시 이동하려면 어떻게 해야 합니까?(헤드 분리) & 커밋 실행 취소

여기에는 복잡하고 위험한 답변이 많지만 실제로는 쉽습니다.

git revert --no-commit 0766c053..HEAD
git commit

이렇게 하면 HEAD에서 커밋 해시로 모든 내용이 되돌아갑니다. 즉, 모든 커밋 후에 작업 트리에서 커밋 상태를 다시 생성합니다.0766c053뒤로 걸어갔었습니다.그런 다음 현재 트리를 커밋하면 기본적으로 "복귀"한 커밋과 동등한 새로운 커밋이 생성됩니다.

(계속)--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 HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

# Push your changes to respective branch
git push -f

크레딧은 유사한 스택 오버플로 질문인 Git의 SHA 해시에 의한 커밋으로 되돌리십시오.

저와 다른 사람들에게 가장 좋은 옵션은 Git reset 옵션입니다.

git reset --hard <commitId> && git clean -f

이것은 나에게 최고의 선택이었습니다!그것은 간단하고, 빠르고, 효과적입니다!


참고:댓글에 언급된 것처럼 이전 커밋의 복사본을 가진 다른 사용자와 브랜치를 공유하는 경우에는 이 작업을 수행하지 마십시오.

또한 댓글에서, 만약 당신이 덜 '볼리'한 방법을 원한다면 당신은 사용할 수 있습니다.

git clean -i

참고: 이것은 많은 관심을 받고 있습니다. 다른 사용자가 작업하는 분기에서 작업하는 경우에는 마스터와 병합된 하나의 원격이 아니라(시간 범위에 따라) 이 작업을 수행하지 않는 것이 매우 중요합니다. 지옥에 떨어질 겁니다.

대답하기 전에 배경 설명을 추가해 보겠습니다.HEAD사실은.

먼저 HEAD는 무엇입니까?

HEAD는 현재 분기의 현재 커밋(커밋)에 대한 단순한 참조입니다. 있을 수 .HEAD든지 (단 언든제지외(제제)) 제외)git worktree).

HEAD는 내에저다니됩 에 저장됩니다..git/HEAD현재 커밋의 40바이트 SHA-1 해시가 포함되어 있습니다.


detached HEAD

최신 커밋에 참여하지 않은 경우 - 즉,HEAD역사상 이전의 커밋을 가리키고 있습니다.

분리된 HEAD의 개념을 보여주는 다이어그램

에서는 "SHA-1" "됩니다. - "SHA-1 해시".HEAD분기의 있지 . 즉, 다음과 같습니다.

터미널에서 git checkout HEAD^0 실행 중


분리된 HEAD에서 복구하는 방법에 대한 몇 가지 옵션:


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 HEAD@{...}

원하는 커밋으로 돌아갑니다.

터미널에서 Git reflog 실행


git reset HEAD --hard <commit_id>

HEAD원하는 커밋으로 돌아갑니다.

# 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 && checkout를 수정합니다.HEAD.

준비 영역 및 HEAD 체크아웃을 보여주는 다이어그램

다음 두 가지 명령을 사용하여 이 작업을 수행할 수 있습니다.

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

이전 Git 커밋이 제거됩니다.

변경사항을 유지하려면 다음을 사용할 수도 있습니다.

git reset --soft [previous Commit SHA id here]

그러면 변경 내용이 저장됩니다.

마지막 커밋 메시지를 지우고 수정된 파일을 스테이징으로 되돌리려면 다음 명령을 사용합니다.

git reset --soft HEAD~1
  • --soft 파일을 을 나타냅니다.--hard그들을 버리게 될 것입니다.
  • HEAD~1마지막 커밋입니다. 3 커밋을 할 수 .HEAD~3특정 리비전 번호로 롤백하려는 경우 해당 SHA 해시를 사용하여 롤백할 수도 있습니다.

이 명령은 잘못된 작업을 수행하여 마지막 커밋을 실행 취소하려는 경우에 매우 유용합니다.

출처: http://nakkaya.com/2009/09/24/git-delete-last-commit/

가장 좋은 방법은 다음과 같습니다.

git reset --hard <commidId> && git push --force

이렇게 하면 분기가 특정 커밋으로 재설정된 다음 로컬에서와 동일한 커밋으로 원격 서버를 업로드합니다.

를 조심하세요.--force플래그를 지정하면 선택한 커밋 후에 해당 커밋을 복구하는 옵션 없이 모든 후속 커밋이 제거됩니다.

Git의 로컬 변경을 되돌리기 위해 많은 방법을 시도해 보았는데, 최신 커밋 상태로 되돌리려면 이 방법이 가장 효과적인 것 같습니다.

git add . && git checkout master -f

간단한 설명:

  • . 커밋을 생성하지 않습니다.git revert 그렇습니다.
  • 그것은 당신의 머리를 이렇게 떼어놓지 않을 것입니다.git checkout <commithashcode> 그렇습니다.
  • 모든 로컬 변경사항을 재정의하고 분기의 마지막 커밋 이후 추가된 모든 파일을 삭제합니다.
  • 분기 이름에서만 작동하므로 이러한 방식으로 분기의 최신 커밋으로만 되돌릴 수 있습니다.

위의 결과를 얻을 수 있는 훨씬 더 편리하고 간단한 방법을 찾았습니다.

git add . && git reset --hard HEAD

HEAD는 현재 지점에서 최근 커밋을 가리킵니다.

제안한 하지만 boulder_ruby를 했습니다.git add . 앞에git reset --hard HEAD마지막 커밋 이후 생성된 모든 새 파일을 지우는 것은 대부분의 사람들이 최근 커밋으로 되돌릴 때 기대하는 것이기 때문입니다.

좋아요, Git의 이전 약속으로 돌아가는 것은 꽤 쉽습니다.

변경 사항을 유지하지 않고 되돌리기:

git reset --hard <commit>

변경 사항을 유지한 상태로 되돌립니다.

git reset --soft <commit>

설명: 사용git reset특정 상태로 재설정할 수 있습니다.위와 같이 커밋 해시와 함께 사용하는 것이 일반적입니다.

처럼 두 하는 것이 차이점입니다.--soft그리고.--hardgit reset용사를 --soft플래그, 하지만 항상 플래그를 사용하는 것이 좋습니다. 각 플래그에 대해 설명합니다.


--부드러운

설명된 기본 플래그(제공할 필요는 없음)는 작업 트리를 변경하지 않지만 커밋할 준비가 된 모든 변경된 파일을 추가하므로 파일의 변경 내용이 스테이징되지 않는 커밋 상태로 돌아갑니다.


--힘든

이 깃발을 조심하세요.그러면 작업 트리가 재설정되고 모든 변경 사항이 추적된 파일로 재설정되고 모든 변경 사항이 사라집니다.


저는 또한 Git와 함께 일하면서 실제 생활에서 일어날 수 있는 아래의 이미지를 만들었습니다.

커밋으로 Git 재설정

마스터 및 해당 분기(즉, 해당 분기가 관련된 모든 작업 분기일 수 있음)에 대해 이야기한다고 가정하면 다음과 같습니다.

# 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

블로그 게시물에서 답을 찾았습니다(현재는 더 이상 존재하지 않음)

팀의 다른 구성원이 이미 전원을 끈 경우 문제가 발생할 수 있도록 원격으로 변경 내용을 재설정하고 강제 적용하는 것입니다.당신은 변화의 역사를 파괴하고 있으며, 이것은 사람들이 처음에 깃을 사용하는 중요한 이유입니다.

재설정보다는 되돌리기(다른 답변 참조)를 사용하는 것이 좋습니다.만약 당신이 원맨 팀이라면, 그것은 아마도 중요하지 않을 것입니다.

제프로미의 해결책에 대한 추가적인 대안

Jefromi의 솔루션은 확실히 최고이며, 당신은 그것들을 반드시 사용해야 합니다.하지만, 완전성을 위해, 저는 또한 커밋을 되돌리는 데 사용할 수 있는 다른 대안적인 해결책을 보여주고 싶었습니다(당신이 이전 커밋의 변경을 취소하는 새로운 커밋을 만든다는 의미에서).git revert).

분명히 하자면, 이러한 대안들이 커밋을 되돌리는 최선의 방법은 아니지만, 제프로미의 솔루션은 그렇습니다. 하지만 저는 여러분이 다음과 같은 것을 달성하기 위해 이러한 다른 방법들도 사용할 수 있다는 것을 지적하고 싶습니다.git revert.

대안 1: 하드 및 소프트 재설정

이것은 Git에서 SHA 해시에 의한 커밋으로 되돌리기 위한 Charles Bailey의 솔루션의 매우 약간 수정된 버전입니다.

# 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>"

이는 기본적으로 소프트 재설정이 인덱스/스테이지 영역에서 준비된 이전 커밋 상태를 그대로 유지하므로 커밋할 수 있습니다.

대안 2: 현재 트리 삭제 및 새 트리로 바꾸기

이 솔루션은 이전 커밋을 체크아웃하고 새 커밋으로 만드는 svick의 솔루션에서 제공됩니다.

git rm -r .
git checkout <commit> .
git commit

대안 #1과 유사하게, 이것은 다음의 상태를 재현합니다.<commit>현재 작업 복사본에서. 할 가 있습니다.git rm 이유는 째첫이는 때문입니다.git checkout이후 추가된 파일을 제거하지 않습니다.<commit>.

에 다음과 같은 해 보세요.~/commits-to-revert.txt(사용했습니다.git log --pretty=oneline그들을 구함)

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

Bash 셸 스크립트를 생성하여 각 스크립트를 되돌립니다.

#!/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>내가 할 수 있는 일이 아닙니다.

다음은 이전 커밋으로 돌아가는 훨씬 간단한 방법입니다(그리고 커밋되지 않은 상태에서 원하는 것을 사용할 수 있습니다).

git reset HEAD~1

따라서 커밋 ID 등이 필요하지 않습니다 :)

주의!사용자가 잘못된 커밋을 잘못 입력한 경우 이 명령으로 커밋 기록이 손실될 수 있습니다.실수할 경우를 대비하여 항상 다른 곳에 여분의 깃 백업을 준비하십시오.:)

저도 비슷한 문제가 있어서 이전의 약속으로 돌아가고 싶었습니다.나의 경우, 나는 새로운 커밋을 유지하는 것에 관심이 없어서 사용했습니다.Hard.

제가 한 일은 다음과 같습니다.

git reset --hard CommitId && git clean -f

서 사용후저및여복기구다니됩을 사용한 됩니다.git push -f원격 리포지토리를 업데이트합니다.

git push -f

예를 들어, 이름이 있는 커밋을 완전히 무시하려는 경우enforce non-group manage policies

여기에 이미지 설명 입력

당신은 도망칠 것입니다.

git reset --hard dd52eb9 && git clean -f

다음에

git push -f

에는 커밋commit)이 enforce non-group manage policies서)

여기에 이미지 설명 입력

이러한 모든 초기 단계를 직접 완료하고 Git 저장소로 다시 밀어넣을 수 있습니다.

  1. 하여 최신 .git pull --all지휘권

  2. 을 Gitlog 명합다와 함께 합니다.-n 4당신의 터미널에서. 뒤의 -n로컬 기록의 가장 최근 커밋에서 시작하여 로그의 커밋 수를 결정합니다.

    $ git log -n 4
    
  3. 다을사여리기록헤재정설을 합니다.git reset --hard HEAD~N여기서 N은 머리를 원래 상태로 되돌리려는 커밋 수입니다.다음 예제에서는 헤드를 리포지토리 기록의 마지막 커밋으로 한 커밋 뒤로 설정합니다.

  4. 여용하변푸경내시용로장을 사용하여 Git git push --force변화를 강요하는 것.

Git 저장소를 이전 커밋으로 설정하려면 다음을 수행합니다.

git pull --all
git reset --hard HEAD~1
git push --force

되돌리기는 커밋을 롤백하는 명령입니다.

git revert <commit1> <commit2> 

샘플:

git revert 2h3h23233

아래와 같이 HEAD로부터 거리를 취할 수 있습니다.여기서 1은 "마지막 커밋 되돌리기"입니다.

git revert HEAD~1..HEAD

다음을 수행합니다.

git push

모든 변경 후 이러한 명령을 모두 푸시할 때 다음을 사용해야 할 수 있습니다.

git push -f ...

뿐만아 만 아니라 니라라.git push.

특히 이전 커밋을 되돌리고 스테이징하기 위한 명령(코어 Git의 일부는 아니지만 git-extra 패키지에 있음)이 있습니다.

git undo

man 페이지에 따라 다음과 같은 용도로도 사용할 수 있습니다.

# Remove the latest three commits
git undo 3

상황이 긴급한 경우 질문자가 요청한 내용을 빠르고 더러운 방법으로 수행하려면 프로젝트가 "내 프로젝트"라는 디렉토리 아래에 있다고 가정합니다.


빠르고 더럽습니다. 상황에 따라 빠르고 더럽다는 것이 실제로 매우 좋을 수도 있습니다.여기서 제 솔루션이 하는 일은 당신의 작업 디렉토리에 있는 파일을 당신의 .git/디렉토리 아래 숨어있는 git 저장소의 깊이에서 끌어 올리거나 추출한 파일로 되돌릴 수 없이 대체하는 것이 아닙니다. git/디렉토리에는 매우 영리하고 악마처럼 강력한 git 명령어가 많이 있습니다.당신은 재앙적인 상황으로 보이는 것을 회복하기 위해 그러한 심해 다이빙을 할 필요가 없으며, 충분한 전문 지식 없이 시도하는 것은 치명적일 수 있습니다.


  1. 전체 디렉토리를 복사하고 "내 프로젝트 - 복사"와 같은 다른 이름으로 부릅니다.git 저장소("repo") 파일이 "my project" 디렉터리(기본 위치, ".git"라는 디렉터리) 아래에 있다고 가정하면 이제 작업 파일과 repo 파일을 모두 복사할 수 있습니다.

  2. 디렉토리 "my project"에서 이 작업을 수행합니다.

     .../my project $ git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

이렇게 하면 "내 프로젝트" 아래의 평판 상태가 커밋할 때의 상태로 돌아갑니다("커밋"은 작업 파일의 스냅샷을 의미합니다). " ▁the" reset테드의 약속은 "내 프로젝트"에 따라 영원히 사라질 것입니다. 하지만....../.git/ 아래의 repo에 있는 파일을 포함하여 모든 파일을 복사했기 때문에 "내 프로젝트 - 복사" 아래의 repo에 있습니다.

그런 다음 시스템에 두 가지 버전이 있습니다.이전 커밋에서 관심 있는 파일 또는 기타 파일을 검사, 복사 또는 수정할 수 있습니다."내 프로젝트 - 복사"에 있는 파일을 완전히 폐기할 수 있습니다. 복원된 커밋이 사라졌기 때문에 새 작업을 결정했다면...

이 검색된 커밋으로 인해 실제로 작업을 취소하지 않고 프로젝트 상태를 계속하려면 디렉터리 이름을 다시 변경해야 합니다.검색된 커밋이 포함된 프로젝트를 삭제하고(또는 임시 이름을 지정) "내 프로젝트 - 복사" 디렉토리의 이름을 다시 "내 프로젝트"로 변경합니다.그런 다음 여기에 있는 다른 대답들을 이해하려고 노력하고, 아마도 곧 다른 약속을 할 것입니다.

Git은 훌륭한 창조물이지만 아무도 그냥 "즉시 습득"할 수 없습니다. 또한 너무 많이 설명하려고 하는 사람들은 종종 다른 VCS [버전 제어 시스템]에 대한 사전 지식을 가정하고 너무 빨리 너무 깊이 파고들어 다른 끔찍한 범죄를 저지릅니다."체크아웃"을 위해 교환 가능한 용어를 사용하는 것과 같은 - 때때로 초보자를 혼란스럽게 하기 위해 거의 계산된 것처럼 보이는 방식.

스트레스를 많이 줄이기 위해서, 제 상처에서 배우세요.당신은 깃에 관한 책을 거의 읽어야 합니다 - 저는 더 북, 프로 2판을 읽는 것을 추천합니다: 깃 센트럴에서 무료 다운로드 이 가능합니다.2014년에 출판되었지만, 2022년 초에 여전히 최고입니다.그것을 늦기보다는 빨리 하라: Git은 지금부터 여러분의 삶의 일부가 될 운명입니다.만약 그렇다면, Git의 복잡성의 대부분은 분기된 다음 다시 떠오르는 것에서 비롯된다는 것을 기억하세요: Pro Git 책은 실제로 이 중심적인 측면을 매우 부드럽게 소개하지만, 여러분은 첫 번째 읽었을 때 어떤 책이든 그 부분들을 건너뛸 수 있습니다.당신의 질문으로부터, 사람들이 과학으로 당신을 눈멀게 해야이유는 없습니다.

특히, 예를 들어, 이것이 절망적인 상황이고 당신이 Git의 신입이라면!

PS: (약간의 주의) 다른 생각:Gitrepo를 작업 파일이 있는 디렉토리가 아닌 다른 디렉토리에 보관하는 것은 실제로 매우 간단합니다.이는 위의 빠르고 더러운 솔루션을 사용하여 전체 Git 저장소를 복사하지 않는다는 것을 의미합니다.다음을 사용하여 Fryer의 답변 보기--separate-git-dir 여기 있습니다. 그것을 염두에 두고, 경고합니다.복사하지 않는 "별도의 디렉터리" 저장소가 있고 하드 리셋을 수행하는 경우, 저장소를 정기적으로 백업하지 않는 한 재설정 커밋 이후의 모든 버전은 영구적으로 손실됩니다(예: Google Drive).

다음 단계는 "클라우드 백업"이라는 주제로 GitHub 또는 GitLab에 계정(물론 무료)을 개설하는 것입니다.그러면 정기적으로 다음 작업을 수행할 수 있습니다.git push명령어를 사용하여 클라우드를 "적절하게" 최신 상태로 복원할 수 있습니다.하지만 다시 말하지만, 이것에 대해 이야기하는 것은 너무 빠를 수도 있습니다.git push구성해야 하며, 완전히 이해하기 어려운 기술적 이유로 작동하지 못할 수 있으며, 원격 저장소("message" 등)에 대해 학습해야 합니다.따라서 지식을 쌓을 때까지 빠르고 더러운 클라우드 기반 백업 방식이 선호될 수 있습니다.다시 ProGit 책에서는 원격 저장소의 작동 방식과 로컬 저장소와의 관계를 매우 부드럽고 합리적으로 소개합니다.

원하는 커밋으로 재설정해 보십시오.

git reset <COMMIT_ID>

확기하를 확인하는 COMMIT_ID매개 변수:

git log

이렇게 하면 변경된 모든 파일이 추가되지 않은 상태로 재설정됩니다.

이제 할 수 있습니다.checkout추가되지 않은 모든 파일

git checkout .

변경 내용을 확인하려면 다음을 사용합니다.

git log

갱신하다

보고서에 커밋이 하나만 있다면 시도해 보십시오.

git update-ref -d HEAD

필요한 커밋을 선택하고 다음 기준으로 확인합니다.

git show HEAD
git show HEAD~1
git show HEAD~2 

필요한 커밋을 얻을 때까지.HEAD가 이 점을 가리키도록 하려면 다음을 수행합니다.

git reset --hard HEAD~1

또는git reset --hard HEAD~2뭐 그런 거.

최근 커밋으로 되돌리고 모든 로컬 변경 사항을 무시합니다.

git reset --hard HEAD

아이디어: 기본적으로 현재 작업 트리 상태를 이전 커밋의 상태로 바꾼 다음 커밋을 생성합니다.무시된 파일은 변경하지 않는 것이 좋습니다.방법은 다음과 같습니다.

  1. 작업 트리를 비웁니다 *.

     git rm -r --cached . && git clean -f -d
    
  2. 우리가 원하는 상태로 작업 트리를 가져오세요 **.

     git checkout 0d1d7fc3 .
    
  3. 되돌리기 커밋을 만듭니다.

     git add --all && git commit -m "revert to 0d1d7fc3"
    

처음에는 야린스의 답변이 가장 좋을 것이라고 생각했지만 병합 커밋에는 적용되지 않습니다.이 솔루션은 가능합니다.

또한 기록에서 아무 것도 삭제하지 않습니다(푸시 또는 푸시).그것은 우리가 되돌리고 싶은 상태를 나타내는 하나의 깨끗한 커밋을 생성합니다.


작업 트리에서 추적되지는 않았지만 무시되지는 않은 파일(.gitignore에 지정된 파일)을 제거합니다.보관하려는 무시된 파일(지정하지 않은 경우)을 제외하고 작업 트리가 비어 있습니다.-x을 선택할 수 .clean)

경가지여경우된정서기로여(경우:▁when▁a▁is서:▁path기here:.그대로 .), 체크아웃은 다음과 같습니다.

이것은 최근 커밋으로 직접 재설정하는 또 다른 방법입니다.

git stash
git stash clear

마지막으로 커밋한 이후에 수행한 모든 변경 내용을 직접 지웁니다.

PS: 약간의 문제가 있습니다. 또한 최근에 저장한 모든 스택 변경사항을 삭제합니다.대부분의 경우에는 중요하지 않을 것 같습니다.

실수로 변경된 사항을 완전히 제거하기 위해 다음을 사용했습니다.

git add -A .
git reset --hard HEAD

그저.git reset --hard HEAD수정 사항은 제거되지만 "새" 파일은 제거되지 않습니다.임의의 그 파일들은 에 의해 에, a 그의경우로어, 들그은중폴갔끌고더고, 에파은들모일든의취그해있 다니되습었고새급로로으운것들작위무를딘로가한요히연우it▁in▁as▁were▁somewhere다▁their▁a니▁they▁so▁case'습▁being▁an있▁folder▁random에었▁g,고▁and▁by▁all되▁those취급▁new▁treateditd▁g▁files은ally그들▁important로해으들▁draggedreset --hard고치지 않았습니다.git add -A .사전에, 그것은 재설정에 의해 지워지기 위해 깃으로 그들 모두를 명시적으로 추적했습니다.

마스터에서 수행한 커밋된 변경을 롤백하는 방법을 알고 싶어하는 사람들이 있을 수 있습니다. 즉, 모든 것을 버리고 오리진/마스터로 돌아가는 경우 다음과 같이 하십시오.

git reset --hard origin/master

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master

HEAD에 대한 이전 커밋의 변경 내용을 유지하고 이전 커밋으로 이동하려면 다음을 수행합니다.

git reset <SHA>

HEAD에 대한 이전 커밋에서 변경이 필요하지 않고 모든 변경 사항을 취소하는 경우 다음을 수행합니다.

git reset --hard <SHA>

커밋이 원격으로 푸시되므로 커밋을 제거해야 합니다.당신의 지점이 개발되어 있고 원산지가 밀렸다고 가정해 보겠습니다.

먼저 원본에서 개발을 제거해야 합니다.

git push origin :develop (note the colon)

그러면 원하는 상태로 개발해야 합니다, 커밋 해시가 EFG라고 가정하겠습니다.HIJK:

git reset --hard EFGHIJK

마지막으로 개발을 다시 진행합니다.

git push origin develop

마지막 커밋에서 오류를 수정하려면 git commit --amend 명령을 사용하는 것이 좋습니다.마지막 커밋이 참조를 통해 지정되지 않은 경우 마지막 커밋과 동일한 상위 항목으로 커밋을 만들기 때문에 이 작업이 수행됩니다.마지막 커밋에 대한 참조가 없으면 해당 커밋은 삭제되고 이 커밋이 마지막 커밋이 됩니다.이것은 커밋을 되돌리지 않고 커밋을 수정하는 좋은 방법입니다.하지만 그것은 그 나름의 한계가 있습니다.

언급URL : https://stackoverflow.com/questions/4114095/how-do-i-revert-a-git-repository-to-a-previous-commit

반응형