개발관련/Git

로컬 Git 변경 사항을 제거하는 다양한 방법

Rateye 2022. 1. 6. 14:44
728x90
반응형
질문 : 로컬 Git 변경 사항을 제거하는 다양한 방법

방금 git 저장소를 복제하고 브랜치를 확인했습니다. 작업 한 다음 원본을 원했기 때문에 로컬 변경 사항을 모두 제거하기로 결정했습니다.

즉, 로컬 변경 사항을 제거하려면 다음 두 명령을 수행해야했습니다.

git checkout .

git clean -f

제 질문은

(1) 이것이 로컬 변경 사항을 제거하는 올바른 접근 방식입니까, 아니면 올바른 접근 방식을 알려주십시오.

(2)이 명령 없이도 재설정 할 수 git reset --hard

감사

* Solution : Major Edit (s) : 03/26 : * 많은 모호한 용어를 git 특정 용어로 대체했습니다. [tracked / untracked / staged / unstaged]

로컬 변경을 수행 할 때 파일 범주는 세 가지만있을 수 있습니다.

유형 1. 준비된 추적 파일

유형 2. Unstaged 추적 파일

유형 3. Unstaged UnTracked 파일 일명 UnTracked 파일

  • 스테이징-스테이징 영역으로 이동 / 인덱스에 추가 된 항목
  • 추적 됨-수정 된 파일
  • 추적되지 않음-새 파일. 항상 언 스테이지. 스테이징 된 경우 추적된다는 의미입니다.

각 명령의 기능 :

  1. git checkout . -Unstaged Tracked 파일 만 제거 [Type 2]
  2. git clean -f -Unstaged UnTracked 파일 만 제거 [Type 3]
  3. git reset --hard --hard-스테이징 된 추적 파일과 스테이징되지 않은 추적 파일 만 제거 [유형 1, 유형 2]
  4. git stash -u 모든 변경 사항 제거 [유형 1, 유형 2, 유형 3]

 

 

결론:

우리가 둘 중 하나를 사용할 수 있다는 것이 분명합니다.

(1) combination of `git clean -f` and `git reset --hard` 

또는

(2) `git stash -u`

원하는 결과를 얻을 수 있습니다.

참고 : '지정된 장소에 (무언가) 안전하고 비밀리에 보관'을 의미하는 은닉. git stash pop 사용하여 검색 할 수 있습니다. 따라서 위의 두 옵션 중에서 선택하는 것은 개발자의 요청입니다.

Christoph와 Frederik Schøning에게 감사드립니다.

편집 : 03/27

git clean -f '주의 '메모를 넣을 가치가 있다고 생각했습니다.

git clean -f

돌아갈 수 없습니다. -n 또는 --dry-run 을 사용하여 수행 할 손상을 미리보십시오.

디렉토리도 제거하려면 git clean -f -d

무시 된 파일 만 제거하려면 git clean -f -X

무시되지 않은 파일과 무시 된 파일을 제거하려면 git clean -f -x

git clean 에 대한 추가 정보 : 현재 Git 작업 트리에서 로컬 (추적되지 않은) 파일을 제거하는 방법은 무엇입니까?

편집 : 05/20/15

이 분기의 모든 로컬 커밋 삭제 [로컬 커밋 제거]

이 분기의 모든 로컬 커밋을 삭제하려면 로컬 분기를이 분기의 "업스트림"과 동일하게 만들려면 git reset --hard @{u}

참조 : http://sethrobertson.github.io/GitFixUm/fixup.html

또는 git reset --hard origin/master [로컬 브랜치가 master ]

참고 : 2015 년 6 월 12 일 이것은 중복으로 표시된 다른 SO 질문의 중복 이 아닙니다. 이 질문은 로컬 GIT 변경 사항을 제거하는 방법 [추가 된 파일 제거, 기존 파일에 추가 된 변경 사항 제거 등 및 다양한 접근 방식; 다른 SO 스레드에서는 로컬 커밋을 제거하는 방법 만 설명합니다. 파일을 추가하고 그 파일 만 제거하려는 경우 다른 SO 스레드는 이에 대해 논의하지 않습니다. 따라서 이것은 다른 것과 중복되지 않습니다.]

편집 : 06/23/15

이미 원격 저장소에 푸시 된 커밋을 되 돌리는 방법은 무엇입니까?

$ git revert ab12cd15

수정 : 2015 년 9 월 1 일

로컬 분기 및 원격 분기에서 이전 커밋 삭제

사례 : 방금 로컬 브랜치에 변경 사항을 커밋하고 즉시 원격 브랜치로 푸시했습니다. 갑자기 깨달았습니다. 이 변경은 필요하지 않습니다. 이제 무엇을합니까?

git reset --hard HEAD~1 [로컬 브랜치에서 커밋 삭제]

git push origin HEAD --force [두 명령 모두 실행해야합니다. 원격 지점에서 삭제]

지점은 무엇입니까? 현재 체크 아웃 된 지점입니다.

2015 년 9 월 8 일 편집 -로컬 자식 병합 제거 :

나는 master master 브랜치를 새로 작동하는 브랜치 phase2 와 병합했습니다.

$ git status
# On branch master

$ git merge phase2

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.

Q :이 병합을 제거하는 방법은 무엇입니까? 시도 git reset --hardgit clean -d -f 둘 다 작동하지 않았습니다.

효과 가 있었던 유일한 것은 다음 중 하나입니다.

$ git reset --hard origin/master

또는

$ git reset --hard HEAD~8

또는

$ git reset --hard 9a88396f51e2a068bb7 [sha commit code-이것은 모든 병합 커밋이 발생하기 전에 존재했던 코드입니다.]

답변

그것은 모두 실행 취소 / 되돌리려는 대상에 따라 다릅니다. Ube의 링크에있는 게시물 을 읽고 시작하십시오. 그러나 대답을 시도하려면 :

하드 리셋

git reset --hard [HEAD]

추적 된 파일에 대한 모든 준비된 변경 사항과 준비되지 않은 변경 사항을 완전히 제거합니다.

"리모컨에서 완전히 다시 복제 한 것처럼 모든 것을 실행 취소"하고 싶을 때 하드 리셋을 자주 사용합니다. 귀하의 경우에는 리포지토리를 원할 경우 이것이 작동합니다.

깨끗한

git clean [-f]

추적되지 않는 파일을 제거하십시오.

임시 파일을 제거하지만 이미 추적 된 파일에 대해 준비된 변경 사항과 준비되지 않은 변경 사항을 유지합니다. 대부분의 경우 반복적으로 정리하는 대신 무시 규칙을 만드는 것으로 끝날 것입니다. 예를 들어 C # 프로젝트의 bin / obj 폴더는 일반적으로 공간을 절약하기 위해 리포지토리에서 제외하려는 경우입니다.

에 -f (강제) 옵션은 추적되지 않습니다 무시 규칙을하지만 또한 자식에 의해 무시되고있는 파일을 제거합니다. 위의 경우 bin / obj 폴더를 추적하지 않는 ignore-rule을 사용하여 이러한 폴더가 git에 의해 무시 되더라도 force- 옵션을 사용하면 파일 시스템에서 해당 폴더가 제거됩니다. 예를 들어 배포를 스크립팅 할 때이 용도를 산발적으로 보았습니다. 배포, 압축 등의 작업 전에 코드를 정리하고 싶습니다.

Git clean은 이미 추적중인 파일을 건드리지 않습니다.

체크 아웃 "점"

git checkout .

나는 실제로 당신의 게시물을 읽기 전에이 표기법을 본 적이 없습니다. 나는 이것에 대한 문서를 찾는 데 어려움을 겪고 있지만 (누군가가 도울 수 있을지도 모르지만) 조금 놀아 보면 다음을 의미하는 것처럼 보입니다.

"내 작업 트리의 모든 변경 사항을 취소합니다".

즉, 추적 된 파일의 단계 화되지 않은 변경 사항을 실행 취소합니다. 분명히 단계적 변경 사항을 건드리지 않고 추적되지 않은 파일 만 남겨 둡니다.

은닉

일부 답변은 숨김에 대해 언급합니다. 문구에서 알 수 있듯이, (커밋 할 준비가되지 않은) 무언가 중간에있을 때 stashing을 사용하고 일시적으로 분기를 전환하거나 코드의 다른 상태에서 작업 한 다음 나중에 "지저분한"상태로 돌아 가야합니다. 책상". 이것이 귀하의 질문에 적용되지는 않지만 확실히 편리합니다.

요약하자면

일반적으로 자신이 커밋하고 원격 중요한 변경 사항을 적용했을 수 있다고 확신하는 경우, 그냥 놀고있는 경우 git reset --hard HEAD 다음에 git clean -f 하면 코드를 상태로 완전히 정리할 수 있습니다. 방금 복제하고 브랜치에서 체크 아웃했다면 안에있을 것입니다. 재설정하면 단계적이지만 커밋되지 않은 변경 사항도 제거된다는 점을 강조하는 것이 정말 중요합니다. 커밋되지 않은 모든 파일을 삭제합니다 (추적 되지 않은 파일 제외,이 경우 clean 사용).

다른 모든 명령은 "작업 취소"의 세분화가 필요한보다 복잡한 시나리오를 용이하게하기 위해 있습니다. :)

귀하의 질문 # 1이 다루어졌지만 마지막으로 # 2에서 결론을 내릴 수 있습니다. git reset --hard 를 사용할 필요성을 찾지 못한 이유는 아무것도 준비하지 않았기 때문입니다. 변경 사항을 준비했다면 git checkout . git clean -f 도 그것을 되 돌렸을 것입니다.

이것이 커버되기를 바랍니다.

출처 : https://stackoverflow.com/questions/22620393/various-ways-to-remove-local-git-changes
728x90
반응형