커밋을 삭제하는 방법을 알고 싶습니다.
delete
는 마치 내가 그 커밋을 하지 않은 것과 같고, 나중에 푸시를 할 때 변경 사항이 원격 브랜치로 푸시되지 않음을 의미합니다.
나는 git help를 읽었고 사용해야 할 명령은 git reset --hard HEAD
라고 생각합니다. 이 올바른지?
질문자 :hap497
커밋을 삭제하는 방법을 알고 싶습니다.
delete
는 마치 내가 그 커밋을 하지 않은 것과 같고, 나중에 푸시를 할 때 변경 사항이 원격 브랜치로 푸시되지 않음을 의미합니다.
나는 git help를 읽었고 사용해야 할 명령은 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
는 WORK IN PROGRESS 를 없애고 싶다면 아주 좋습니다. 가장 최근 커밋으로 재설정하고 작업 트리와 인덱스의 모든 변경 사항을 지웁니다.
마지막으로 "삭제"한 커밋을 찾아야 하는 경우 저장소를 가비지 수집하지 않는 한 git reflog
아직 커밋을 푸시하지 않은 경우 git rebase -i
를 사용하여 해당 커밋을 제거할 수 있습니다. 먼저 해당 커밋이 (대략) 얼마나 멀리 있는지 확인하십시오. 그런 다음 다음을 수행합니다.
git rebase -i HEAD~N
~N
N
커밋을 리베이스함을 의미 N
은 숫자여야 합니다 HEAD~10
). 그런 다음 Git이 제공하는 파일을 편집하여 문제가 되는 커밋을 삭제할 수 있습니다. 해당 파일을 저장하면 Git은 삭제한 커밋이 존재하지 않는 것처럼 다음 모든 커밋을 다시 작성합니다.
Git Book에는 그림과 예제를 사용한 리베이스에 대한 좋은 섹션이 있습니다.
당신은 당신이 다른 곳에서 밀어 것을 무언가를 변경하는 경우, 다른 방법은 당신이 힘 푸시를 할 계획하지 않는 한 필요하기 때문에,이 생각에주의하십시오.
또 다른 가능성은 내가 개인적으로 가장 좋아하는 명령 중 하나입니다.
git rebase -i <commit>~1
이것은 당신이 치고 싶은 커밋 직전의 지점 -i
에서 리베이스를 시작할 것입니다. 편집기는 그 이후로 모든 커밋을 나열하기 시작합니다. 삭제하려는 커밋이 포함된 라인을 삭제하고 파일을 저장합니다. Rebase는 나머지 작업을 수행하여 해당 커밋만 삭제하고 나머지는 모두 다시 로그로 재생합니다.
방금 작업을 커밋하려고 시도한 사람이 Git을 사용하는 실수로 인해 해당 작업을 모두 삭제하려는 이유를 알 수 없기 때문에 이 답변을 추가합니다!
작업을 유지하고 커밋 명령을 '실행 취소'하고 싶다면(리포지토리로 푸시하기 전에 잡았습니다):
git reset --soft HEAD~1
마지막 커밋 이후 진행 중인 작업을 삭제하지 않으려면 --hard 플래그를 사용하지 마십시오.
전체 커밋 제거
git rebase -p --onto SHA^ SHA
분명히 "SHA"를 제거하려는 참조로 바꾸십시오. 해당 명령의 "^"는 리터럴입니다.
http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep
저장소에서 커밋 2와 4를 제거하고 싶다고 가정해 보겠습니다. (숫자가 높을수록 최신 커밋, 0은 가장 오래된 커밋, 4는 최신 커밋)
commit 0 : b3d92c5 commit 1 : 2c6a45b commit 2 : <any_hash> commit 3 : 77b9b82 commit 4 : <any_hash>
참고: --hard
및 -f
사용 하고 있으므로 저장소에 대한 관리자 권한이 필요합니다 .
git checkout b3d92c5
마지막으로 사용 가능한 커밋을 체크아웃합니다.git checkout -b repair
작업할 새 분기를 만듭니다.git cherry-pick 77b9b82
커밋 3을 실행합니다.git cherry-pick 2c6a45b
커밋 1을 실행합니다.git checkout master
체크 아웃 마스터.git reset --hard b3d92c5
마스터를 마지막으로 사용 가능한 커밋으로 재설정합니다.git merge repair
새 브랜치를 마스터에 병합합니다.git push -f origin master
마스터를 원격 저장소로 푸시합니다.변경 사항을 게시하지 않은 경우 최신 커밋을 제거하려면 다음을 수행할 수 있습니다.
$ git reset --hard HEAD^
(이렇게 하면 커밋되지 않은 모든 변경 사항도 제거됩니다. 주의해서 사용하십시오.)
삭제 예정 커밋을 이미 게시한 경우 git revert를 사용합니다.
$ git revert HEAD
git reset --hard commitId git push <origin> <branch> --force
추신: CommitId는 되돌리려는 항목을 나타냅니다.
강제로 기록 변경
마지막 커밋만 삭제하는 것이 아니라 마지막 n개 커밋의 특정 커밋을 삭제한다고 가정하고 다음을 수행합니다.
git rebase -i HEAD~<number of commits to go back>
이므로 마지막 5개 커밋을 보려면 git rebase -i HEAD~5
그런 다음 텍스트 편집기에서 제거하려는 모든 커밋 옆에 pick
을 drop
저장하고 편집기를 종료합니다. 짜잔!
추가 변경 기록
git revert <commit hash>
시도하십시오. 되돌리기 는 지정된 커밋을 취소 하는 새 커밋을 만듭니다.
예를 들어 다음과 같은 많은 대안이 있습니다.
대안 1:
git rebase -i <YourCommitId>~1
되돌리려는 커밋 번호에 대해 YourCommitId를 변경합니다.
대안 2:
git reset --hard YourCommitId git push <origin> <branch> --force
되돌리려는 커밋 번호에 대해 YourCommitId를 변경합니다.
진행 중인 작업을 잃을 수 있으므로 이 옵션을 권장하지 않습니다.
대안 3:
git reset --soft HEAD~1
작업을 유지하고 커밋만 취소할 수 있습니다.
최신 커밋을 수정하려면 다음을 수행하여 커밋을 실행 취소하고 그 안의 파일을 언스테이징할 수 있습니다.
git reset HEAD~1
이렇게 하면 파일을 준비한 git add 명령 이전의 상태로 저장소가 반환됩니다. 변경 사항은 작업 디렉토리에 있습니다. HEAD~1은 분기의 현재 끝 아래에 있는 커밋을 나타냅니다.
N 커밋을 언커밋하고 싶지만 코드 변경 사항을 작업 디렉토리에 유지하려면 다음을 수행하십시오.
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
이 줄은 재정렬할 수 있습니다. 그들은 위에서 아래로 실행됩니다. 여기에서 줄을 제거하면 커밋이 손실됩니다. 그러나 모든 것을 제거하면 리베이스가 중단됩니다. 빈 커밋은 주석 처리됩니다.
옵션 "d" 또는 커밋이 있는 줄 제거를 사용하여 해당 커밋을 간단히 제거할 수 있습니다.
로컬 분기에서 삭제하려면 다음을 사용하십시오.
git reset --hard HEAD~1
원격 분기에서 삭제하려면 다음을 사용하십시오.
git push origin HEAD --force
출처: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
예를 들어 마지막 커밋
자식 푸시 원본 +aa61ab32^:마스터
이제이 커밋을 삭제하고 다음을 수행하는 쉬운 방법을 원합니다.
단계
먼저 현재 커밋의 부모로 분기를 재설정합니다.
리모컨에 강제로 밀어 넣습니다.
git reset HEAD^ --hard git push origin -f
특정 커밋의 경우 재설정하려는 다음은 다음과 같습니다.
git reset bb676878^ --hard git push origin -f
이 작업을 수행하는 또 다른 방법은 다음과 같습니다.
되돌리려는 브랜치를 체크아웃한 다음 로컬 작업 복사본을 원격 서버의 최신 커밋이 되도록 다시 설정합니다(이후의 모든 작업은 바이바이). 이렇게 하려면 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 revert GIT_COMMIT_HASH
되돌리는 이유를 설명하는 메시지를 입력한 다음:
git push
git log
를 실행하면 "잘못된" 커밋과 되돌리기 로그 메시지가 모두 표시됩니다.
위의 모든 명령은 작업 트리 및 인덱스의 상태를 커밋하기 전의 상태로 복원하지만 저장소의 상태를 복원하지는 않습니다. 보시면 "제거된" 커밋이 실제로 제거된 것이 아니라 단순히 현재 분기의 끝에 있는 커밋이 아닙니다.
porcelain 명령 으로 커밋을 제거하는 방법은 없다고 생각합니다. 유일한 방법은 로그 및 reflog에서 제거한 다음 git prune --expire -now
를 실행하는 것입니다.
실수:
나는 git rebase -i --root
'ed my branch, 내가 마스터와 다른 첫 번째 커밋의 단어를 바꿀 수 있다고 무지하게 생각했다( Windows용 GitHub 기본 보기는 마스터에 대한 비교이며 전체를 숨김).
900개 이상의 커밋이 Sublime에 로드되는 동안 실리콘 밸리의 수염을 키웠습니다. 변경 사항 없이 종료하고 배터리를 충전한 다음 면도를 진행했습니다. 900명 이상의 모든 개인이 아무렇지 않게 재기준하여 커밋 시간을 지금으로 재설정했기 때문입니다.
Git을 이기고 원래 시간을 유지하기로 결정한 저는 이 로컬 저장소를 삭제하고 원격에서 다시 복제했습니다.
이제 내가 제거하고 싶은 마스터에 대한 가장 최근의 불필요한 커밋을 다시 추가했기 때문에 그렇게 진행했습니다.
옵션 소진:
git revert
원하지 않았습니다. 추가 커밋이 생성되어 Git이 우위를 점할 수 있었습니다.
git reset --hard HEAD
reflog
확인한 후 아무 것도 하지 않았으며 마지막이자 유일한 HEAD
는 클론이었습니다. Git이 이깁니다.
최신 SHA를 얻으려면 github.com에서 원격 저장소를 확인했습니다.
git reset --hard <SHA>
가 작동했다고 생각한 후 다른 분기를 master로 업데이트하고 1... 2... poof! 커밋이 돌아왔습니다 - Git이 이겼습니다.
마스터로 다시 확인하고 git rebase -i <SHA>
를 시도한 다음 줄을 제거하십시오. 소용이 없습니다. 슬프게도 말입니다. " 여기에서 줄을 제거하면 커밋이 손실됩니다 ". 아... 2.8.3 릴리스 노트 에서 n00b의 새로운 기능에 대해 설명했습니다.
해결책:
git rebase -i <SHA>
다음 d, drop = remove commit
.
확인하기 위해 다른 지점으로 체크아웃했는데, 짜잔-마스터에서 가져오기/끌어오기에 대한 숨기기 커밋이 없습니다.
https://twitter.com/holman/status/706006896273063936
당신에게 좋은 일.
마지막 커밋을 엉망으로 만들고(잘못된 메시지, 일부 변경 사항을 추가하는 것을 잊음) 공개 리포지토리에 푸시하기 전에 수정하고 싶다면 다음을 사용하지 않는 이유는 다음과 같습니다.
git commit --amend -m "New message here"
새로 준비된 변경 사항이 있는 경우 마지막 커밋(제거하려는)과 결합되어 해당 커밋을 대체합니다.
물론 푸시한 후 커밋을 수정하면 기록을 다시 작성하게 되므로 그렇게 하면 의미를 확실히 이해하게 됩니다.
이전 커밋의 메시지를 사용하려는 경우 '-m' 대신 '--no-edit' 옵션을 전달할 수도 있습니다.
내가 커밋하고 푸시할 때 일반적으로 수행하는 작업(누군가 커밋을 푸시하면 문제가 해결됨):
git reset --hard HEAD~1 git push -f origin
이 도움을 바랍니다
나는 이미 밀어붙였다. 일부 커밋을 원격으로 반환해야 합니다. 많은 변형을 시도했지만 git Bush를 통한 Justin의 이것 만이 저에게 잘 작동합니다.
git reset --hard $GIT_COMMIT_HASH_HERE git push origin HEAD --force
이미 푸시한 경우 먼저 HEAD ($GIT_COMMIT_HASH_HERE) 에 있고 싶은 커밋을 찾은 후 다음을 실행합니다.
git reset --hard $GIT_COMMIT_HASH_HERE git push origin HEAD --force
그런 다음 repo가 복제된 각 위치에서 다음을 실행합니다.
git reset --hard origin/master
로컬 지점에서 재설정
git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3
원점으로 강제 푸시
git push -f 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 reset --hard HEAD~1
당신은 지금 이전 머리에있을 것입니다. 가지를 당깁니다. 새 코드를 푸시합니다. 커밋이 git에서 제거됩니다.
여기에 나는 그렇게하기 위해 하나의 명확한 파이프 라인을 게시합니다.
1단계: git log를 사용하여 커밋 ID를 가져옵니다.
git log
2단계: git reset을 사용하여 이전 버전으로 돌아갑니다.
git reset --hard <your commit id>
임시 폴더에 코드를 백업하십시오. 다음 명령은 서버와 동일하게 재설정됩니다.
git reset --hard HEAD git clean -f git pull
변경 사항을 유지하고 최근 커밋을 제거하려면
git reset --soft HEAD^ git pull
위 이미지에서 볼 수 있듯이 되돌리기 "테스트 변경 2" 커밋(SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (git bash에서 gitk
명령을 사용하여 SHA1 ID를 얻을 수 있음))을 삭제하고 싶습니다.
그것을 위해 나는 사용할 수 있습니다 (아래의 모든 명령은 로컬에서만 작동합니다. 삭제 후 푸시해야 함) :
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
// 해당 커밋으로 백업합니다( 테스트 변경 4 커밋 의 SHA1 ID는 515b5220c50e3dfbb1063f23789d )481a1git reset --hard HEAD~1
// 커밋하기 전에 백업합니다.git reset --hard HEAD^
// git에서 마지막 커밋을 제거하려면삭제 후:
자식 재설정 --하드
git push origin HEAD --force
하나 이상의 커밋에 태그가 지정된 경우 먼저 태그를 삭제합니다. 그렇지 않으면 태그가 지정된 커밋이 제거되지 않습니다.
나를 위해 rebase 가 트릭을 수행했습니다.
$ git rebase -i HEAD~98 # Delete everything except for the most recent commit on the shown editor caused by "rebase" $ git push origin -f production-static
참고: 내 댓글을 줄이기 위해 푸시를 한 후. 그런 다음 다른 파일 세트를 푸시한 다음 다른 컴퓨터에서 동일한 "리포지토리 및 분기"로 가져오기를 시도했습니다. 의외로 갈등이 없습니다. 이것은 동일한 git을 사용하는 다른 로컬에서 pull 충돌을 피하면서 저장소 크기를 줄이는 방법이 되었습니다.
출처 : http:www.stackoverflow.com/questions/1338728/delete-commits-from-a-branch-in-git
JavaScript 객체에 키가 있는지 확인하시겠습니까? (0) | 2021.10.07 |
---|---|
기존 Git 분기가 원격 분기를 추적하도록 하시겠습니까? (0) | 2021.10.07 |
Git으로 변경된 여러 파일 중 하나의 파일만 보관하시겠습니까? (0) | 2021.10.07 |
디렉토리의 모든 파일을 어떻게 나열합니까? (0) | 2021.10.07 |
목록에서 항목의 인덱스 찾기 (0) | 2021.10.07 |