Git에서는 squash commit다른 지점에서 병합 한 다음 다음 HEAD을 통해 이전 장소 로 재설정 하여 a 를 하려고했습니다 .
git reset origin/master
그러나 나는 이것을 벗어나야합니다. HEAD를 이전 위치로 다시 옮길 수 있습니까?
23b6772이동해야 할 커밋 의 SHA-1 조각 ( )이 있습니다. 이 커밋으로 돌아가려면 어떻게해야합니까?
Git에서는 squash commit다른 지점에서 병합 한 다음 다음 HEAD을 통해 이전 장소 로 재설정 하여 a 를 하려고했습니다 .
git reset origin/master
그러나 나는 이것을 벗어나야합니다. HEAD를 이전 위치로 다시 옮길 수 있습니까?
23b6772이동해야 할 커밋 의 SHA-1 조각 ( )이 있습니다. 이 커밋으로 돌아가려면 어떻게해야합니까?
답변:
대답하기 전에 배경을 추가하여 이것이 무엇인지 설명해 봅시다 HEAD.
First of all what is HEAD?HEAD단순히 현재 분기의 현재 커밋 (최신)에 대한 참조입니다. 주어진 시간에
하나만있을 수 있습니다 HEAD(제외 git worktree).
내용은 HEAD내부에 저장 .git/HEAD되며 현재 커밋의 40 바이트 SHA-1을 포함합니다.
detached HEADHEAD히스토리에서 이전 커밋을 가리키는 최신 커밋-의미가 아닌 경우 호출 detached HEAD됩니다.
명령 행에서 분기 이름 대신 SHA-1은 다음과 같습니다 HEAD. 현재 분기의 끝을 가리 키지 않기 때문 입니다.
git checkoutgit 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 reflog 변경 사항을 표시 HEAD하고 원하는 참조 로그 항목을 체크 아웃하면 HEAD이 커밋으로 돌아갑니다.
HEAD가 수정 될 때마다 reflog
git reflog
git checkout HEAD@{...}
원하는 커밋으로 돌아갑니다.
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 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.
하다
git reset 23b6772
올바른 위치에 있는지 확인하려면
git status
당신은 뭔가를 볼 수 있습니다
지점 마스터 지점은 17 개의 커밋으로 '원점 / 마스터'뒤에 있으며 빨리 감을 수 있습니다.
그런 다음 리모컨의 기록을 다시 작성하여 변경 사항을 반영하십시오.
git push --force-with-lease // a useful command @oktober mentions in comments
git push --force. 많은 상황에서 그것은 당신을 잠시 동안 팀에서 가장 인기있는 사람으로 만들 것입니다 ....
git push --force-with-lease(Thoughtbot 기사 : thoughtbot.com/blog/git-push-force-with-lease를 )
revert커밋 과 같은 방식으로 반응하지 않기 때문에 엄청나게 어려운 상황에 처했습니다. force-with-lease다른 사람들의 작업에 영향을 미치지 않고 지점의 git history를 다시 쓸 수 있다고 확신했습니다. 브라보!
사용하다 git checkout -
당신은 볼 수 있습니다 Switched to branch <branch_name>. 원하는 지점인지 확인하십시오.
간단한 설명 :이 명령은 HEAD를 마지막 위치로 다시 이동시킵니다. 이 답변 끝에있는 결과 에 대한 참고 사항을 참조하십시오 .
니모닉 :이 방법은 cd -이전에 방문한 디렉토리로 돌아 오는 데 사용 하는 것과 매우 유사 합니다. 구문과 적용 가능한 경우는 매우 일치합니다 (예 : 실제로 HEAD가 원래 위치로 돌아 가기를 원할 때 유용합니다).
빠른 접근 방식은 OP의 문제를 해결합니다. 그러나 상황이 약간 다른 경우 어떻게해야합니까? Bash를 다시 시작한 다음 HEAD를 분리 한 상태에서 자신을 찾았습니다. 이 경우 간단하고 쉽게 기억할 수있는 2 가지 단계가 있습니다.
사용하다 git branch -v
기존 로컬 지점 목록이 표시됩니다. 필요에 맞는 지사 이름을 얻으십시오.
사용하다 git checkout <branch_name>
당신은 볼 수 있습니다 Switched to branch <branch_name>. 성공!
두 방법 중 하나를 사용하면 이전과 같이 계속해서 작업을 추가하고 커밋 할 수 있습니다. 다음 변경 사항은에 추적됩니다 <branch_name>.
모두 참고 git checkout -하고 git checkout <branch_name>머리가 분리 된 상태에서 커밋 변경이있는 경우 추가 지침을 제공 할 것입니다.
git checkout 8acc968다음 git branch -v이 MyBranch아래 ... 목록에하지만 git checkout MyBranch내 의견을 삭제합니다.
git checkout 8acc968분기가 아닌 커밋을 확인합니다. MyBranch원하는 커밋이 있으면 시도하십시오 git checkout MyBranch. 커밋 8acc968의 변경 사항이 포함되어 있지 않으면 지점을 체크 아웃 한 후 해당 변경 사항을 병합해야합니다.
git checkout이전 커밋보고 다시 최신 커밋을 얻고 싶었다. 그러나 최신 커밋 해시가 없으면 거의 잃어 버렸습니다. 이 솔루션은 내 상황에 완벽합니다!
질문은 다음과 같이 읽을 수 있습니다.
HEADat 23b6772와 분리 상태 에 있었고 입력했습니다 git reset origin/master(스쿼시하고 싶었 기 때문에). 지금은 어떻게 돌아가 않는다, 내 마음을 변경했습니다 HEAD에있는 23b6772?
직접적인 대답은 다음과 같습니다. git reset 23b6772
그러나 이전 질문을 참조 할 때마다 입력 (복사 및 붙여 넣기) 커밋 해시 또는 약어가 아프기 때문에이 질문에 부딪 쳤 HEAD으며 인터넷 검색에서 일종의 속기가 있는지 확인했습니다.
git reset -(또는 내 경우 git cherry-pick -)
우연히 * nix cd -의 이전 현재 디렉토리 로 돌아가는 것과 같습니다 ! hurrah, 나는 하나의 돌로 두 가지를 배웠다.
git checkout 23b6772해야 할 것.