이전 커밋을 체크 아웃 한 후 최신 커밋으로 돌아가는 방법은 무엇입니까?


476

때때로 검사하거나 테스트하기 위해 이전 버전의 코드를 확인합니다. 이전 커밋을 수정하려는 경우 수행 할 작업에 대한 지침을 보았지만 변경하지 않았다고 가정합니다. 예를 들어 git checkout HEAD^,을 마치면 지점 끝으로 돌아가는 방법은 무엇입니까? .. git log더 이상 최신 커밋의 SHA를 표시하지 않습니다.


11
git log질문 의 문장과 관련하여 언제든지 git log --all(또는 더 유용하게 git log --oneline --graph --all) 실행할 수 있습니다 .
와일드 카드

답변:


605

반환하려는 커밋이 일부 브랜치의 헤드이거나 태그가 지정된 것을 알고 있다면

git checkout branchname

또한 git reflogHEAD (또는 다른 심판)가 과거에 지적한 다른 사항을 확인하는 데 사용할 수도 있습니다 .


추가하기 위해 편집 :

최신 버전의 Git에서는 한 번만 달리기 위해 달리 git checkout거나 달리 움직일 HEAD수 있다면

git checkout -

마지막 체크 아웃 이전의 위치로 다시 전환합니다. 이것은 쉘 관용구 cd -에 비유하여 이전에 있던 작업 디렉토리로 돌아가는 동기에 의해 동기 부여되었습니다 .


27
전형적인 예는 "git checkout master"라고 말하고 싶습니다. git 사용법을 배우는 데 어려움이있는 것 중 하나는 "branchname"과 같은 자리 표시 자 단어를 실제로 대체 할 수있는 특정 키워드 (예 : "master")를 모르는 것이 었습니다.
AbePralle

3
master실제로 어떤 종류의 키워드도 아닙니다 HEAD. 새 저장소의 기본 분기 이름 일뿐입니다. git branch저장소의 브랜치 git tag -l목록과 태그 목록을 얻기 위해 실행할 수 있습니다 . 마찬가지로 origin리포지토리가 복제되는 원격의 기본 이름이지만 특별한 것은 없습니다.
Phil Miller

3
명확하지 않은 경우 git reflog사용할 수있는 해시 목록을 제공합니다 git checkout [commit-hash].
jbnunn

파일을 삭제하고 명령을 시도했지만 완전히 재설정하지는 않았습니다. 우선, 재귀 적이 지 않습니다. 그런 다음 삭제 한 파일 에서이 작업을 시도하면 git이 HEAD가 분리되었음을 알려줍니다. 무엇을해야합니까?
Daniel S.

1
@DanielS .: 당신이 파일에 대해 이야기하는 동안 질문과 대답은 commits 입니다. 힘내는 그들을 다르게 취급합니다.
Phil Miller

27

자식 체크 아웃 마스터

마스터는 팁 또는 마지막 커밋입니다. gitk 는 당신이 나무의 현재 위치까지 보여줄 것입니다. git reflog 는 모든 커밋을 표시하지만이 경우 팁을 원하므로 git checkout master입니다.


1
이. 또는git checkout branchname
Alex

19

지금 바로이 질문에 와서 추가 할 내용이 있습니다.

가장 최근의 커밋으로 이동하려면

git checkout $(git log --branches -1 --pretty=format:"%H")

설명:

git log --branches모든 로컬 브랜치의 커밋 로그
-1를 하나의 커밋으로 제한 → 가장 최근의 커밋
--pretty=format:"%H"형식
git checkout $(...)으로 서브 쉘의 커밋 해시 사용 출력 만 체크 아웃의 인수로 표시

노트 :

그러나 커밋에 직접 체크 아웃하기 때문에 헤드가 분리됩니다. sed아래 설명 된를 사용하여 분기 이름을 추출하면이를 피할 수 있습니다 .


가장 최근의 커밋 지점으로 이동하려면 :

git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')

설명:

git log --branches쇼는 모든 지역의 가지에서 커밋 로그
-1한 가장 최근의 커밋 → 커밋에 제한
--pretty=format:"%D"에만 형식을 심판 이름을 표시
| sed 's/.*, //g'모두 무시하지만 여러 심판의 마지막 (*)
git checkout $(...)체크 아웃에 대한 인수로 서브 쉘의 사용 출력

*) HEAD 및 원격 분기가 먼저 나열되고 로컬 분기는 알파벳순으로 내림차순으로 나열되므로 나머지는 알파벳순으로 첫 번째 분기 이름이됩니다.

노트 :

커밋에 대해 여러 개가있는 경우 항상 알파벳순으로 첫 번째 분기 이름을 사용합니다.


어쨌든, 가장 좋은 해결책은 가장 최근의 커밋에 대한 참조 이름을 표시하여 체크 아웃 할 위치를 아는 것입니다.

git log --branches -1 --pretty=format:'%D'

예를 들어 git top해당 명령 의 별명 을 작성하십시오 .


1
어떻게 든 두 번째 명령을 수행했습니다 ...이 문제를 해결했습니다. 이제 가장 최근 커밋의 분기를 올바르게 확인합니다.
816-8055

명령이 머리로 다시 돌아가는 Bash / zsh 별칭alias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Hi-Angel

9

그래픽 GUI를 살펴보십시오 ... gitk모든 커밋이 표시됩니다. 때로는 그래픽 작업이 더 쉽습니다 ... ^^


예, 이것이 실제로 과거에 한 일입니다.하지만 현재 GUI를 사용할 수 없습니다.
Leo Alekseyev

7

이를 위해 다음 git 명령 중 하나를 사용할 수 있습니다.

git checkout master
git checkout branchname

4

모든 분기를 표시하고 커밋
git log --branches --oneline

마지막 커밋 자식 로그 표시
--branches -1 --oneline

마지막 커밋 자식 로그 앞에 표시
--branches -2 --oneline


첫 번째 명령은 실제로 어떤 코드가 현재 준비되어 있습니까?
Lazerbeak12345


0

마스터와 다른 지점이있는 경우 쉬운 방법은 해당 지점을 확인한 다음 마스터를 확인하는 것입니다. Voila, 당신은 마스터의 끝으로 돌아 왔습니다. 더 똑똑한 방법이있을 것입니다 ...


0

당신은 간단하게 할 수 있습니다 git pull origin branchname. 최신 커밋을 다시 가져옵니다.


당신이 업스트림에서 당기고 싶지 않다면 이것을 권장하지 않습니다. 준비가 완료된 경우에만 병합 충돌을 처리해야합니다.
Lazerbeak12345

이 경우 최신 커밋을 체크 아웃하더라도 헤드가 분리 된 상태로 유지됩니다.
Ankit Singh

-2

최신 커밋이 마스터 브랜치에 있다면 간단하게 사용할 수 있습니다.

git checkout master
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.