etc./StackOverFlow

git commit을 삭제하지만 변경 사항을 유지할 수 있습니까?

청렴결백한 만능 재주꾼 2022. 3. 22. 11:03
반응형

질문자 :tanookiben


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

이제 데모를 끝내고 다시 개발 브랜치로 돌아가서 변경 사항을 유지하면서 만든 "임시 커밋"을 제거하고 싶습니다. 그게 가능합니까?



다음과 같이 간단합니다.

 git reset HEAD^

참고: 일부 셸은 ^ 를 특수 문자(예: 일부 Windows 셸 또는 globbing이 활성화된 ZSH )로 취급하므로 이러한 경우 "HEAD^" 를 인용해야 할 수 있습니다.

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

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

 git commit --amend [-m … etc]

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

이것은 (거의 모든 git 답변과 마찬가지로) 잘못된 커밋을 다른 사람이 가져왔을 수 있는 위치로 이미 푸시한 경우 문제를 일으킬 수 있습니다. 그것을 피하려고


Gareth

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

초기화

제거하려는 커밋이 마지막 커밋이고 추가 작업을 수행하지 않은 경우 간단히 git-reset

 git reset HEAD^

분기를 현재 HEAD 직전의 커밋으로 되돌립니다. 그러나 실제로 작업 트리의 파일을 변경하지는 않습니다. 결과적으로 해당 커밋의 변경 사항은 수정된 것으로 표시됩니다. 이는 '커밋 해제' 명령과 같습니다. 사실, 나는 그것을 할 별명이 있습니다.

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

git uncommit 을 사용하여 하나의 커밋을 백업할 수 있습니다.

스쿼싱

커밋을 스쿼싱한다는 것은 둘 이상의 커밋을 하나로 결합하는 것을 의미합니다. 나는 이것을 꽤 자주 한다. 귀하의 경우 반쯤 완료된 기능이 커밋되어 있고 완료하고 적절하고 영구적 인 커밋 메시지로 다시 커밋합니다.

 git rebase -i <ref>

내가 위에서 말한 것은 이것이 여러 커밋이 될 수 있다는 것을 분명히 하고 싶기 때문입니다. git log 실행하고 제거하려는 커밋을 찾아 SHA1을 복사하고 <ref> 대신 사용합니다. Git은 대화형 리베이스 모드로 안내합니다. <ref> 위치에 넣은 모든 것 사이의 모든 커밋을 표시합니다. 따라서 <ref> 가 10개의 커밋 전이라면 10개의 커밋이 모두 표시됩니다.

각 커밋 앞에는 단어 pick 있습니다. 제거하려는 커밋을 찾아 pick 에서 fixup 또는 squash 로 변경합니다. fixup 사용하면 메시지를 커밋하고 변경 사항을 목록의 직전 선행 작업에 병합하기만 하면 됩니다. squash 키워드도 동일한 작업을 수행하지만 새로 결합된 커밋의 커밋 메시지를 편집할 수 있습니다.

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

경고:

Rebase하면 기록 수정 - 이미 다른 개발자와 공유한 커밋에 대해서는 이 작업을 수행하지 마십시오.

스태싱

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

 git stash save 'some message'

이것은 현재 변경 사항을 숨김 목록의 측면에 저장합니다. 위는 stash 명령의 가장 명시적인 버전으로, 은닉 중인 항목을 설명하는 주석을 허용합니다. git stash 실행할 수도 있지만 메시지는 저장되지 않습니다.

다음을 사용하여 숨김 목록을 탐색할 수 있습니다.

 git stash list

이렇게 하면 모든 은닉, 어떤 분기가 수행되었는지, 메시지와 각 줄의 시작 부분, 그리고 이 stash@{#} 처럼 보이는 해당 은닉의 식별자가 표시됩니다. 여기서 #은 은닉 배열에서의 위치입니다. .

stash를 복원하려면(stash가 원래 생성된 위치에 관계없이 모든 분기에서 수행할 수 있음) 다음을 실행하기만 하면 됩니다.

 git stash apply stash@{#}

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

예를 들어, 잘못된 분기에서 작업하고 있는 자신을 발견하면 다음 명령 시퀀스를 실행할 수 있습니다.

 git stash git checkout <correct_branch> git stash apply

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

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


eddiemoya

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

git reset --soft HEAD~1

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


Sudhanshu Jain

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

 git reset @~

DURGESH

git reset HEAD^ --soft 또는 git reset HEAD^ --mixed 있습니다.

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

git reset HEAD^ --soft

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

git reset HEAD^ --mixed

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

git reset HEAD^ --hard

코드베이스에 이러한 변경 사항을 적용하지 않은 것처럼. 작업 트리에서 변경 사항이 사라졌습니다.


Bar Horing Amir

2020 간단한 방법:

 git reset <commit_hash>

(유지하려는 마지막 커밋의 커밋 해시).

커밋이 푸시된 경우 다음을 수행할 수 있습니다.

 git push -f

이제 커밋되지 않은 변경 사항을 로컬로 유지합니다.


Xys

제 경우에는 이미 repo로 푸시했습니다. 아야!

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

 git revert -n <sha>

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


Wim Feijen

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

git reset --soft HEAD\^

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

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

명령에서 ^ 이스케이프

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


Greg Hilston

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

여기에 이미지 설명 입력

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

git reset HEAD~1 을 보여주는 아래 스크린샷을 참조하십시오. 여기에 이미지 설명 입력

여기에 이미지 설명 입력


nkharche

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

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

 git rebase -i

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


Ruslan Osipov

어떤 경우에는 첫 번째 커밋에서 특정 파일의 변경 사항을 실행 취소하여 두 번째 커밋에 추가하고 더 깨끗한 git 로그를 만들고 싶습니다.

이 경우 내가하는 일은 다음과 같습니다.

 git checkout HEAD~1 <path_to_file_to_put_in_different_commit> git add -u git commit --amend --no-edit git checkout HEAD@{1} <path_to_file_to_put_in_different_commit> git commit -m "This is the new commit"

물론 이것은 분할 커밋에 대한 편집 옵션 rebase -i 도중에도 잘 작동합니다.


Louis Caron

출처 : http:www.stackoverflow.com/questions/15772134/can-i-delete-a-git-commit-but-keep-the-changes

반응형