ProgramingTip

git 커밋을 삭제하지만 변경 사항을 사용할 수 있습니까?

bestdevel 2020. 9. 28. 09:38
반응형

git 커밋을 삭제하지만 변경 사항을 사용할 수 있습니까?


개발 브랜치 중 하나에서 코드베이스를 약간 변경했습니다. 작업중 인 기능을 완료하기 전에 일부 기능을 데모하기 위해 현재 브랜치를 마스터로 전환해야했습니다. 그러나 "git checkout master"를 사용하는 것만으로도 개발 브랜치에서 변경된 내용이 보존되어 master의 일부 기능이 손상되었습니다. 그래서 제가 한 것은 "임시 커밋"이라는 커밋 메시지와 함께 개발 브랜치에 변경 사항을 커밋 한 다음 데모를위한 체크 아웃 마스터였습니다.

이제 작업을 마치고 다시 개발 브랜치 작업으로 돌아가서 변경 사항을 유지하면서 "임시 커밋"을 제거하고 싶습니다. 할 수 있습니까?


다음과 같이 간단합니다.

git reset HEAD^

git reset없이 --hard또는 파일을 변경하지 않고 지정된 커밋을 가리 키도록 --soft이동합니다 HEAD. HEAD^현재 커밋의 (첫 번째) 부모 커밋을 사용하고, 귀하의 경우에는 임시 커밋 이전의 커밋입니다.

또 다른 옵션은 대신 수행 한 다음 다음 커밋 지점에서 실행하는 것입니다.

git commit --amend [-m … etc]

대신 가장 최근 커밋을 편집 하여 위와 동일한 효과를 갖습니다.

이 (거의 모든 git 답변과 옵션) 이미 다른 사람이 위치에 나쁜 커밋을 푸시와 옵션에 있습니다. 그것을 피하십시오


이를 처리하는 방법에는 두 가지가 있습니다. 상황에 따라 더 쉬운

초기화

제거하려는 커밋이 마지막 커밋이고 추가 작업을 수행하지 않을 경우 간단히 사용할 수 있습니다. git-reset

git reset HEAD^

현재 HEAD 직전의 커밋으로 분기를 다시 가져옵니다. 그러나 실제로 작업 트리의 파일을 변경하기 위해. 결과적으로 해당 커밋의 변경 사항이 수정 된 표시됩니다. 마치 'uncommit'명령과 가변. 사실, 나는 그것을 사용할 수 있습니다.

git config --global alias.uncommit 'reset HEAD^'

그런 다음 git uncommit나중에 하나의 커밋을 백업하는 데 사용할 수 있습니다 .

스 쿼싱

커밋 스 쿼싱은 둘 이상의 커밋을 하나로 결합하는 것을 의미합니다. 나는 자주한다. 다음 완료하고 완전한 기능을 수행하고 커밋 메시지로 다시 커밋합니다.

git rebase -i <ref>

나는 이것이 어떤 수의 커밋이 될 수 있다는 것을 분명히하고 싶기 때문에 분명히 말한 것입니다. git log하려는 커밋을 제거 실행 하고 찾은 다음 SHA1을 복사하여 <ref>. Git은 대화 형 리베이스 모드로 안내합니다. 현재 상태와 그 자리에 넣은 모든 것 사이의 모든 커밋을 표시합니다 <ref>. 따라서 <ref>10 개 커밋 전이면 10 개 커밋을 모두 표시합니다.

각 커밋 앞에는 단어가 pick있습니다. 를 사용하여 제거과에서 변경하려는 커밋 찾기 pickfixupsquash. 사용 fixup하면 메시지를 커밋하고 변경 사항을 목록의 바로 전임자에 병합합니다. squash키워드는 같은 일을하지만, 당신이 새롭게 결합 된 커밋의 커밋 메시지를 편집 할 수 있습니다.

커밋은 편집기를 종료 할 때 목록에 순서대로 다시 커밋됩니다. 따라서 임시 커밋을 만든 다음 동일한 브랜치에서 다른 작업을 수행하고 나중에 커밋에서 기능을 완료 한 경우 rebase를 사용하면 커밋을 다시 정렬하고 스쿼시 할 수 있습니다.

경고 :

리베이스는 히스토리를 수정합니다-다른 개발자와 이미 공유 한 커밋에 대해 작업을 수행하지 않습니다.

은닉

git stash앞으로이 문제를 방지하기 위해 커밋되지 않은 작업을 임시로 저장 하는 사용 하는 것이 좋습니다.

git stash save 'some message'

다음 현재 변경 사항이 숨김 목록에 저장됩니다. 위는 숨김 명령의 가장 명시적인 버전으로, 당신이 숨기고있는 것을 설명하는 주석을 허용합니다. 당신은 git stash아무것도 저장하지 않습니다.

당신은 당신의 숨김 목록을 찾아 볼 수 있습니다 ...

git stash list

이렇게하면 모든 보관함, 수행 된 분기, 메시지와 각 줄의 시작 부분 stash@{#}, #가 보관함 배열에서의 다음과 같은 해당 보관함의 식별자 가 표시됩니다.

숨김을 복원해야합니다 (숨김이 원래 생성 된 위치에 관계없이 분기에서 수행 할 수 있음).

git stash apply stash@{#}

다시 말하지만, #은 스 태시 배열의 위치입니다. 하려는 숨김이 복원 0위치 에있는 경우 (즉, 가장 최근 숨김 인 경우) 그런 다음 숨김 위치를 지정하지 않고 명령을 실행할 수 있습니다 . git은 마지막 위치를 의미합니다 가정합니다 git stash apply..

예를 들어 잘못된 곳에서 작업하는 경우 다음과 같은 경우에 있습니다.

git stash
git checkout <correct_branch>
git stash apply

귀하의 경우에는 조금 더 이동했지만 아이디어가 여전히 적용됩니다.

도움이 되었기를 바랍니다.


나는 당신이 이것을 찾고 있다고 생각합니다

git reset --soft HEAD~1

가장 최근의 커밋을 실행 취소하고 해당 커밋의 변경 사항을 스테이징에 유지합니다.


예, 변경 사항을 삭제하지 않고 커밋을 삭제할 수 있습니다. git reset @ ~


zsh를 사용하는 경우 다음을 사용해야합니다.

git reset --soft HEAD\^

여기에 설명 : https://github.com/robbyrussell/oh-my-zsh/issues/449

URL이 죽는 경우 중요한 부분은 다음과 같습니다.

명령에서 ^ 이스케이프

HEAD ~를 사용할 수 있으므로 매번 이스케이프 할 필요가 없습니다.


제 경우에는 이미 리포지토리로 푸시했습니다. 아야!

다음을 수행하여 로컬 파일의 변경 사항을 유지하면서 특정 커밋을 되돌릴 수 있습니다.

git revert -n <sha>

이렇게하면 필요한 변경 사항을 유지하고 이미 푸시 된 커밋을 취소 할 수있었습니다.


git 2.9 (정확히 2.9.2.windows.1)를 사용하면 git reset HEAD^더 많은 것을 요구합니다. 여기에 예상되는 입력이 무엇인지 확실하지 않습니다. 아래 스크린 샷을 참조하십시오

여기에 이미지 설명 입력

git reset HEAD~#numberOfCommits변경 사항을 그대로 유지하여 재설정하려는 로컬 커밋 수를 선택할 수있는 다른 솔루션 찾았습니다 . 따라서 제한된 수의 로컬 커밋뿐만 아니라 모든 로컬 커밋을 버릴 수있는 기회를 얻습니다.

git reset HEAD~1실제 모습을 보여주는 아래 스크린 샷을 참조하세요 .여기에 이미지 설명 입력

여기에 이미지 설명 입력


당신도 찾고있는 git reset HEAD^ --softgit reset HEAD^ --mixed.

문서에 명시된대로 재설정 명령에는 3 가지 모드가 있습니다 .

git reset HEAD^ --soft

을 취소 git commit. 작업 트리 (프로젝트 폴더) + 색인 (--cached)에 변경 사항이 여전히 존재합니다.

git reset HEAD^ --mixed

실행 취소 git commit+ git add. 작업 트리에 여전히 변경 사항이 있습니다.

git reset HEAD^ --hard

코드베이스를 변경하지 않은 것처럼. 작업 트리에서 변경 사항이 사라집니다.


한 가지 더 방법이 있습니다.

임시 커밋 위에 커밋을 추가하고 다음을 수행하십시오.

git rebase -i

두 개의 커밋을 하나로 병합하려면 (명령은 명시적인 지침이있는 텍스트 파일을 열고 편집합니다).

참고 URL : https://stackoverflow.com/questions/15772134/can-i-delete-a-git-commit-but-keep-the-changes

반응형