Git에서 커밋을 되돌리는 방법

6532 단어 gitcommandline
git에서 작업을 실행 취소하는 몇 가지 방법이 있지만 이 게시물의 목적을 위해 다음 시나리오를 고수합니다.
  • 로컬 및 원격 복사본이 있는 저장소
  • 다인 협력자
  • 되돌려야 하는 원격(그리고 잠재적으로 배포된)에 병합된 최근 변경 사항

  • git revert 구조로!

    TL; DR: 원격 저장소에서 커밋을 되돌리는 단계:


  • 로컬 및 기본 분기에서 최신 변경 사항을 가져옵니다. git pull
  • 새 분기 만들기: git checkout -b remove_buggy_code
  • git log를 사용하여 버그가 있는 커밋의 해시를 찾습니다.
  • git revert [-m 1 –편집 안 함]

  • 위의 명령은 원래 병합 커밋의 모든 변경 사항이 되돌려지는 새 병합 커밋을 만듭니다. 이렇게 하면 리포지토리의 기록이 변경되지 않고 유지되기 때문에 좋습니다.

    위에 표시된 선택적 태그는 다음을 의미합니다.

    -m n : 병합 커밋을 되돌리는 경우 이 플래그를 숫자와 함께 전달해야 합니다( this StackOverflow post explains why )

    –no-edit : 기본 텍스트 편집기 실행을 건너뜁니다.

    예제를 살펴보겠습니다.



    내 로컬main 지점은 다음과 같습니다.

    └❯ git log
    commit 9ebef49af9f50996f32c863604b1fc6fdce71e26 (HEAD -> main, origin/main, origin/HEAD)
    Author: Flavia Bastos <my_email>
    Date: Tue Oct 4 19:22:55 2022 -0300
    
        Fix typo on test name
    
    


    그런 다음 누군가 새 커밋을 원격에 병합합니다. 새 변경 사항을 가져오면 해당 변경 사항에 대한 새 커밋( 86d1c24f17aa7 ) 및 새 병합 커밋( 5aa51c6ea265cc )이 표시됩니다.

    └❯ git log
    commit 5aa51c6ea265cc43b93a66de97ca4d8fcafc69df (HEAD -> main, origin/main, origin/HEAD)
    Merge: 9ebef49 86d1c24
    Author: Someone Else <another_email>
    Date: Thu Oct 6 17:14:15 2022 -0400
    
        Merge pull request #1 from SomeoneElse/fancy_feature
    
        fancy code
    
    commit 86d1c24f17aa7fd264a26d81533e53f6f48dea24 (origin/fancy_feature, fancy_feature)
    Author: Someone Else <another_email>
    Date: Thu Oct 6 18:08:49 2022 -0300
    
        fancy code
    
    commit 9ebef49af9f50996f32c863604b1fc6fdce71e26
    Author: Flavia Bastos <my_email>
    Date: Tue Oct 4 19:22:55 2022 -0300
    
        Fix typo on test name
    


    여기서 병합 커밋( 5aa51c6ea265cc )은 "Merge"속성의 상위 커밋도 설명합니다.

    Merge: 9ebef49 86d1c24
    


    이제 이 멋진 코드도 버그가 있었고 이로 인해 일부 문제가 심하게 손상되었습니다.

    이 최신 버전main에서 새 브랜치를 생성하여 이 문제를 빠르게 해결해 보겠습니다.

    └❯ git checkout -b bug_fixer
    Switched to a new branch 'bug_fixer'
    


    위의 git log 명령의 출력에서 ​​우리는 가장 최근(최상위) 커밋 해시를 원하지만 그 위에 다른 커밋이 있을 수 있음을 알고 있습니다. 항상 git log로 확인하십시오.

    이제 버그가 있는 커밋( 5aa51c6ea265cc )을 되돌려 보겠습니다. 우리는 별도의 브랜치에 있으며 첫 번째 부모-m 1로 되돌리고 싶기 때문에 9ebef49 플래그를 사용하고 있습니다(-m 2는 두 번째 부모86d1c24 ):

    └❯ git revert 5aa51c6ea265cc43b93a66de97ca4d8fcafc69df -m 1 --no-edit
    [bug_fixer 560ad2d] Revert "Merge pull request #1 from SomeoneElse/fancy_feature"
     Date: Thu Oct 6 18:30:50 2022 -0300
     1 file changed, 1 insertion(+), 1 deletion(-)
    


    이제 남은 것은 이 bug_fixer 분기를 원격으로 푸시하고 이 변경 사항을 병합하는 것입니다.

    └❯ git push origin bug_fixer
    Enumerating objects: 5, done.
    Counting objects: 100% (5/5), done.
    Delta compression using up to 12 threads
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (3/3), 402 bytes | 402.00 KiB/s, done.
    Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
    remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
    remote: 
    remote: Create a pull request for 'bug_fixer' on GitHub by visiting:
    remote: https://github.com/FlaviaBastos/my_project_name/pull/new/bug_fixer
    remote: 
    To github.com:FlaviaBastos/my_project_name.git
     * [new branch] bug_fixer -> bug_fixer
    
    


    이 마지막 변경 사항이 원격 저장소에 병합된 후 main 분기로 돌아가서 최신 변경 사항을 가져오고 git log 버그가 있는 커밋이 되돌려졌는지 확인합니다.

    ❯ git log
    commit 4332e3e999c2056019cf64255f17b32a6ef1992b (HEAD -> main, origin/main, origin/HEAD)
    Merge: 5aa51c6 560ad2d
    Author: Someone Else <another_email>
    Date: Thu Oct 6 17:53:28 2022 -0400
    
        Merge pull request #2 from FlaviaBastos/bug_fixer
    
        Revert "Merge pull request #1 from SomeoneElse/fancy_feature"
    
    commit 560ad2ddfd207fad2f609873270bdd3f645bb4b6 (origin/bug_fixer, bug_fixer)
    Author: Flavia Bastos <my_email>
    Date: Thu Oct 6 18:30:50 2022 -0300
    
        Revert "Merge pull request #1 from SomeoneElse/fancy_feature"
    
        This reverts commit 5aa51c6ea265cc43b93a66de97ca4d8fcafc69df, reversing
        changes made to 9ebef49af9f50996f32c863604b1fc6fdce71e26.
    
    commit 5aa51c6ea265cc43b93a66de97ca4d8fcafc69df
    Merge: 9ebef49 86d1c24
    Author: Someone Else <another_email>
    Date: Thu Oct 6 17:14:15 2022 -0400
    
        Merge pull request #1 from SomeoneElse/fancy_feature
    
        fancy code
    
    commit 86d1c24f17aa7fd264a26d81533e53f6f48dea24 (origin/fancy_feature, fancy_feature)
    Author: Flavia Bastos <my_email>
    


    휴! 위기를 피했다!

    그러나 reset --hard 는 어떻습니까? 커밋도 되돌리지 않습니까?



    예, 그렇습니다. 그래도 로컬에서만. git reset는 repo의 헤드(포인터)를 설정한 커밋으로 이동하여 그 이후의 모든 것을 효과적으로 제거합니다. 원하는 경우 헤드 위의 모든 것을 잘라냅니다. 차이가 사라집니다. 그런 다음 git status 를 수행하면 다른 커밋이 더 이상 표시되지 않으며 준비해야 하는 새로운 항목도 표시되지 않으며 기록을 다시 작성하게 됩니다. 혼자 작업하거나 아직 원격으로 푸시되지 않은 브랜치에서 작업하는 경우에만 안전합니다.

    원격 저장소에 변경 사항을 푸시해야 하는 경우 git revert 를 사용해야 합니다.

    더 알아보기:



    자식 되돌리기 문서: https://git-scm.com/docs/git-revert


    도움이 되셨다면 이 글을 공유해주세요!

    How to revert a commit in git



    게시물How to revert a commit in git _원래 _flaviabastos.ca에 게시됨

    좋은 웹페이지 즐겨찾기