Git의 최신 버전으로 돌아가는 방법?


303

나는 최근 SVN에서 Git으로 옮겼으며 약간 혼란스러워합니다. 디버거를 통해 이전 버전의 스크립트를 실행해야했기 때문에 git checkout <previous version hash>필요한 작업을 수행했습니다.

이제 최신 버전으로 돌아가고 싶지만 해시를 모르겠습니다. 입력하면 git log보이지 않습니다.

어떻게해야합니까? 또한 "두 버전으로 돌아 가기"또는 "가장 최근순으로 가기"와 같이 해시를 입력하는 것보다 버전을 변경하는 더 쉬운 방법이 있습니까?

답변:


371

git checkout master트릭을해야합니다. 두 가지 버전으로 돌아가려면와 같이 말할 수 git checkout HEAD~2있지만 그 시간을 기준 으로 임시 분기를 만드는 것이 좋습니다.git checkout -b temp_branch HEAD~2


7
멋있는! git checkout master정확히 지점에서 다시 전환하는 방법입니다. 그렇다면 이전 버전을 체크 아웃 할 때 본질적으로 브랜치를 생성한다는 의미입니까?
Nathan Long

4
@Nathan : 자식에서 브랜치는 실제로 특정 개정판에 대한 이동 가능한 포인터입니다. 개념적으로, 당신은 일종의 브랜치를 만들지 만 git이 브랜치를 생각한다는 의미는 아닙니다.
DLH

2
그래서 가장 간단한 경우에는 선형 변경이 많이 발생합니다. 이전 버전을 체크 아웃 할 때 HEAD 포인터를 거기로 이동하면 git log해당 지점에 상대적으로 표시됩니다. 그리고 마스터를 체크 아웃 할 때 포인터를 최신 버전의 마스터 브랜치로 옮깁니다.
Nathan Long

7
@Nathan : 맞습니다. HEAD는 상징적 참조라고 불리는 것으로, 일반적으로 다른 참조 (현재 체크 아웃 된 브랜치)에 대한 포인터입니다. git checkout머리를 움직일 수있는 방법입니다. HEAD를 분리하면 주어진 커밋을 바로 가리키게됩니다. 마스터를 다시 체크 아웃하면 마스터를 다시 가리 킵니다. (그리고 많은 명령들은 git log실제로 수정 범위를 취하는데, 기본값은 HEAD입니다.)
Cascabel

3
Yep-HEAD는 "작업 디렉토리에있는 코드의 버전"을 나타내는 데 사용되는 "대명사"입니다. 또한 "당신이 다음에 저지른 모든 것의 부모"의 대명사입니다
Ana Betts

54

특정 커밋에 체크 아웃하면 git은 분리 된 분기를 만듭니다. 따라서 전화하면 :

$ git branch 

다음과 같은 것을 보게 될 것입니다 :

* (detached from 3i4j25)
  master
  other_branch

마스터 브랜치 헤드로 돌아 오려면 마스터 브랜치에 다시 체크 아웃하면됩니다.

$ git checkout master

이 명령은 분리 된 분기를 자동으로 삭제합니다.

경우 git checkout작동하지 않습니다 당신은 아마 나뭇 가지 사이에 충돌 수정 된 파일이 있습니다. 코드를 잃어 버리지 않게하려면 git 파일을 처리해야합니다. 세 가지 옵션이 있습니다.

  1. 수정 내용을 숨 깁니다 (나중에 팝업 가능).

    $ git stash
    
  2. 분리 된 분기를 재설정하여 변경 사항을 폐기하십시오.

    $ git reset --hard
    
  3. 이전 수정 사항으로 새 분기를 작성하고 커미트하십시오.

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

그런 다음 마스터 브랜치 (가장 최신 버전)로 돌아갈 수 있습니다.

$ git checkout master

36

이것은 나를 위해 속임수를 썼다 (나는 여전히 마스터 브랜치에 있었다).

git reset --hard origin/master

34
reset --hard 는 과잉이며 수정 한 내용을 알지 못함을 보여줍니다. 코드가 손실 될 수 있습니다.
Thomio

1
제 경우에는 실수로 저지른 변경 사항을 제거하고 싶었습니다. 그것을 달성하기 위해 다른 방법이있을 수 있음을 알고 있습니다. 푸시되지 않은 커밋 된 변경 사항을 풀고 싶지 않다면 이것이 데이터 손실이라는 데 동의합니다.
Csaba Toth

8

최신 버전으로 돌아가려면

git checkout <branch-name> 

예를 들어, git checkout master또는git checkout dev


7

분기 이름을 사용하여 한 가지를 확인할 수 있습니다.

HEAD를 움직일 수있는 몇 가지 방법이 있다는 것을 알고 있지만 git 전문가에게 맡겨서 열거 할 것입니다.

방금 제안하고 싶었 gitk --all습니다 .git으로 시작할 때 큰 도움이되었습니다.


7

방금 git을 더 깊이 파고 들기 시작했기 때문에 올바르게 이해하고 있는지 확실하지 않지만 OP의 질문에 대한 올바른 대답은 다음 git log --all과 같은 형식 사양으로 실행할 수 있다고 생각합니다 git log --all --pretty=format:'%h: %s %d'. 이것은 현재 체크 아웃 된 버전을 표시 (HEAD)하며 목록에서 다음 버전을 가져올 수 있습니다.

BTW, .gitconfig약간 더 나은 형식으로 이와 같은 별칭을 추가하면 다음을 실행할 수 있습니다 git hist --all.

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

상대 버전과 관련 하여이 게시물을 찾았 지만 이전 버전에 대해서만 이야기하지만 아마도 최신 버전을 언급 할 것이 없습니다.


6

여기에있는 답변 중 일부는 이전 커밋을 체크 아웃하기로 결정하기 전에 마스터 브랜치에 있다고 가정합니다. 항상 그런 것은 아닙니다.

git checkout -

마스터인지 아닌지에 관계없이 이전에 있던 지점으로 돌아갑니다.


분기가 필요하지 않으며 HEAD가 이전을 가리키는 위치를 가리 킵니다. 당신이 한 경우 git checkout hash2git checkout hash1, git checkout -당신이 다시 걸릴 것입니다 hash1.
Mikhail Vasin

3

이전 버전으로 돌아 가면

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

이 상황에서도이 명령으로 기능 로그 (해시)를 볼 수 있습니다.

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master 다른 지점 이름으로 바꿀 수 있습니다.

그런 다음 체크 아웃하면 기능으로 돌아갈 수 있습니다.

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34

1

Git 2.23+ (2019 년 8 월)에서는 혼란스러운 명령 git switch대신 사용 하는 것이 가장 좋습니다 .git checkout

이전 버전을 기반으로 새 분기를 만들려면

git switch -c temp_branch HEAD~2

현재 마스터 브랜치로 돌아가려면

git switch master

0

더 우아하고 간단한 해결책은

git stash

가장 최근에 전송 된 지점 버전으로 돌아가 변경 사항을 숨김 상태로 저장하므로이 작업을 실행 취소하려면 다음을 수행하십시오.

git stash apply

나는 그것이 아주 오래되었다는 것을 알고 있지만 (이 솔루션을 사용해서는 안되기 때문에) 이것에 대해 의견을 말해야합니다-이 문제를 해결하지는 않지만 다른 문제를 해결하기 때문에이 솔루션을 사용하지 않을 것입니다. 이전 커밋을 체크 아웃 할 때마다이 숨김 솔루션을 사용하면 실제로이 경우에는 매우 불필요한 데이터를 "저장"합니다. 옳고 우아한 방법은 (앞서 언급 한대로) <branch>를 체크 아웃하는 것입니다.
Maayao
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.