programing

HEAD를 이전 위치로 다시 이동하려면 어떻게 해야 합니까?(헤드 분리) & 커밋 실행 취소

lovejava 2023. 5. 14. 09:59

HEAD를 이전 위치로 다시 이동하려면 어떻게 해야 합니까?(헤드 분리) & 커밋 실행 취소

Git에서, 나는 그것을 하려고 노력했습니다.squash commit한 후 HEAD다음을 통해 이전 위치로 이동:

git reset origin/master

하지만 저는 여기서 물러나야 합니다.HEAD를 이전 위치로 다시 이동하려면 어떻게 해야 합니까?

저는 단편 (SHA-1 단편을 가지고 있습니다.23b6772로.로 이동해야 하는 커밋입니다.어떻게 하면 이 약속으로 돌아갈 수 있습니까?

답변하기 전에 배경을 추가하여 설명하겠습니다.HEAD사실은.

First of all what is HEAD?

HEAD는 현재 분기의 현재 커밋(커밋)에 대한 단순한 참조입니다.
있을 수 .HEAD든지 (단 언든제지외(제제)) 제외)git worktree).

HEAD는 내에저다니됩 에 저장됩니다..git/HEAD현재 커밋의 40바이트 SHA-1이 포함되어 있습니다.


detached HEAD

최신 커밋에 참여하지 않은 경우 - 즉,HEAD역사상 이전의 커밋을 가리키고 있습니다.

여기에 이미지 설명 입력

이름 대신 됩니다. 지점 이름 대신 SHA-1.HEAD가 현재 분기의 끝을 가리키고 있지 않습니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력


분리된 HEAD에서 복구하는 방법에 대한 몇 가지 옵션:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits to 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 reflog 에서는 "" " " " " " " 을 한 모든 을 표시합니다.HEAD하면 "reflog"가 됩니다.HEAD다시 이 약속으로 돌아가겠습니다.

마다 HEAD에 새 됩니다.reflog

git reflog
git checkout HEAD@{...}

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

여기에 이미지 설명 입력


git reset --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뿐만 아니라.

여기에 이미지 설명 입력


git revert <sha-1>

지정된 커밋 또는 커밋 범위를 "실행 취소"합니다.
commit.revert에서 을 "취소.
원래 커밋이 기록에 남아 있는 동안 실행 취소 패치를 사용하여 새 커밋이 커밋됩니다.

# 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.

여기에 이미지 설명 입력

첫 번째 로컬:

git reset 23b6772

올바른 위치에 있는지 확인하려면 다음을 사용하여 확인합니다.

git status

다음과 같은 내용이 표시됩니다.

분기 마스터에서 분기는 '출발지/마스터'보다 17개 커밋 늦으며, 빠르게 전달될 수 있습니다.

그런 다음 원격 추적 분기에 변경 내용을 반영하여 기록을 다시 작성합니다.

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

대신 사용하면 다른 사용자가 원격 분기에 커밋한 경우 오류가 발생하며, 이 경우 사용자가 먼저 가져와야 합니다. 문서의 자세한 내용은 다음과 같습니다.

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

사용하다git checkout -

보게 될 것입니다Switched to branch <branch_name>원하는 지점인지 확인합니다.


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


니모닉: 이 접근 방식은 사용하는 것과 매우 유사합니다.cd -이전에 방문한 디렉토리로 돌아갑니다.구문과 해당 사례는 매우 잘 일치합니다(예: HEAD가 실제로 원래 위치로 돌아가기를 원할 때 유용합니다).


보다 체계적인 솔루션(2단계이지만 기억에 남음)

빠른 접근은 OP의 질문을 해결합니다.하지만 상황이 조금 다르다면 어떨까요? Bash를 다시 시작한 후 HEAD가 분리된 것을 발견했다고 가정해 보십시오.이 경우, 여기 간단하고 쉽게 기억할 수 있는 두 가지 단계가 있습니다.

필요한 지점 선택

사용하다git branch -v

기존 로컬 분기 목록이 표시됩니다.필요에 따라 지점 이름을 가져옵니다.

HEAD를 이동합니다.

사용하다git checkout <branch_name>

보게 될 것입니다Switched to branch <branch_name>성공!


결과

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

가지 모두 둘에 하십시오.git checkout -그리고.git checkout <branch_name>HEAD가 분리된 상태에서 변경을 커밋한 경우 에서는 추가 지침을 제공합니다.

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

저는 다른 사람과 격리된 상태였습니다.HEAD23b6772타이핑했습니다.git reset origin/master(저는 스쿼시를 하고 싶었기 때문입니다.)이제 생각이 바뀌었는데 어떻게 돌아가죠?HEAD에 있는23b6772?

다음과 같습니다.git reset 23b6772

하지만 이전 항목을 참조하고 싶을 때마다 커밋 해시나 약어를 입력하는 것에 싫증이 나서 이 질문을 눌렀습니다.HEAD구글에서 속기가 있는지 알아보고 있었어요

있는 것으로 밝혀졌습니다!

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

그것은 부수적으로 다음과 같았습니다.cd -*nix!의 이전 현재 디렉터리로 돌아갑니다.그래서 만세, 저는 일석이조의 교훈을 얻었습니다.

을 할 때git checkout commit_id는 런가다분리니다됩그음▁from에서 분리되었습니다.13ca5593d(say commit-id)지점은 더 오래 사용할 수 있습니다.

이전 위치로 다시 이동합니다. stepwise 명령을 실행합니다.

  1. git pull origin branch_name master (스터라고함마함))▁(마
  2. git checkout branch_name
  3. git pull origin branch_name

원격 리포지토리에서 업데이트된 커밋을 사용하여 이전 위치로 돌아갑니다.

오늘 실수로 커밋을 체크아웃하고 작업을 시작하여 분리 HEAD 상태에 대한 커밋을 몇 개 만들었습니다.그런 다음 다음 명령을 사용하여 원격 분기로 이동했습니다.

git push origin HEAD: <My-remote-branch>

그리고나서

git checkout <My-remote-branch>

그리고나서

git pull

나는 마침내 분리 HEAD에서 변경한 모든 변경 사항을 브랜치에서 받았습니다.

이것은 기술적인 해결책은 아닐 수도 있지만, 효과가 있습니다.(동료 중 현지에 동일한 지점이 있는 사람이 있을 경우)

지점 이름을 branch-xxxx로 가정합니다.

해결 단계:

  • 업데이트 또는 꺼내기 안 함 - 없음
  • 그의 컴퓨터에 branch-xxxx에서 새 branch(branch-yyy)를 생성하기만 하면 됩니다.
  • 여기까지가 기존의 모든 변경사항이 이 새 분기(branch-yyyy)에 적용됩니다.이 지점에서 작업을 계속할 수 있습니다.

참고: 다시 말하지만, 기술적인 해결책은 아니지만 확실히 도움이 될 것입니다.

푸시되지 않은 마지막 커밋을 새 분기로 이동

WRONG_BRANCH에서 커밋을 시작했는데 푸시되지 않은 마지막 커밋을 RIGHT_BRANCH로 이동하려면 가장 쉬운 방법은 다음과 같습니다.

  1. git checkout WRONG_BRANCH
  2. git branch RIGHT_BRANCH
  3. git reset —-hard LAST_PUSHED_COMMIT
  4. git checkout RIGHT_BRANCH

이시에실면하행서점면을 하면,git log HEAD모든 커밋이 RIGHT_BRACH에 있는 것을 확인할 수 있습니다.

데이터.

  • WRONG_BRANCH는 현재 커밋된 변경 사항(아직 푸시하지 않음)이 있는 위치입니다.
  • RIGHT_BRANCH는 커밋된 변경 사항(아직 푸시하지 않음)을 적용할 위치입니다.
  • LAST_PUSHED_COMMIT는 WRONG_BRANCH를 복원할 위치입니다.

언급URL : https://stackoverflow.com/questions/34519665/how-can-i-move-head-back-to-a-previous-location-detached-head-undo-commits