it-swarm-ko.tech

Git 저장소를 이전 커밋으로 되돌리는 방법

현재 상태에서 특정 커밋으로 만들어진 스냅 샷으로 되돌리려면 어떻게해야합니까?

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를 (를) 커밋해야합니다.

6795
Crazy Serb

이것은 "되돌리기"가 의미하는 것에 많이 달려 있습니다.

일시적으로 다른 커밋으로 전환

일시적으로 다시 돌아가서 바보짓을 한 다음 다시 돌아와서 원하는 위치로 돌아 가려는 경우 원하는 커밋을 확인하기 만하면됩니다.

# 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 이전 위치로 이동하는 방법? (분리 된 머리)

8690
Cascabel

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

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

이것은 HEAD에서 커밋 해시로 모든 것을 되돌릴 것입니다. 즉, 작업 트리 에서 커밋 상태를 마치 이후 모든 커밋이 취소되었습니다. 그런 다음 현재 트리를 커밋 할 수 있으며 "revert"한 커밋과 본질적으로 동일한 새로운 커밋을 만듭니다.

(--no-commit 플래그를 사용하면 git은 모든 커밋을 한 번에 되돌릴 수 있습니다. 그렇지 않으면 범위 내의 각 커밋에 대한 메시지가 표시되어 불필요한 새 커밋으로 기록이 흩어집니다.)

이것은 이전 상태로 롤백하는 안전하고 쉬운 방법입니다. 기록이 삭제되지 않으므로 이미 공개 된 커밋에 사용할 수 있습니다.

1512
Yarin

작업 커밋을 가장 최근 커밋으로 되돌리기

변경 사항을 무시하고 이전 커밋으로 되돌리려면 다음을 수행하십시오.

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를 사용하여 커밋으로 되돌립니다..

1451
boulder_ruby

나와 다른 사람들에게 가장 좋은 옵션은 Git 재설정 옵션입니다.

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

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


참고 : 이전 커밋의 복사본을 가진 다른 사람들과 지사를 공유하는 경우 주석에 언급 된 바와 같이

덧붙여 말하자면, 덜 발랄한 방법을 원한다면

git clean -i

182
Pogrindis

대답하기 전에 배경을 추가하고이 HEAD이 무엇인지 설명합니다.

First of all what is HEAD?

HEAD은 현재 분기의 현재 커밋 (최신)에 대한 참조입니다. 주어진 시간에 HEAD이 하나만있을 수 있습니다 (git worktree 제외).

HEAD의 내용은 .git/HEAD 안에 저장되며 현재 커밋의 SHA-1 40 바이트를 포함합니다.


detached HEAD

최신 커밋이 아니라면 - HEAD이 이전 커밋을 가리키고 있다는 것을 의미합니다.detached HEAD.

 Enter image description here

명령 줄에서 HEAD이 현재 분기의 끝을 가리키고 있지 않기 때문에 분기 이름 대신 SHA-1처럼 보입니다.

 Enter image description here


분리 된 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 reflogHEAD을 업데이트 한 변경 사항을 표시하고 원하는 reflog 항목을 체크 아웃하면 HEAD이 다시 커밋됩니다.

HEAD가 수정 될 때마다 reflog

git reflog
git checkout [email protected]{...}

그러면 원하는 커밋으로 되돌아갑니다.

 Enter image description here


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 2.7 이후 ) git rebase --no-autostash도 사용할 수 있습니다.

이 스키마는 어떤 명령이 무엇을하는지 설명합니다. 거기에서 볼 수 있듯이 reset && checkoutHEAD을 수정합니다.

 Enter image description here

143
CodeWizard

"uncommit"하고 마지막 커밋 메시지를 지우고 수정 된 파일을 다시 스테이징에 넣으려면 다음 명령을 사용합니다.

git reset --soft HEAD~1
  • --soft는 커밋되지 않은 파일이 --hard와 반대되는 작업 파일로 유지되어야한다는 것을 나타냅니다.
  • HEAD~1는 마지막 커밋입니다. 3 개의 커밋을 롤백하려면 HEAD~3를 사용할 수 있습니다. 특정 개정 번호로 롤백하려면 SHA hash를 사용하여 수행 할 수 있습니다.

이것은 잘못된 것을 커밋 한 상황에서 매우 유용한 명령이며 마지막 커밋을 실행 취소하려고합니다.

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

124

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를 추가하여 마지막 커밋 이후 작성된 모든 새 파일을 지우므로 대부분의 사람들은 최신 커밋으로 되돌릴 때이를 기대합니다.

105
Roman Minenok

다음 두 명령으로이 작업을 수행 할 수 있습니다.

git reset --hard [previous Commit SHA id here]
git Push Origin [branch Name] -f

이전 Git 커밋을 제거합니다.

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

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

그런 다음 변경 사항을 저장합니다.

94
kiran boghra

OK, git에서 이전 커밋으로 돌아가는 것은 아주 쉽다 ...

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

git reset --hard <commit>

되돌리기 유지 변경 :

git reset --soft <commit>

Explain : git reset을 사용하면 특정 상태로 재설정 할 수 있습니다. 위에서 보았 듯이 커밋 해시와 함께 사용하는 것이 일반적입니다.

그러나 차이점은 --soft--hard 두 플래그를 git reset 플래그를 사용하여 기본적으로 --soft 사용하고 있지만 항상 플래그를 사용하는 것이 좋습니다. 각 플래그에 대해 설명합니다.


--부드러운

설명 된대로 기본 플래그는 작업 트리를 변경하지 않고 커밋 할 준비가 된 모든 변경 사항 파일을 추가하므로 파일 변경이 커지면 커밋되지 않은 상태로 돌아갑니다.


--단단한

이 플래그를주의해서 작업 트리와 모든 변경 사항을 추적 된 파일로 재설정하면 모두 사라집니다!


나는 또한 git로 작업하면서 실제로 일어날 수있는 이미지를 아래에 만들었다.

 git reset to a commit

63
Alireza

이 정확한 조합을 제외하고는 아무 것도 나를 위해 일하지 않았습니다.

git reset --hard <commit_hash>
git Push Origin <branch_name> --force

여기서 중요한 것은 푸시를 강제하는 것입니다. 추가 커밋/커밋 메시지 등은 없습니다.

59
serdarsenay

~/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>을 가지고 있지 않습니다.

57
Lance Caraccioli

Jefromi의 솔루션에 대한 추가 대안

Jefromi의 솔루션 는 확실히 최고의 솔루션이므로 반드시 사용해야합니다. 그러나 완전성을 기하기 위해 커밋을 되돌릴 때 사용할 수있는 다른 대안 솔루션을 보여주고 싶었습니다 ( 이전 커밋의 변경 사항을 취소하는 새로운 커밋을 만듭니다 , git revert의 기능과 동일).

분명히, 이러한 대안 은 커밋을 되 돌리는 가장 좋은 방법은 아닙니다 , Jefromi의 솔루션은 , 하지만 다른 방법을 사용하여 git revert와 같은 것을 달성 할 수 있다고 지적하고 싶습니다.

대안 1 : 하드 및 소프트 리셋

이것은 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>"

이것은 기본적으로 소프트 리셋이 이전 커밋 상태를 인덱스/스테이징 영역에서 단계적으로 남겨두고 커밋 할 수 있다는 사실을 사용하여 작동합니다.

대안 2 : 현재 트리를 삭제하고 새 트리로 교체

이 솔루션은 svick의 솔루션에서 이전 커밋을 체크 아웃하고 새로운 커밋으로 만듭니다 :

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

대안 # 1과 마찬가지로 현재 작업 복사본에서 <commit> 상태를 재현합니다. git rm은 (는) git checkout 이후에 추가 된 파일을 제거하지 않으므로 <commit>을 (를) 먼저 수행해야합니다.

56
user456814

당신이 주인에 대해 이야기하고 있다고 가정하면, 해당 지점에서 (즉, 이것은 당신이 관심을 갖고있는 일하는 지점이 될 수 있습니다) :

# 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을 당긴 경우 문제가 발생할 수 있습니다. 당신은 변화의 역사를 파괴하고 있습니다. 이것은 사람들이 왜 자식을 사용하는지에 대한 중요한 이유입니다.

재설정보다 복귀 (다른 답변 참조)를 사용하는 것이 좋습니다. 만약 당신이 한 사람의 팀이라면 아마도 상관 없습니다.

55
markreyes

여기에 훨씬 간단합니다 이전 커밋으로 돌아가는 방법 (그리고 커밋되지 않은 상태에서 원하는대로 할 수 있습니다) :

git reset HEAD~1

그래서, 커밋 ids 등등에 대한 필요가 없습니다 :)

51
Paul Walczewski

모든 변경 후, 당신이 모든 명령을 밀어 때, 당신은 사용해야 할 수도 있습니다 :

git Push -f ...

뿐만 아니라 git Push.

34
sivi

구 명령을 되 돌리거나 스테이징하기위한 커맨드가 있습니다 (코어 커밋의 일부는 아니지만, git-extras 패키지에 있습니다) :

git back

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

# Remove the latest three commits
git back 3
33
Shadow Man

이러한 모든 초기 단계를 직접 완료하고 git repo로 되돌릴 수 있습니다.

  1. git pull --all 명령을 사용하여 Bitbucket에서 저장소의 최신 버전을 가져옵니다.

  2. 터미널에서 -n 4와 함께 git log 명령을 실행하십시오. -n 다음의 숫자는 로컬 히스토리의 가장 최근 커밋에서 시작하여 로그에있는 커밋 수를 결정합니다.

    $ git log -n 4

  3. git reset --hard HEAD~N를 사용하여 리포지토리 히스토리의 헤드를 재설정합니다. 여기서 N은 헤드를 다시 가져 오려는 커밋 수입니다. 다음 예제에서 헤드는 한 번의 커밋을 저장소 히스토리의 마지막 커밋으로 다시 설정합니다.

  4. git Push --force를 사용하여 git repo에 변경 사항을 강제 적용하여 변경 사항을 적용하십시오.

Git 저장소가 이전 커밋을 원한다면

git pull --all
git reset --hard HEAD~1
git Push --force
29
Nanhe Kumar

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

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 또는 무엇이든간에.

26
tonythomas01

최근 커밋으로 직접 재설정하는 방법 중 하나입니다.

git stash
git stash clear

마지막 커밋 이후에 변경 한 내용을 모두 지 웁니다.

추신 : 약간의 문제가 있습니다. 그것은 또한 당신이 최근 숨긴 변경 사항을 모두 삭제합니다. 나는 대부분의 경우에 그것이 중요하지 않아야한다고 생각한다.

20
Point Networks

이전 커밋의 변경 사항을 HEAD에 저장하고 이전 커밋으로 이동하려면 다음을 수행하십시오.

git reset <SHA>

이전 커밋에서 HEAD에 대한 변경이 필요하지 않고 모든 변경 사항을 무시한 경우 다음을 수행하십시오.

git reset --hard <SHA>
20
Vishnu Atrai

실수로 변경된 부분에서 코더의 디렉토리를 완전히 지우려면 다음을 사용했습니다.

git add -A .
git reset --hard HEAD

그냥 git reset --hard HEAD는 수정을 없애 겠지만 "새"파일을 제거하지는 않습니다. 그들의 경우 우연히 어딘가에 중요한 폴더를 실수로 드래그하여 모든 파일이 힘내에 의해 새 것으로 취급되어 reset --hard가 문제를 해결하지 못했습니다. 사전에 git add -A .를 실행함으로써, 명시 적으로 모두 git으로 추적하여 재설정으로 지울 수 있습니다.

20
Chris Moschini

나는 어떤 사람들이 자신의 주인이 저지른 커밋 된 변화를 롤백하는 방법을 알고 싶어하는이 질문에 도달 할 것이라고 믿는다. 즉 모든 것을 버리고 Origin/master로 돌아가는 경우, 이렇게하면된다.

git reset --hard Origin/master

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

19
nevster

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

git revert <commit1> <commit2> 

샘플 :

git revert 2h3h23233

HEAD에서 범위를 가져올 수 있습니다. 여기서 1은 "마지막 커밋을 되돌립니다"라고 말합니다.

git revert HEAD~1..HEAD

그런 다음 git Push을 수행하십시오.

16
Sireesh Yarlagadda

가장 최근 커밋 되돌리기 :

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 라는 새 분기를 갖게되었습니다.

16
Lyes CHIOUKH

상황이 긴급이고 프로젝트가 "my project"디렉토리에 있다고 가정하면 질문자가 quick and dirty 방식으로 요청한 것을 수행하려고합니다.

  1. 전체 디렉토리를 복사하고 "my project-copy"와 같은 다른 디렉토리로 부릅니다.

  2. 해야 할 것:

    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 저장소를 "적절하게"백업 할 수 있습니다. 그러나 다시 말하지만, 이것에 대해 너무 빨리 이야기 할 수 있습니다.

15
mike rodent

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

git reset <COMMIT_ID>

(COMMIT_ID를 확인하려면 git log를 사용하십시오)

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

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

git checkout .

변경 사항을 확인하려면 git log를 확인하십시오.

업데이트

Repo에서 유일한 커밋이있는 경우

git update-ref -d HEAD

13
optimistanoop

주의! 이 커맨드는 사용자가 잘못 커밋 한 경우 커밋 기록을 잃을 수 있습니다. 항상 git의 여분의 백업을 가지고 있어야합니다. 실수로 실수를 저지를 경우를 대비해서, 조금 더 안전 할 것입니다. :)

비슷한 문제가 있었고 이전 커밋으로 되돌아 가고 싶었습니다. 내 경우에는 새로운 커밋을 유지하기 위해 intetessered하지 않았으므로 나는 Hard을 사용했습니다.

이것이 내가 한 일이다.

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

이것은 로컬 저장소에서 되돌릴 것이며, git Push -f를 사용하면 원격 저장소가 업데이트됩니다.

git Push -f
11

커밋이 원격으로 푸시됨에 따라 커밋을 제거해야합니다. 당신의 지점이 개발 중이며 그것이 Origin으로 푸시되었다고 가정합시다.

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

git Push Origin :develop (note the colon)

그런 다음 당신이 원하는 상태로 발전 할 필요가 있습니다. 커밋 해시가 EFGHIJK라고 가정 해 봅시다.

git reset --hard EFGHIJK

마지막으로 푸시가 다시 개발됩니다.

git Push Origin develop
11
George Ninan

GitKraken에서이 작업을 수행 할 수 있습니다.

  1. 재설정하려는 커밋을 마우스 오른쪽 버튼으로 클릭하고 다음을 선택하십시오. 이 커밋으로 재설정/하드 :

 enter image description here

  1. 다시 커밋을 마우스 오른쪽 버튼으로 클릭하고 다음을 선택하십시오. 현재 브랜치 이름/ 누르기 :

 enter image description here

  1. Force Push를 클릭하십시오 :

 enter image description here

Obs. : 하드 재설정 후 모든 커 L 트 히스토리가 유실되고이 조치가 되돌릴 수 없으므로주의해야합니다. 당신이하는 일을 확신해야합니다.

10
Ângelo Polotto

마지막 커밋에서 어떤 에러를 정정하고자한다면 좋은 대안은 git commit --amend command를 사용하는 것이다. 마지막 커밋이 어떤 참조에 의해서도 가리키고 있지 않으면, 이것은 마지막 커밋과 같은 부모를 가진 커밋을 생성하기 때문에 트릭을 수행 할 것이다. 마지막 커밋에 대한 참조가 없다면, 단순히 폐기되고이 커밋이 마지막 커밋이됩니다. 이는 커밋을 되 돌리지 않고 커밋을 수정하는 좋은 방법입니다. 그러나 그것은 그것의 자신의 한계가 있습니다.

10
Upul Doluweera

먼저, 어떤 날짜에 커밋을 식별하는 문자열을 얻습니다.

git rev-list -n 1 --before="2009-07-27 13:37" Origin/master

커밋 식별자를 출력하고 문자열 (예 : XXXX)을 가져 와서 다음을 수행합니다.

git checkout XXXX
9
Luca C.

롤백 (또는 되돌리기) :

  1. git revert --no-commit "커밋 코드 제거"HEAD (예 : git revert --no-commit d57a39d HEAD)
  2. 자식 커밋
  3. git 푸시

위의 두 단계를 시도해보고 이것이 원하는 경우 git Push를 찾으십시오.

잘못된 것을 발견하면 다음을 수행하십시오.

자식 되돌리기 - 녀석

9
Jagraj Singh

SourceTree 를 사용하면 훨씬 쉽게 작업을 수행 할 수 있습니다. 찾고자하는 커밋을 마우스 오른쪽 버튼으로 클릭하고 메뉴에서 '체크 아웃'을 선택하십시오.

 enter image description here

8
Marcin Szymczak

또 다른 간단한 해결책; 이 작업을 수행하려면 지점을 변경해야하지만 이후에는 다음을 실행할 수 있습니다.

git branch -f <<branchname>> 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
8
Aif

어떤 이유로 수동으로 광산을 되돌릴 수 없으므로 여기에서 광산을 끝내는 방법이 있습니다.

  1. 내가 갖고 싶었던 지점을 확인하고 복사했습니다.
  2. 최신 지점을 확인했습니다.
  3. 내가 원하는 지점의 내용을 최신 지점의 디렉토리에 복사하여 변경 사항을 덮어 쓰고 커밋합니다.
7
Demodave
git reflog

Git reflog의 HEAD 수를 선택하십시오. 여기서 되돌리려 고 할 곳을 선택하십시오 (이 예에서는 12를 선택합니다).

git reset [email protected]{12} --hard
7
Sérgio

분기를 특정 커밋으로 되돌리려면 내가 찾은 내역을 변경할 수없는 가장 복잡한 방법은 다음과 같습니다.

  1. 되돌리려는 커밋이나 지점을 체크 아웃하십시오.
  2. .git/HEAD를 편집하고 참조로 되돌릴 분기로 변경하십시오.

예를 들면 :

echo 'ref: refs/heads/example' > .git/HEAD

Git status 명령을 사용하면 현재 실행중인 브랜치와 되돌리려는 브랜치 사이의 모든 변경 사항을 볼 수 있습니다.

모든 것이 잘되면 당신은 커밋을 할 수 있습니다. git diff revert..example을 사용하여 동일 함을 확인할 수도 있습니다.

6
jgmjgm

변경 사항을 일시적으로 되돌리려는 경우

  • 빌드를 깨거나 작업중인 기능을 해치는 코드를 저지른 사람

Git log를 사용하여 마지막으로 작업 한 커밋을 검색 한 다음 실행할 수 있습니다.

git rebase --onto <commitId>

원격 지점이 다시 작동하면 다음을 수행 할 수 있습니다.

git pull --rebase

이 방법은 분리 된 상태가 아니기 때문에 git checkout보다 임시 변경 사항이 더 좋습니다.

5
joseph

단계별 변경 사항 및 커밋 재설정

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을 혼란스럽게 할 수 있습니다.

2
SAIguru011