HEAD를 이전 위치로 다시 옮기려면 어떻게해야합니까? (분리 된 머리) & 커밋 취소

git git-checkout git-reset git-revert git-reflog


Git에서 나는 다른 지점에서 합병 한 다음 squash commit 을 시도 하고 다음을 통해 HEAD 를 이전 위치 로 재설정했습니다 .

git reset origin/master

그러나 나는 이것을 벗어나야합니다. HEAD를 이전 위치로 다시 옮길 수 있습니까?

나는 그것을 옮겨야 할 커밋 의 SHA-1 조각 ( 23b6772 )을 가지고 있습니다. 이 커밋으로 돌아가려면 어떻게해야합니까?




Answer 1 CodeWizard


대답하기 전에이 HEAD 가 무엇인지 설명하는 배경을 추가해 보겠습니다 .

First of all what is HEAD?

HEAD 는 단순히 현재 분기의 현재 커밋 (최신)에 대한 참조입니다.
주어진 시간에 단일 HEAD 만있을 수 있습니다 ( git worktree 제외 ).

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


detached HEAD

HEAD 가 히스토리에서 이전 커밋을 가리키고 있다는 최신 커밋이 아닌 경우 이를 detached HEAD 라고 합니다.

Enter image description here

HEAD 가 현재 분기의 끝을 가리 키지 않기 때문에 명령 줄에서 분기 이름 대신 SHA-1이 나타납니다 .

Enter image description here

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

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

Enter image description here


git reset --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 도 사용할 수 있습니다 .

git revert <sha-1>

지정된 커밋 또는 커밋 범위를 "실행 취소"합니다.
reset 명령은 지정된 커밋에서 변경 한 내용을 "실행 취소"합니다.
실행 취소 패치가 포함 된 새로운 커밋은 커밋되지만 원래 커밋도 기록에 남아 있습니다.

# Add a new commit with the undo of the original one.
# The <sha-1> can be any commit(s) or commit range
git revert <sha-1>

이 스키마는 어떤 명령이 무엇을 수행하는지 보여줍니다.
보시다시피 reset && checkout HEAD 수정하십시오 .

Enter image description here




Answer 2 amuliar


Do

git reset 23b6772

올바른 위치에 있는지 확인하려면

git status

당신은 뭔가를 볼 수 있습니다

지점 마스터 지점은 17 개의 커밋으로 '원점 / 마스터'뒤에 있으며 빨리 감을 수 있습니다.

그런 다음 리모컨의 기록을 다시 작성하여 변경 사항을 반영하십시오.

git push --force-with-lease // a useful command @oktober mentions in comments



Answer 3 Kay V


가장 빠른 솔루션 (단 1 단계)

git checkout - 사용 -

Switched to branch <branch_name> 볼 수 있습니다. 원하는 지점인지 확인하십시오.


간단한 설명 :이 명령은 HEAD를 마지막 위치로 다시 이동시킵니다. 이 답변 끝에있는 결과 에 대한 참고 사항을 참조하십시오 .


니모닉 :이 방법은 cd - 사용 하여 이전에 방문한 디렉토리로 돌아가는 것과 매우 유사 합니다. 구문과 적용 가능한 경우는 매우 일치합니다 (예 : 실제로 HEAD가 원래 위치로 돌아 가기를 원할 때 유용합니다).


보다 체계적인 솔루션 (2 단계, 기억에 남는)

빠른 접근 방식은 OP의 문제를 해결합니다. 그러나 상황이 약간 다른 경우 어떻게해야합니까? Bash를 다시 시작한 다음 HEAD를 분리 한 상태에서 자신을 찾았습니다. 이 경우 간단하고 쉽게 기억할 수있는 2 가지 단계가 있습니다.

1. 필요한 지점을 선택하십시오

git branch -v 사용 -v

기존 로컬 지점 목록이 표시됩니다. 필요에 맞는 지사 이름을 얻으십시오.

2. HEAD를 이동

사용 git checkout <branch_name>

Switched to branch <branch_name> 볼 수 있습니다. 성공!


Outcomes

두 방법 중 하나를 사용하여 이전과 같이 작업을 계속 추가하고 커밋 할 수 있습니다. 다음 변경 사항은 <branch_name> 에서 추적됩니다 .

주 모두 그 git checkout -git checkout <branch_name> HEAD가 분리 된 상태에서 커밋 변경이있는 경우 추가 지침을 제공 할 것입니다.




Answer 4 antak


질문은 다음과 같이 읽을 수 있습니다.

나는 23b6772 에서 HEAD 와 분리 된 상태 에 있었고 git reset origin/master 를 입력 했습니다 (스쿼시를 원했기 때문에). 이제 마음이 바뀌 었 습니다. 23b6772 에있는 HEAD 로 돌아가려면 어떻게해야 합니까?

대답은 git reset 23b6772 입니다.

그러나 이전 HEAD 를 참조하려고 할 때마다 입력 (복사 및 붙여 넣기) 커밋 해시 또는 약어가 아프기 때문에 인터넷 검색으로 인해 속기 유형이 있는지 확인했습니다.

거기있다!

git reset - (또는 내 경우에는 git cherry-pick - )

cd - 와 동일하게 * nix 의 이전 현재 디렉토리 로 돌아갑니다 ! hurrah, 나는 하나의 돌로 두 가지를 배웠다.




Answer 5 Deepak Kumar


git checkout commit_id 명령을 실행하면 HEAD가 13ca5593d(say commit-id) 에서 분리 되고 분기를 더 이상 사용할 수있게됩니다.

명령을 단계별로 실행하여 이전 위치로 다시 이동-

  1. git pull origin branch_name (예 : 마스터)
  2. git checkout branch_name
  3. git pull origin branch_name

원격 저장소에서 업데이트 된 커밋으로 이전 위치로 돌아갑니다.