수색…


병합 실행 취소

아직 리모컨으로 푸시되지 않은 병합 실행 취소

아직 원격 저장소에 병합을 푸시하지 않은 경우 미묘한 차이가 있지만 커밋실행 취소하는 것과 동일한 절차를 수행 할 수 있습니다.

리셋은 병합 커밋과 분기에서 추가 된 커밋을 모두 취소하므로 가장 간단한 옵션입니다. 그러나 SHA를 다시 설정해야하는지 알 필요가 있습니다. git log 두 브랜치의 커밋이 표시 될 때 까다로울 수 있습니다. 잘못된 커밋 (예 : 다른 브랜치)으로 재설정하면 커밋 된 작업이 삭제 될 수 있습니다.

> git reset --hard <last commit from the branch you are on>

또는 병합이 가장 최근 커밋이라고 가정합니다.

> git reset HEAD~

되돌리기는 커밋 된 작업을 파괴하지 않으므로 더 안전 합니다만, 다시 브랜치를 병합하기 전에 되돌리기를 되돌려 야하므로 더 많은 작업이 필요합니다 (다음 섹션 참조).

원격으로 푸시 된 병합 실행 취소

새 기능 (add-gremlins)을 병합한다고 가정합니다.

> git merge feature/add-gremlins
...
   #Resolve any merge conflicts
> git commit #commit the merge
...
> git push
...
   501b75d..17a51fd  master -> master

이후에 병합 한 기능이 다른 개발자를 위해 시스템을 파손했음을 발견 했으므로 즉시 취소해야하며 기능 자체를 수정하는 데 너무 오래 걸리므로 병합을 취소하기 만하면됩니다.

> git revert -m 1 17a51fd
...
> git push
...
   17a51fd..e443799  master -> master

이 시점에서 gremlins는 시스템에서 벗어나고 동료 개발자들은 당신에게 소리 지르는 것을 멈췄습니다. 그러나 아직 완료되지 않았습니다. add-gremlins 기능을 사용하여 문제를 해결 한 후에 다시 병합하기 전에이 되돌리기를 실행 취소해야합니다.

> git checkout feature/add-gremlins
...
   #Various commits to fix the bug.
> git checkout master
...
> git revert e443799
...
> git merge feature/add-gremlins
...
   #Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push

이제 귀하의 기능이 성공적으로 추가되었습니다. 그러나이 유형의 버그가 병합 충돌로 인해 종종 발생한다는 점을 감안할 때 분기마다 병합 충돌을 수정할 수 있으므로 약간 다른 워크 플로가 도움이되는 경우가 있습니다.

> git checkout feature/add-gremlins
...
   #Merge in master and revert the revert right away.  This puts your branch in
   #the same broken state that master was in before.
> git merge master
...
> git revert e443799
...
   #Now go ahead and fix the bug (various commits go here)
> git checkout master
...
   #Don't need to revert the revert at this point since it was done earlier
> git merge feature/add-gremlins
...
   #Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push

reflog 사용하기

리베이스를 망쳐 버렸다면 다시 시작하는 옵션은 커밋 (pre rebase)으로 되돌아가는 것입니다. reflog 사용하면 다음과 같이 할 수 있습니다 (지난 90 일 동안 수행 한 모든 작업 내역 - 구성 가능).

$ git reflog
4a5cbb3 HEAD@{0}: rebase finished: returning to refs/heads/foo
4a5cbb3 HEAD@{1}: rebase: fixed such and such
904f7f0 HEAD@{2}: rebase: checkout upstream/master
3cbe20a HEAD@{3}: commit: fixed such and such
...

리베이스가 HEAD@{3} 이되기 전에 커밋을 볼 수 있습니다 (또한 해쉬를 체크 아웃 할 수도 있습니다) :

git checkout HEAD@{3}

이제 새로운 브랜치를 생성하거나 이전 브랜치를 삭제하거나 리베이스를 다시 시도하십시오.

reflog 에있는 지점으로 직접 재설정 할 수도 있지만, 원하는대로 100 % 확신하는 경우에만 다음 작업을 수행하십시오.

git reset --hard HEAD@{3}

그러면 현재 git 트리가 그 시점의 상태와 일치하도록 설정됩니다 (변경 사항 실행 취소 참조).

다른 브랜치에서 리베이스 할 때 브랜치가 얼마나 잘 작동하는지 임시로 확인하고 있지만 결과를 유지하고 싶지 않은 경우에 사용할 수 있습니다.

이전 커밋으로 돌아 가기

이전 커밋으로 돌아가려면 먼저 git log 사용하여 커밋의 해시를 찾으십시오.

일시적으로 그 커밋으로 돌아 가기 위해서는 다음과 같이 머리를 분리하십시오 :

git checkout 789abcd

이것은 커밋 789abcd 에서 당신을 배치합니다. 이제 머리가있는 지점에 영향을주지 않고이 커밋을 기반으로 새로운 커밋을 만들 수 있습니다. branch 또는 checkout -b 사용하여 모든 분기를 변경할 수 있습니다.

변경 사항을 유지하면서 이전 커밋으로 롤백하려면 다음을 수행하십시오.

git reset --soft 789abcd

마지막 커밋을 롤백하려면 :

git reset --soft HEAD~

특정 커밋 이후에 변경된 내용을 영구적으로 삭제하려면 다음을 사용하십시오.

git reset --hard 789abcd

마지막 커밋 이후에 변경된 내용을 영구히 버리기 위해서는 :

git reset --hard HEAD~

주의 : reflogreset 사용하여 삭제 된 커밋을 복구 할 수 있지만 커밋 되지 않은 변경 사항은 복구 할 수 없습니다. git stash; git reset 사용하십시오 git stash; git reset 대신 git reset --hard 안전을 위해서.

변경 사항 실행 취소

변경 사항을 작업 사본 의 파일이나 디렉토리로 되돌 립니다.

git checkout -- file.txt

현재 디렉토리에서 재귀 적으로 모든 파일 경로에 사용되며 작업 사본의 모든 변경 사항을 취소합니다.

git checkout -- .

변경 사항의 일부만 실행 취소하려면 --patch 사용하십시오. 각 변경 사항에 대해 취소 여부를 묻는 메시지가 표시됩니다.

git checkout --patch -- dir

색인에 추가 된 변경 사항을 실행 취소합니다.

git reset --hard

--hard 플래그가 없으면 소프트 재설정을 수행합니다.

아직 리모컨으로 푸시하지 않은 로컬 커밋을 사용하면 소프트 재설정을 수행 할 수 있습니다. 따라서 파일을 재 작업하고 커밋을 재 작업 할 수 있습니다.

git reset HEAD~2

위의 예는 마지막 두 커밋을 풀고 작업 복사본으로 파일을 반환합니다. 그런 다음 추가 변경 사항과 새로운 커밋을 수행 할 수 있습니다.

주의 : 소프트 리셋과 별도로 이러한 모든 작업은 변경 사항을 영구적으로 삭제합니다. 보다 안전한 옵션을 git stash -p 또는 git stash 를 각각 사용하십시오. stash pop 나중에 실행 취소하거나 stash drop 영원히 삭제할 수 있습니다.

기존 커밋을 되돌리기

git revert를 사용하여 기존 커밋을 되돌리려면, 특히 해당 커밋이 원격 리포지토리에 푸시 된 경우. 이전 커밋의 효과를 되돌리기 위해 새로운 커밋을 기록합니다.이 커밋은 이전 기록을 다시 작성하지 않고 안전하게 푸시 할 수 있습니다.

저장소의 다른 모든 사용자의 위협을 없애기를 원하지 않는 한 git push --force 사용 하지 마십시오 . 공개 기록을 다시 작성하지 마십시오.

예를 들어, 버그가 포함 된 커밋을 밀어 올려서 제거해야하는 경우 다음을 수행하십시오.

git revert HEAD~1
git push

이제 되돌리기 커밋을 로컬에서 되돌리고 코드를 수정하고 좋은 코드를 푸는 것은 자유 롭습니다.

git revert HEAD~1
work .. work .. work ..
git add -A .
git commit -m "Update error code"
git push

되 돌리려는 커밋이 히스토리에서 이미 더 멀리있는 경우 커밋 해시를 전달하면됩니다. Git은 원격 커밋을 안전하게 수행 할 수 있도록 원래 커밋을 취소하는 counter-commit을 만듭니다.

git revert 912aaf0228338d0c8fb8cca0a064b0161a451fdc
git push

일련의 커밋을 실행 취소 / 다시 실행합니다.

커밋 수 십 개를 취소하고 일부만 원할 것이라고 가정합니다.

git rebase -i <earlier SHA>

-i rebase를 "대화식 모드"로 설정합니다. 위에서 설명한 rebase처럼 시작하지만 커밋을 재생하기 전에 일시 중지되고 재생 된대로 각 커밋을 부드럽게 수정할 수 있습니다. rebase -i 는 다음과 같이 커밋 목록이 적용된 기본 텍스트 편집기에서 열립니다. 여기에 이미지 설명을 입력하십시오.

커밋을 삭제하려면 편집기에서 해당 줄을 삭제하면됩니다. 프로젝트에서 더 이상 나쁜 커밋을 원하지 않으면 위의 행 1과 3-4를 삭제할 수 있습니다. 커밋 두 개를 결합하려면 squash 또는 fixup 명령을 사용할 수 있습니다 여기에 이미지 설명을 입력하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow