질문자 :David Moles
잘못된 체리 피킹으로 인해 내 로컬 Git 리포지토리는 현재 원본보다 5개 앞서 있으며 좋은 상태가 아닙니다. 이 모든 커밋을 제거하고 다시 시작하고 싶습니다.
분명히 내 작업 디렉토리를 삭제하고 다시 복제하면 할 수 있지만 GitHub에서 모든 것을 다시 다운로드하는 것은 과도하고 시간을 잘 활용하지 못하는 것 같습니다.
git revert
가 내가 필요한 것일 수도 있지만, 코드 자체를 올바른 상태로 되돌리더라도 원본보다 먼저 10 개(또는 6개) 커밋을 끝내고 싶지는 않습니다. 지난 30분 동안 아무 일도 없었던 척하고 싶을 뿐입니다.
이 작업을 수행하는 간단한 명령이 있습니까? 명백한 유스 케이스처럼 보이지만 그 예를 찾지 못했습니다.
이 질문은 구체적으로 커밋 에 관한 것이지 다음 에 관한 것이 아닙니다.
- 추적되지 않은 파일
- 무단계 변경
- 단계적이지만 커밋되지 않은 변경 사항
초과 커밋이 나만 볼 수 있는 경우 git reset --hard origin/<branch_name>
을 수행하여 원점이 있는 곳으로 다시 이동할 수 있습니다. 이렇게 하면 리포지토리의 상태가 이전 커밋으로 재설정되고 모든 로컬 변경 사항이 삭제됩니다.
git revert
수행하면 모든 사람의 기록을 온전하게 유지하는 방식으로 오래된 커밋을 제거하기 위해 새 커밋이 만들어집니다.
Ben Jackson로컬 마스터 브랜치를 삭제하고 다음과 같이 다시 생성하기만 하면 됩니다.
git branch -D master git checkout origin/master -b master
Ramon Zarazua B.노력하다:
git reset --hard <the sha1 hash>
원하는 곳으로 머리를 재설정합니다. gitk를 사용하여 어떤 커밋에 있고 싶은지 확인하세요. gitk 내에서도 재설정할 수 있습니다.
Anders Zommarin가장 최근 커밋 삭제:
git reset --hard HEAD~1
수행한 작업을 삭제하지 않고 가장 최근 커밋을 삭제합니다.
git reset --soft HEAD~1
James L.지점 시도에서:
git reset --hard origin/<branch_name>
git log
" 또는 " git status
"를 사용하여 반전(로컬 커밋이 없는 상태로)을 확인합니다.
parasrishAtlassian SourceTree 앱을 사용하는 경우 컨텍스트 메뉴에서 재설정 옵션을 사용할 수 있습니다.
![여기에 이미지 설명 입력](https://i.stack.imgur.com/2fbjm.jpg)
muruge간단한 솔루션은 로컬 마스터 분기 HEAD를 원본/마스터 분기 HEAD와 일치시키는 것입니다.
git reset --hard origin/master
추신: origin/master - 마스터 분기에 대한 원격 포인터입니다. 마스터를 모든 분기 이름으로 바꿀 수 있습니다.
narwanimonishgit reset --hard @{u}
* 커밋을 포함하여 현재 분기의 모든 로컬 변경 사항을 삭제합니다. 분기로 되돌리거나 가지고 놀기 위해 어떤 커밋을 조회할 필요가 없다는 것을 고려하면 아직 아무도 이것을 게시하지 않았다는 것이 놀랍습니다.
@{upstream}
일반적으로 origin/<branchname>
에서 현재 분기로 재설정하지만 항상 그런 것은 아닙니다.
Kevin ChenHEAD
가 무엇인지 설명하면서 배경을 추가하겠습니다. 아래 옵션 중 일부로 인해 헤드가 분리되기 때문에
First of all what is HEAD?
HEAD
는 단순히 현재 분기의 현재 커밋(최신)에 대한 참조입니다.
주어진 시간에 HEAD
만 있을 수 있습니다. ( git worktree
제외)
HEAD
의 내용은 .git/HEAD
내부에 저장되며 현재 커밋의 40바이트 SHA-1을 포함합니다.
detached HEAD
최신 커밋에 있지 않은 경우 - HEAD
가 기록의 이전 커밋을 가리키고 detached HEAD
라고 합니다.
![여기에 이미지 설명 입력](https://i.stack.imgur.com/OlavO.png)
HEAD
가 현재 분기의 끝을 가리키지 않기 때문에 분기 이름 대신 SHA-1과 같이 표시됩니다.
![여기에 이미지 설명 입력](https://i.stack.imgur.com/qplvo.png)
![여기에 이미지 설명 입력](https://i.stack.imgur.com/U0l3s.png)
분리된 HEAD에서 복구하는 방법에 대한 몇 가지 옵션:
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>
reflog
도 항상 사용할 수 있습니다.
git reflog
HEAD
를 업데이트한 변경 사항을 표시하고 원하는 reflog 항목을 체크아웃하면 HEAD
가 이 커밋으로 다시 설정됩니다.
HEAD가 수정될 때마다 reflog
git reflog git checkout HEAD@{...}
이렇게 하면 원하는 커밋으로 돌아갑니다.
![여기에 이미지 설명 입력](https://i.stack.imgur.com/atW9w.png)
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
도 사용할 수 있습니다.
주어진 커밋 또는 커밋 범위를 "실행 취소"합니다.
reset 명령은 주어진 커밋의 모든 변경 사항을 "실행 취소"합니다.
실행 취소 패치가 포함된 새 커밋이 커밋되고 원래 커밋도 히스토리에 남습니다.
# add 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
수정합니다.
![여기에 이미지 설명 입력](https://i.stack.imgur.com/NuThL.png)
CodeWizard돌아오고 싶은 커밋의 SHA-1 ID를 보거나 얻으려면
gitk --all
해당 커밋으로 롤백하려면
git reset --hard sha1_id
!메모. 해당 커밋 이후에 이루어진 모든 커밋(및 프로젝트에 대한 모든 수정 사항)이 삭제됩니다. 따라서 먼저 프로젝트를 다른 분기에 복제하거나 다른 디렉토리에 복사하는 것이 좋습니다.
Nicholas푸시되지 않은 커밋을 제거하고 싶은 상황이 있었는데 커밋이 다른 커밋보다 먼저 있었습니다. 이렇게하려면 다음 명령을 사용했습니다.
git rebase -i HEAD~2
-> 마지막 두 커밋을 리베이스합니다.
그리고 제거하고 싶은 커밋 서명에 'drop'을 사용했습니다.
Robert추적되지 않은 파일 제거(커밋되지 않은 로컬 변경 사항)
git clean -df
모든 로컬 커밋을 영구적으로 삭제하고 최신 원격 커밋 가져오기
git reset --hard origin/<branch_name>
ElasticCode최근에 생성한 파일을 삭제하지 않고 마지막 커밋으로 되돌리려면 몇 번이든 사용하십시오.
git reset --soft HEAD~1
그런 다음 사용
git reset HEAD <name-of-file/files*>
언스테이징 또는 언트랙.
Jimut123귀하의 분기가 5 커밋 origin/XXX
다음을 발행할 수 있습니다.
git reset --hard HEAD~5
그리고 마지막 5개의 커밋을 제거해야 합니다.
Ha Choo푸시되지 않는 로컬 커밋의 경우 git rebase -i
를 사용하여 커밋을 삭제하거나 스쿼시할 수도 있습니다.
Nikhil KatreVisual Studio 솔루션에 관심이 있는 사람들을 위한 드릴은 다음과 같습니다.
-
Team Explorer
창에서 대상 리포지토리에 연결합니다. - 그런 다음
Branches
를 마우스 오른쪽 버튼으로 클릭하고 View history
선택합니다. -
History
창에서 커밋을 마우스 오른쪽 버튼으로 클릭 Reset -> Delete changes (--hard)
합니다.
그러면 로컬 커밋이 버리고 저장소 상태가 선택한 커밋으로 재설정됩니다. 즉, 리포지토리를 가져온 후 변경 사항이 손실됩니다.
Bozhidar Stoyneff로컬 커밋을 버리고 파일에서 수정 사항을 유지하려면 다음을 수행하십시오.
자식 리셋 @~
다른 답변은 하드 리셋을 해결했습니다.
Ashish Banker되돌리려는 커밋에 대한 sha1을 찾습니다.
za$ git reflog ... snip ... cf42fa2... HEAD@{0}: commit: fixed misc bugs ~ ~ cf42fa2... HEAD@{84}: commit: fixed params for ..... 73b9363... HEAD@{85}: commit: Don't symlink to themes on deployment. 547cc1b... HEAD@{86}: commit: Deploy to effectif.com web server. 1dc3298... HEAD@{87}: commit: Updated the theme. 18c3f51... HEAD@{88}: commit: Verify with Google webmaster tools. 26fbb9c... HEAD@{89}: checkout: moving to effectif
그런 다음 --mixed 플래그를 사용하여 "HEAD 및 인덱스를 재설정"합니다.
za$ git reset --mixed cf42fa2
사용 가능한 플래그:
za$ git reset -h -q, --quiet be quiet, only report errors --mixed reset HEAD and index --soft reset only HEAD --hard reset HEAD, index and working tree --merge reset HEAD, index and working tree --keep reset HEAD but keep local changes --recurse-submodules[=<reset>] control recursive updating of submodules -p, --patch select hunks interactively -N, --intent-to-add
z atefgit reset --hard <SHA-Code>
이것은 실수로 원격 브랜치로 푸시되지 않도록 하려는 로컬 복사본에서 실수를 한 경우에 유용합니다.
SHA-Code는 분기의 마지막 커밋에 대한 git 대시보드의 webVersion을 보면 얻을 수 있습니다.
이렇게 하면 분기의 마지막 커밋과 동기화할 수 있습니다.
git pull
을 수행하여 syn에 새로운 것이 없음을 확인할 수 있습니다. 즉, 메시지를 보게 됩니다.
Origin/<Branch Name>
으로 최신 상태입니다.
Sameer Ashraf로컬 저장소가 완전히 엉망이 된다면 Git에서 로컬 커밋을 버리는 신뢰할 수 있는 방법은...
- "git config --get remote.origin.url"을 사용하여 원격 출처의 URL을 가져옵니다.
- 로컬 git 폴더의 이름을 "my_broken_local_repo"로 바꿉니다.
- "git clone <url_from_1>"을 사용하여 원격 git 저장소의 새 로컬 복사본을 가져옵니다.
내 경험에 따르면 Eclipse는 주변의 변화하는 세상을 아주 잘 처리합니다. 그러나 Eclipse에서 영향을 받는 프로젝트를 선택하고 정리하여 Eclipse가 다시 빌드하도록 해야 할 수도 있습니다. 다른 IDE도 강제 재구축이 필요할 수 있습니다.
위 절차의 부수적 이점은 프로젝트가 git에 저장되지 않은 로컬 파일에 의존하는지 확인할 수 있다는 것입니다. 누락된 파일을 찾으면 "my_broken_local_repo"에서 복사하여 git에 추가할 수 있습니다. 새 로컬 저장소에 필요한 모든 것이 있다고 확신하면 "my_broken_local_repo"를 삭제할 수 있습니다.
Adam Gawne-Cain출처 : http:www.stackoverflow.com/questions/5097456/throw-away-local-commits-in-git