programing

git commit을 삭제해도 변경은 유지할 수 있습니까?

showcode 2023. 4. 15. 09:38
반응형

git commit을 삭제해도 변경은 유지할 수 있습니까?

개발 부문 중 하나에서 코드 베이스에 변경을 가했습니다.작업하고 있던 기능을 완료하기 전에 현재의 브랜치를 마스터로 전환하여 몇 가지 기능을 시연해야 했습니다.다만, 「git checkout master」를 사용하는 것만으로, 개발 부문에서의 변경도 보존되어 마스터의 기능 중 일부가 망가졌습니다.그래서 저는 "일시적 커밋"이라는 커밋 메시지를 사용하여 개발 지점의 변경 사항을 커밋한 후 데모 마스터를 체크 아웃했습니다.

이제 데모를 마치고 개발 부서로 돌아왔으니, 제가 한 "일시적인 약속"을 지우고 변경 사항을 보존하고 싶습니다.그게 가능한가요?

간단한 것은 다음과 같습니다.

git reset HEAD^

은 " "를 처리합니다: " "^특수 문자(예를 들어 일부 Windows 쉘이나 ZSH(글로빙이 활성화된 경우)로 지정되므로 따옴표를 사용해야 할 수 있습니다."HEAD^" 「」를 사용합니다.HEAD~1런런경경경경경경

git reset--hard ★★★★★★★★★★★★★★★★★」--softHEAD파일을 변경하지 않고 지정된 커밋을 가리킵니다. HEAD^는 현재 커밋의 (첫 번째) 부모 커밋을 나타냅니다.이 경우는 일시적인 커밋보다 전의 커밋입니다.

다른 옵션은 정상적으로 실행한 후 다음 커밋 포인트에서 실행하는 것입니다.

git commit --amend [-m … etc]

대신 최신 커밋을 편집하여 위와 같은 효과를 발휘합니다.

(대부분의 git 답변과 마찬가지로) 다른 사람이 잘못된 커밋을 꺼냈을 가능성이 있는 장소에 이미 밀어넣은 경우 문제가 발생할 수 있습니다.그것을 피하도록 해라

이 문제를 해결하는 방법에는 두 가지가 있습니다.어떤 것이 더 쉬울지는 당신의 상황에 따라 다릅니다.

리셋

커밋이고 하지 않은 """ "" " " " " " " " " 를 사용할 수 .git-reset

git reset HEAD^

현재 HEAD 직전 커밋으로 돌아갑니다.그러나 실제로 작업 트리의 파일은 변경되지 않습니다.그 결과 해당 커밋에서 변경된 내용이 'uncommit' 명령과 같은 수정으로 표시됩니다.사실, 저는 그렇게 할 수 있는 가명이 있어요.

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

그냥 요.git uncommit1번, 1번, 1번, 1번, 1번

찌그러뜨리다

커밋을 스쿼시하는 것은 2개 이상의 커밋을 1개로 결합하는 것을 의미합니다.저는 이런 걸 자주 해요.이 경우 절반의 기능을 커밋한 후 완료하고 적절한 영구 커밋메시지를 사용하여 다시 커밋합니다.

git rebase -i <ref>

내가 위에 말하는 이유는 이것이 얼마나 많은 수의 커밋이 되돌아올 수 있다는 것을 분명히 하고 싶기 때문이다. 실행합니다.git log을 찾아 하고 SHA1 대신 합니다.<ref>합니다. Git을 사용하면 인터랙티브 기본 재배치 모드로 전환됩니다. 상태 이 모두 됩니다.<ref> 만약 ★★★★★★★★★★★★★★★★★★★★★.<ref>10개의 커밋 전이고 10개의 커밋이 모두 표시됩니다.

커밋 에는 '어느 정도 하다'라는 가 붙어 .pick을 찾아서 에서pick로로 합니다.fixup ★★★★★★★★★★★★★★★★★」squash.★★★★★★ 。fixup는 메시지를 커밋하고 목록 내의 직전 이전 메시지에 변경 내용을 Marge하기만 하면 됩니다.squash키워드도 같은 처리를 하지만 새로 결합된 커밋의 커밋메시지를 편집할 수 있습니다.

커밋은 에디터를 종료할 때 목록에 표시되는 순서대로 다시 커밋됩니다.따라서 일시적으로 커밋한 후 같은 브랜치에서 다른 작업을 수행하고 나중에 커밋에서 기능을 완료한 경우 rebase를 사용하면 커밋을 다시 정렬하여 스쿼시할 수 있습니다.

경고:

기본 변경 내역 변경 - 이미 다른 개발자와 공유한 커밋에는 이 작업을 수행하지 마십시오.

스태싱

이 하려면 , 「」를 사용하는 을 검토해 주세요.git stash커밋되지 않은 작업을 임시로 저장합니다.

git stash save 'some message'

이렇게 하면 현재 변경 내용이 저장 목록의 옆에 저장됩니다.위는 stash 명령어의 가장 명시적인 버전으로, 코멘트에 의해 stash의 내용을 기술할 수 있습니다.,, 단단게실 you you you you you you you you you이다를 간단하게 실행할 수도 .git stash다른 것은 없지만 메시지는 저장되지 않습니다.

저장 목록을 탐색할 수 있습니다.

git stash list

모든 , 및, stash, stash, stash 등의 됩니다.stash@{#}은닉하다

stash를 복원하려면(stash가 처음 생성된 위치에 관계없이 모든 분기에서 수행할 수 있음) 단순히 다음을 수행합니다.

git stash apply stash@{#}

은닉하다가 「」에 .0- stash. - ", " "는 "입니다.위치를 하지 않고 할 수 있습니다.stash 위치를 합니다.git stash apply.

예를 들어, 잘못된 분기에서 작업 중인 경우 다음 일련의 명령을 실행할 수 있습니다.

git stash
git checkout <correct_branch>
git stash apply

고객님의 경우 지점을 좀 더 많이 이동했지만, 여전히 같은 생각이 적용됩니다.

이거 찾는 것 같은데

git reset --soft HEAD~1

스테이징에 대한 커밋에서 변경된 내용은 그대로 유지하면서 최신 커밋을 취소합니다.

네, 변경 내용을 삭제하지 않고 커밋을 삭제할 수 있습니다.

git reset @~

git reset HEAD^ --soft ★★★★★★★★★★★★★★★★★」git reset HEAD^ --mixed.

reset 명령어에는 다음 3가지 모드가 있습니다.

git reset HEAD^ --soft

git commit. 폴더) + 에는 변경 작업 트리(프로젝트 폴더) + 인덱스(--캐시됨)에 변경이 아직 존재합니다.

git reset HEAD^ --mixed

로 하다git commit+git add. 트리에는 현용 트리에 변경이 아직 존재합니다.

git reset HEAD^ --hard

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

2020 심플한 방법:

git reset <commit_hash>

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

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

git push -f

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

제 경우엔 이미 레포에 들어갔습니다.아야!

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

git revert -n <sha>

이렇게 함으로써 저는 제가 필요로 했던 변화를 유지할 수 있었고 이미 추진된 약속을 취소할 수 있었습니다.

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

git reset --soft HEAD\^

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

URL이 비활성화된 경우 중요한 부분은 다음과 같습니다.

명령어로 ^를 이스케이프합니다.

HEAD~를 사용할 수도 있어 매번 빠져나가지 않아도 됩니다.

.9.2를 하여 git 2.9를 사용합니다.1)git reset HEAD^이치노여기서는 무엇을 입력해야 하는지 잘 모르겠습니다.해 주세요.

여기에 이미지 설명 입력

해결책을 .git reset HEAD~#numberOfCommits변경을 변경하지 않고 리셋할 로컬커밋의 수를 선택할 수 있습니다.따라서 제한된 수의 로컬 커밋뿐만 아니라 모든 로컬 커밋을 폐기할 수 있습니다.

해 주세요.git reset HEAD~1동작 중:

여기에 이미지 설명 입력

한 가지 방법이 더 있어

임시 커밋 상단에 커밋을 추가한 후 다음을 수행합니다.

git rebase -i

두 개의 커밋을 하나로 병합하려면(명시적 명령이 포함된 텍스트 파일을 엽니다. 편집하십시오).

경우에 따라서는 첫 번째 커밋에서 특정 파일의 변경만 취소하고 두 번째 커밋에 추가하고 더 깨끗한 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 -isplit.

커밋 기록을 업데이트하거나 새 커밋을 추가하고 이전 커밋을 제거하려면 이 코드를 사용하십시오.

  1. 이 명령어는 fa386d8eaa4bde4a4a2912ef96aad6df31f4d4cc 등의 마지막 커밋해시를 출력합니다.

    git log

  2. 마지막 커밋을 리셋합니다.주의: 변경 내용은 삭제되지 않으며 새 변경 및 이전 변경 내용은 유지됩니다. 마지막 커밋 메시지만 삭제합니다.

    git reset 629f9dfb47620a1794f5edf816762f8e30668498

  3. 변경된 파일 모두 추가

    git add .

  4. 메시지 커밋

    git commit -m "Your_new_commit_message_here"

  5. 이전에 푸시한 것과 같은 git log 명령어로 체크합니다.

    git push -f origin Your_Branch_Name

먼저 다음 명령어로 로그를 볼 수 있습니다.

git reflog

모든 커밋을 표시하고 실행 취소할 커밋과 관련된 헤드 번호를 찾은 후 다음 명령을 입력합니다.

git reset HEAD@{#NumberOfCommitYouWantToUndo} 

★★git reset HEAD@{3}

git reset HEAD@{#}은(는) 재설정 후 스테이징되지 않은 모든 변경 사항을 표시합니다.

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

반응형