programing

Git에서 로컬 커밋 삭제

mailnote 2023. 5. 1. 21:41
반응형

Git에서 로컬 커밋 삭제

일부 나쁜 체리 따기 때문에, 제 지역 Git 저장소는 현재 오리진보다 5 커밋 앞서 있으며, 상태가 좋지 않습니다.저는 이 모든 커밋을 없애고 다시 시작하고 싶습니다.

분명히 제 작업 디렉토리를 삭제하고 다시 복제하면 됩니다. 하지만 깃허브에서 모든 것을 다시 다운로드하는 것은 과잉 작업인 것 같고, 제 시간을 잘 사용하지 못합니다.

아마도요.git revert제가 필요로 하는 것은 코드 자체가 올바른 상태로 돌아간다고 해도, 저는 원점(또는 6개)보다 10개의 커밋을 앞서게 하고 싶지 않습니다.마지막 30분은 없었던 것처럼 하고 싶습니다.

이를 수행할 간단한 명령이 있습니까?명백한 사용 사례처럼 보이지만, 예를 찾을 수 없습니다.


이 질문은 특히 커밋에 대한 이지 다음에 대한 것이 아닙니다.

  • 추적되지 않은 파일
  • 단계적 변화
  • 단계적이지만 커밋되지 않은 변경사항

초커밋이사만볼수경있다우작수다수있니습행할업과을음는용자▁just▁do▁if▁can▁you다▁are▁commits있니습▁to▁excess수,.git reset --hard origin/<branch_name>원래 있던 곳으로 다시 이동합니다.그러면 리포지토리의 상태가 이전 커밋으로 재설정되고 모든 로컬 변경 내용이 삭제됩니다.

git revert모든 사람의 이력을 정상적으로 유지하는 방식으로 오래된 커밋을 제거하기 위해 새로운 커밋을 만듭니다.

수행한 작업을 중단하지 않고 최근 커밋을 삭제합니다.

git reset --soft HEAD~1

최근 커밋을 삭제하고 변경 사항을 제거합니다.

git reset --hard HEAD~1

로컬 마스터 분기를 삭제하고 다음과 같이 다시 만들기만 하면 됩니다.

git branch -D master
git checkout origin/master -b master

시도:

git reset --hard <the sha1 hash>

당신이 원하는 곳으로 당신의 머리를 재설정하는 것.gitk를 사용하여 어떤 커밋을 수행할 것인지 확인합니다.gitk 내에서도 리셋을 할 수 있습니다.

분기 시도 시:

git reset --hard origin/<branch_name>

을 " " "를 합니다.git log또는 "git status이 때문에

Atlassian SourceTree 앱을 사용하는 경우 상황에 맞는 메뉴에서 재설정 옵션을 사용할 수 있습니다.

여기에 이미지 설명 입력

간단한 해결 방법은 로컬 마스터 분기 HEAD를 오리진/마스터 분기 HEAD와 일치시키는 것입니다.

git reset --hard origin/master

PS: origin/master - 마스터 분기에 대한 원격 포인터입니다.마스터를 임의의 분기 이름으로 바꿀 수 있습니다.

git reset --hard @{u}커밋을 포함하여 현재 분기의 모든 로컬 변경 내용을 삭제합니다.어떤 약속으로 돌아가거나 나뭇가지를 가지고 놀지 않아도 된다는 것을 고려하면 아직 아무도 이것을 게시하지 않았다는 것이 놀랍습니다.

현재 인 즉, 현분로재합니다설로 합니다.@{upstream} -언트이origin/<branchname>하지만 항상은 아닙니다.

이 git 명령을 사용할 수 있습니다.

git reset --hard origin/<branch_name>

TL;DR

당신의 지점에서

git reset --hard HEAD^마지막 것을 버릴 것입니다.1

git reset --hard HEAD~n마지막 것을 버릴 것입니다.n 커밋

대답하기 전에 배경을 몇 가지 추가하고, 이것이 무엇인지 설명합니다.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 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하면 "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>

지정된 커밋 또는 커밋 범위를 "실행 취소"합니다.
재설정 명령은 지정된 커밋에서 변경한 내용을 "실행 취소"합니다.
원래 커밋이 기록에 남아 있는 동안 실행 취소 패치를 사용하여 새 커밋이 커밋됩니다.

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

여기에 이미지 설명 입력

최근에 만든 파일을 삭제하지 않고 마지막 커밋으로 되돌리려면 여러 번 사용합니다.

git reset --soft HEAD~1

사용할 경우

git reset HEAD <name-of-file/files*>

스테이지를 해제하거나 트랙을 해제합니다.

추적되지 않은 파일 제거(커밋되지 않은 로컬 변경)

git clean -df

모든 로컬 커밋을 영구적으로 삭제하고 최신 원격 커밋을 가져옵니다.

git reset --hard origin/<branch_name>

푸시되지 않은 커밋을 제거하려는 상황이 있었는데 커밋이 다른 커밋보다 먼저 발생했습니다.이를 위해 다음 명령을 사용했습니다.

git rebase -i HEAD~2의 커밋을 기반으로 합니다-> 마지두커다시기합로니다으반.

그리고 제거하고자 하는 커밋 서명에 'drop'을 사용했습니다.

다시 오고 싶은 커밋의 SHA-1 ID를 확인/얻기

gitk --all

해당 커밋으로 롤백하기

git reset --hard sha1_id

!참고: 해당 커밋 후에 수행된 모든 커밋이 삭제됩니다(그리고 프로젝트에 대한 모든 수정 사항).따라서 먼저 프로젝트를 다른 분기로 복제하거나 다른 디렉터리로 복사하는 것이 좋습니다.

이 ' origin/XXX5회의 커밋으로

발급 가능:

git reset --hard HEAD~5

그리고 마지막 5개의 커밋을 제거해야 합니다.

푸되지않로커경다수사있다습도니용할을 .git rebase -i커밋을 삭제하거나 압축합니다.

Visual Studio 솔루션에 관심이 있는 사용자를 위한 교육은 다음과 같습니다.

  1. Team Explorer창, 대상 repo에 연결합니다.
  2. 그럼부에서.Branches 오른쪽 버튼으로 하고 관심분마우오른버쪽로튼클으선릭다택니합고하스기를▁right다를 선택합니다.View history.
  3. 에서 커밋을 마우스 오른쪽 버튼으로 클릭합니다.History 에서선택을 합니다.Reset -> Delete changes (--hard).

그러면 로컬 커밋이 삭제되고 보고서 상태가 선택한 커밋으로 재설정됩니다.즉, 레포를 풀한 후 변경 내용이 손실됩니다.

갱신하다

위의 절차는 VS2019까지는 잘 작동합니다. VS2022는 New Git Experience입니다.워크플로우는 비슷하지만 UI가 조금 다릅니다.에 에.Team Explorer,사용하다Manage BranchesGit이제 왼쪽에 있는 분기를 클릭하면 해당 분기의 내역이 오른쪽에 표시됩니다. 가봐요.Right Click -> Reset -> Delete Changes (--hard)

한 내용을 하려면 를 합니다.
git reset @~
문제를 했습니다.

다음으로 되돌릴 커밋의 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
git reset --hard <SHA-Code>

로컬 복사본에서 실수로 원격 지점에 푸시되지 않도록 몇 가지 오류가 발생한 경우 유용합니다.

SHA-Code는 분기의 마지막 커밋에 대한 git 대시보드의 webVersion을 확인하여 얻을 수 있습니다.

이렇게 하면 분기의 마지막 커밋과 동기화될 수 있습니다.

할수있습니다git pull하드 재설정을 성공적으로 완료하여 동기화에 새로운 내용이 없음을 확인한 후, 즉 메시지를 볼 수 있습니다.

의 지점은 입니다.Origin/<Branch Name>

업데이트됨:

https://git-lfs.github.com/ 에서 새로운 GIT LFS를 사용할 수 있습니다.

git lfs migrate import --include="*.file_type"

그 다음에 겟푸시

drop 명령을 사용하여 대화형 리베이스를 사용하는 방법을 확인할 수 있습니다.

그러니까 지난 세 번의 범행은...

git rebase -i HEAD~3

선택 명령을 스왑 아웃합니다.

pick <hash1> Commit message 1
pick <hash2> Commit message 2
pick <hash3> Commit message 3

drop 명령의 경우

drop <hash1> Commit message 1
drop <hash2> Commit message 2
drop <hash3> Commit message 3

지역 보고서를 완전히 엉망으로 만든다면 Git의 지역 커밋을 버리는 믿을만한 방법은...

  1. "git config --get remote.origin.url"을 사용하여 원격 오리진의 URL을 가져옵니다.
  2. 로컬 Git 폴더의 이름을 "my_broken_local_repo"로 변경합니다.
  3. "git clone <url_from_1>을 사용하여 원격 git 저장소의 새 로컬 복사본을 가져옵니다.

제 경험으로 볼 때 이클립스는 변화하는 세상을 꽤 잘 처리합니다.그러나 Eclipse에서 영향을 받는 프로젝트를 선택하고 이를 치료하여 Eclipse가 이를 다시 빌드하도록 해야 할 수도 있습니다.다른 IDE도 강제 재구성이 필요할 수 있습니다.

위 절차의 부가적인 이점은 프로젝트가 git에 넣지 않은 로컬 파일에 의존하는지 여부를 확인할 수 있다는 것입니다.파일이 누락된 경우 "my_broken_local_repo"에서 파일을 복사하여 git에 추가할 수 있습니다.새 로컬 레포에 필요한 모든 것이 있다는 확신이 들면 "my_broken_local_repo"를 삭제할 수 있습니다.

모든 단계별 변경사항에 대해git checkout -- .

파일의 git checkout -- path/to/file/to/revert

언급URL : https://stackoverflow.com/questions/5097456/throw-away-local-commits-in-git

반응형