문제

커밋을 삭제하는 방법을 알고 싶습니다.

에 의해 delete, 마치 마치 그 커밋을하지 않은 것처럼, 앞으로 추진할 때, 나의 변화는 원격 지점으로 밀리지 않을 것입니다.

나는 git 도움을 읽고 내가 사용해야하는 명령은 git reset --hard HEAD. 이 올바른지?

도움이 되었습니까?

해결책

주의 깊은: git reset --hard 작업 디렉토리 변경 사항을 삭제합니다. 확실히하십시오 보관하고 싶은 지역 변경 사항을 보관하십시오 이 명령을 실행하기 전에.

당신이 그 커밋에 앉아 있다고 가정하면,이 명령은 그것을 흔들어 줄 것입니다 ...

git reset --hard HEAD~1

그만큼 HEAD~1 머리 앞에 커밋을 의미합니다.

또는 출력을 볼 수 있습니다 git log, 백업하려는 커밋의 커밋 ID를 찾은 다음 다음 작업을 수행하십시오.

git reset --hard <sha1-commit-id>

이미 밀어 넣었다면, 당신은 그것을 제거하기 위해 힘을 밀어야 할 것입니다 ...

git push origin HEAD --force

하지만, 다른 사람들이 그것을 끌어 당겼다면, 당신은 새 지점을 시작하는 것이 더 나을 것입니다. 그들이 당기면, 그것은 단지 그것을 그들의 작업에 병합하고, 당신은 그것을 다시 밀어 올릴 것입니다.

이미 밀면 사용하는 것이 더 낫습니다. git revert, 변경 사항을 취소 할 "미러 이미지"커밋을 만들려면. 그러나 두 커밋 모두 로그에 있습니다.


참고 - git reset --hard HEAD 진행중인 작업을 없애고 싶다면 좋습니다. 그것은 당신을 가장 최근의 커밋으로 다시 재설정하고 작업 트리와 색인의 모든 변경 사항을 지우게됩니다.


마지막으로, "삭제 된"커밋을 찾아야하는 경우 일반적으로 git reflog 쓰레기가 저장소를 수집하지 않는 한.

다른 팁

아직 커밋을 어디에도 밀지 않은 경우 사용할 수 있습니다. git rebase -i 그 커밋을 제거합니다. 먼저, 그 커밋이 얼마나 멀리 떨어져 있는지 알아보십시오 (대략). 그런 다음 :

git rebase -i HEAD~N

그만큼 ~N 마지막으로 다시 반사를 의미합니다 N 커밋 (N 예를 들어 숫자 여야합니다 HEAD~10). 그런 다음 GIT가 제공하는 파일을 편집하여 불쾌한 커밋을 삭제할 수 있습니다. 해당 파일을 저장할 때 Git은 삭제 한 사람이 존재하지 않는 것처럼 다음 커밋을 다시 작성합니다.

git 책에는 좋은 책이 있습니다 Rebasing에 관한 섹션 그림과 예제.

그래도 조심하십시오. 가지다 다른 곳으로 밀려 나면 힘을 푸시하려고하지 않는 한 또 다른 접근 방식이 필요합니다.

또 다른 가능성은 제가 개인적으로 가장 좋아하는 명령 중 하나입니다.

git rebase -i <commit>~1

대화식 모드에서 Rebase가 시작됩니다 -i 커밋 직전의 시점에서 당신은 멍청이를 원합니다. 편집자는 그 이후로 모든 커밋을 시작합니다. 말살하려는 커밋이 포함 된 줄을 삭제하고 파일을 저장하십시오. Rebase는 나머지 작업을 수행하여 해당 커밋 만 삭제하고 다른 모든 것을 다시 로그로 재생합니다.

나는 일을 저지를 시도한 사람이 GIT를 사용한 실수로 인해 그 모든 작업을 삭제하고 싶어하는 이유를 알지 못하기 때문에이 답을 추가하고 있습니다!

작업을 유지하고 그 커밋 명령을 '취소'하고 싶다면 (REPO로 추진하기 전에 잡았습니다) :

git reset --soft HEAD~1

-HARD를 사용하지 마십시오 마지막 커밋 이후 진행중인 작업을 파괴하고 싶지 않다면 깃발.

전체 커밋을 제거합니다

git rebase -p --onto SHA^ SHA

분명히 "sha"를 제거하려는 참조로 바꾸십시오. 그 명령에서 "^"은 문자 그대로입니다.

http://sethrobertson.github.io/gitfixum/fixup.html

변경 사항을 게시하지 않았다면 최신 커밋을 제거하기 위해

$ git reset --hard HEAD^

(이것은 또한 커밋되지 않은 모든 변경 사항을 제거 할 수 있습니다. 조심스럽게 사용하십시오).

이미 삭제 된 커밋을 게시 한 경우 사용하십시오 git 되돌립니다

$ git revert HEAD
git reset --hard commitId

git push <origin> <branch> --force

추신 : CommitID는 다시 되돌릴 것을 말합니다.

저장소에서 Commits 2 & 4를 제거하고 싶다고 가정 해 봅시다.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

메모: repo에 대한 관리자 권한이 있어야합니다 당신이 사용하고 있기 때문에 --hard 그리고 -f.

  • git checkout b3d92c5 마지막으로 사용할 수있는 커밋을 확인하십시오.
  • git checkout -b repair 작업 할 새 지점을 만듭니다.
  • git cherry-pick 77b9b82 Commit 3을 통과합니다.
  • git cherry-pick 2c6a45b 커밋 1을 통과합니다.
  • git checkout master 결제 마스터.
  • git reset --hard b3d92c5 마스터를 마지막으로 사용 가능한 커밋으로 재설정하십시오.
  • git merge repair 새 지점을 마스터로 병합하십시오.
  • git push -f origin master 마스터를 원격 저장소로 푸시하십시오.

역사를 강력하게 변화시킵니다

마지막 커밋을 삭제하고 싶지 않다고 가정하면 마지막 N 커밋의 특정 커밋을 삭제하려고한다고 가정하십시오.

git rebase -i HEAD~<number of commits to go back>, 그래서 git rebase -i HEAD~5 마지막 5 개 커밋을보고 싶다면.

그런 다음 텍스트 편집기에서 단어를 변경합니다 pick 에게 drop 모든 커밋 옆에 제거하고 싶습니다. 편집자를 저장하고 종료하십시오. 짜잔!

역사를 추가로 바꿉니다

노력하다 git revert <commit hash>. 돌아가는 것 a 새로운 지정된 커밋을 취소하는 것을 커밋하십시오.

최신 커밋을 수정하려면 커밋을 취소하고 파일을 단계적으로 해제 할 수 있습니다.

git reset HEAD~1

이렇게하면 GIT가 파일을 준비한 명령을 추가하기 전에 저장소를 상태로 반환합니다. 변경 사항은 작업 디렉토리에 있습니다. 헤드 ~ 1은 지점의 현재 끝 아래에 커밋을 나타냅니다.

커밋을하지 않으려는 경우, 코드를 작업 디렉토리에서 유지하십시오.

git reset HEAD~N

최신 커밋을 제거하고 코드 변경을 유지하려면 "하드"재설정을 수행 할 수 있습니다.

git reset --hard HEAD~1

마찬가지로, 마지막 N 커밋을 버리고 싶고 코드 변경을 유지하고 싶지 않은 경우.

git reset --hard HEAD~N
git rebase -i HEAD~2

여기 '2'는 당신이 리베이스하려는 커밋 수입니다.

'git rebase -i HEAD`

모든 커밋을 다시 비제하고 싶다면.

그러면이 옵션 중 하나를 선택할 수 있습니다.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

이 라인은 다시 주문할 수 있습니다. 그들은 위에서 아래로 실행됩니다. 여기서 줄을 제거하면 커밋이 손실됩니다. 그러나 모든 것을 제거하면 Rebase가 중단됩니다. 빈 커밋에 댓글을 달았습니다

옵션 "D"를 사용하여 해당 커밋을 제거하거나 커밋이있는 라인을 제거 할 수 있습니다.

로컬 브랜치에서 삭제하려면 사용하십시오

git reset --hard HEAD~1

원격 분기에서 삭제하려면 사용하십시오

git push origin HEAD --force

이 작업을 수행하는 또 다른 방법은 다음과 같습니다.

되돌릴 지점을 확인한 다음 원격 서버에서 최신 사본이되기를 원하는 커밋으로 로컬 작업 사본을 다시 재설정하십시오 (이후의 모든 것이 바이 색으로 갈 것입니다). 이를 위해 Sourcetree에서 나는 "이 커밋에 대한 BranchName을 재설정"에서 마우스 오른쪽 버튼으로 클릭했습니다. 명령 줄은 다음과 같습니다.

git reset --hard COMMIT_ID

리모컨에서 지점을 체크 아웃 했으므로 잃어버린 것에 대해 걱정할 로컬 변경 사항이 없을 것입니다. 그러나 당신이 그렇게한다면 이것은 그들을 잃을 것입니다.

그런 다음 저장소의 로컬 디렉토리로 이동 하여이 명령을 실행하십시오.

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

이것은 로컬 저장소의 현재 커밋 후에 모든 커밋을 지우지 만 해당 분기에 대해서만 지우칩니다.

실수:

git rebase -i --root'내 지점에서, 나는 무지하게 내가 마스터와 다른 첫 번째 커밋을 되풀이 할 수 있다고 생각했다 ( Windows 용 Github 기본보기는 마스터와 비교하여 전체를 숨기는 것입니다).

나는 실리콘 밸리 수염을 키웠고 900+가 숭고한 커밋을 숭배했다. 변경없이 나가면서 배터리를 충전 한 다음 900 명 이상의 개인이 무의미하게 재조정하여 커밋 시간을 재설정했습니다.

GIT를 이기고 원래 시간을 보존하기로 결정한이 로컬 리포지토리를 삭제하고 리모컨에서 다시 클로닝했습니다.

이제 그것은 내가 제거하고 싶었던 마스터에게 가장 최근의 불필요한 헌신을 다시 설명했습니다.

옵션 소진 :

나는 원하지 않았다 git revert - 추가 커밋을 만들어 git에게 우위를주었습니다.

git reset --hard HEAD 확인한 후 아무것도하지 않았습니다 reflog, 마지막과 유일한 HEAD 클론 - git 승리.

가장 최근의 SHA를 얻으려면 Github.com -Minor Win의 원격 저장소를 확인했습니다.

생각 후 git reset --hard <SHA> 일했고, 나는 다른 지점을 마스터에게 업데이트했고 1 ... 2 ... 푸프! 커밋이 돌아 왔습니다 - git 승리.

마스터에게 다시 확인하고 시도 할 시간 git rebase -i <SHA>, 그런 다음 라인을 제거하십시오. "여기서 줄을 제거하면 커밋이 손실됩니다.". 아 ... 새로운 기능에 대해 글로스 N00B를 트롤하십시오 에서 2.8.3 릴리스 노트.

해결책:

git rebase -i <SHA> 그 다음에 d, drop = remove commit.

확인하기 위해, 나는 다른 지점에 체크 아웃하고 Voila- 마스터에서 가져 오기 위해 숨어 있지 않습니다.

https://twitter.com/holman/status/706006896273063936

당신에게 좋은 일.

위의 모든 명령은 작업 트리의 상태를 복원하고 커밋을 만들기 전과 같이 색인을 복원하지만 저장소 상태를 복원하지는 않습니다. 당신이 그것을 보면, "제거 된"커밋은 실제로 제거되지 않았으며, 그것은 단순히 현재 지점 끝에있는 것이 아닙니다.

커밋을 제거 할 수단이 없다고 생각합니다. 도자기 명령. 유일한 방법은 로그와 리플 로그에서 그것을 제거한 다음 git prune --expire -now.

원천: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf22916cf79d8

마지막 커밋을 삭제하십시오

예를 들어 마지막 커밋

git 푸시 원점 +aa61ab32^: 마스터

이제이 커밋을 삭제하고 다음을 수행하는 쉬운 방법을 삭제하려고합니다.

단계

  1. 먼저 현재 커밋의 부모에게 분기를 재설정합니다.

  2. 원격으로 강제로 푸시하십시오.

git reset HEAD^ --hard

git push origin -f

특별히 커밋하려면 재설정하고 싶습니다.

git reset bb676878^ --hard

git push origin -f

마지막으로 커밋을 엉망으로 만들었다면 (잘못된 메시지, 약간의 변경 사항을 추가하는 것을 잊어 버렸고) 공개 저장소에 밀어 넣기 전에 수정하고 싶으십시오.

git commit --amend -m "New message here"

새로 준비된 변경 사항이 있으면 마지막 커밋 (제거하려는 커밋)과 결합되어 해당 커밋을 대체합니다.

물론 당신이 그것을 추진 한 후 커밋을 수정한다면, 당신은 기록을 다시 쓰고 있으므로, 그렇게한다면 그 의미를 이해해야합니다.

이전 커밋의 메시지를 사용하려면 '-m'대신 '-no-edit'옵션을 전달할 수도 있습니다.

문서 :http://git-scm.com/docs/git-commit.html

역사를 유지하고 커밋과 역전을 보여 주려면 다음을 사용해야합니다.

git revert GIT_COMMIT_HASH

왜 되돌아 가는지 설명하는 메시지를 입력 한 다음 :

git push  

당신이 발행 할 때 git log "잘못된"커밋 및 복귀 로그 메시지가 모두 표시됩니다.

이미 밀고 있다면 먼저 머리에 가고 싶은 커밋을 찾으십시오. ($ git_commit_hash_here), 다음을 실행하십시오.

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

그런 다음 각 장소에 레포가 복제되고 실행되었습니다.

git reset --hard origin/master

내가 저지르고 밀 때 보통 내가하는 일 (누군가가 그의 커밋을 밀어 본다면 문제를 해결한다면) :

git reset --hard HEAD~1

git push -f origin

이 도움을 바랍니다

현지 지점에서 재설정하십시오

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

힘을 원산으로 밀어 넣으십시오

git push -f origin

코드를 임시 폴더로 백업하십시오. 다음 명령이 서버와 동일하게 재설정됩니다.

git reset --hard HEAD
git clean -f
git pull

변경 사항을 유지하고 최근 커밋을 제거하려면

git reset --soft HEAD^
git pull

delete local commit

위의 이미지에서 볼 수 있듯이 "Test Change 2"Commit (SHA1 ID : 015B5220C50E3DFBB1063F23789D92AE1D3481A2(사용하여 SHA1 ID를 얻을 수 있습니다 gitk git bash의 명령)).

이를 위해 사용할 수 있습니다 (아래의 모든 명령 작업은 로컬에서만 작동합니다. 삭제 후 푸시해야합니다) :

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 // 해당 커밋으로 백업합니다 (SHA1 ID의 ID 테스트 변경 4 커밋입니다 515B5220C50E3DFBB1063F23789D92AE1D3481A2)
  2. git reset --hard HEAD~1 // 한 커밋 전에 백업합니다.
  3. git reset --hard HEAD^ // git에서 마지막 커밋을 제거합니다

삭제 후 :

after delete commit

나는 이미 밀었다. 일부 커밋을 원격으로 반환해야합니다. 많은 변형을 시도했지만 이것 ~에서 저스틴 Git Bush를 통해 나에게 잘 작동합니다.

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

git 리셋 -하드

Git Push Origin 헤드 -포스

커밋 중 하나 이상이 태그가 지정된 경우 먼저 태그를 삭제하십시오. 그렇지 않으면 태그 커밋이 제거되지 않습니다.

// display git commit log    
$ git log --pretty=oneline --abbrev-commit

// show last two commit and open in your default editor
// then delete second commit line and save it
$ git rebase -i HEAD~2

참조: GIT, 로컬 및 원격에서 커밋을 삭제하는 방법

원격 저장소로 밀지 않았다고 가정하면 저장소를 다시 클릭 할 수 있습니다. 이것은 나의 선택 방법 몇 번이었습니다.

git 리버드를 사용하십시오 https://git-scm.com/docs/git-revert . 모든 코드를 되돌릴 경우 다음 커밋을 수행 할 수 있습니다. 취소 된 커밋은 결코 삭제되지 않지만 마지막 커밋에 영향을 미치지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top