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


625

방금 자식 저장소를 복제하고 지점을 체크 아웃했습니다. 나는 그 일을 한 다음 원본을 원했기 때문에 모든 로컬 변경 사항을 제거하기로 결정했습니다.

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

git checkout .

git clean -f

내 질문은

(1) 지역 변경을 제거하는 올바른 방법입니까, 아니면 올바른 방법을 알려주십시오.

(2) git reset --hard이 명령없이 재설정 할 수 있으므로 언제 사용합니까?

감사

* 솔루션 : Major Edit (s) : 03/26 : * 많은 모호한 용어를 git 특정 용어로 대체했습니다.

로컬 변경시 파일 범주는 세 가지뿐입니다.

유형 1. 준비된 추적 파일

형식화되지 않은 추적 파일

유형 3. Unstaged UnTracked files 일명 Untracked files

  • Staged-준비 영역으로 이동 된 항목 / 색인에 추가 된 항목
  • 추적 된 수정 된 파일
  • 추적되지 않음-새 파일. 항상 무대에 있지 않다. 준비된 경우 추적됩니다.

각 명령의 기능 :

  1. git checkout . -스테이지되지 않은 추적 파일 만 제거 [유형 2]

  2. git clean -f -준비되지 않은 추적되지 않은 파일 만 제거 [유형 3]

  3. git reset --hard -단계별 추적 및 준비되지 않은 추적 파일 만 제거 [유형 1, 유형 2]

  4. git stash -u -모든 변경 사항을 제거합니다 [Type 1, Type 2, Type 3]

결론:

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

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

또는

(2) `git stash -u`

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

참고 : Stashing은 단어가 '지정된 장소에 안전하고 비밀리에 보관'이라는 의미입니다. 항상을 사용하여 검색 할 수 있습니다 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[둘 다 명령을 실행해야합니다. 원격 지점에서 삭제]

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

09/08/2015 편집 -로컬 git merge 제거 :

나는 오전 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 --hard 하고 git clean -d -f 둘 다 작동하지 않았습니다.

있는 유일한 일이 일이 사람 다음 중 하나를 수 있습니다 :

$ git reset --hard origin/master

또는

$ git reset --hard HEAD~8

또는

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


1
이 글타래가 귀하의 질문에 답변 할 것 같네요 : stackoverflow.com/questions/1146973/…
Saucier

1
"git stash"는 모든 변경 사항을 제거합니다.
John Ballinger

1
좋은 요약! 다른 파일 범주 인 "유형 4. 무시 된 파일"을 추가하고 싶습니다. git stash -a[또는 --all]은 무시되고 추적되지 않은 파일도 숨 깁니다. git clean -x무시 된 파일도 정리합니다. git clean -X무시 된 파일 만 정리합니다.
Jerry101

2
@JavaDev 귀하의 질문은 답변과 비슷했습니다. 모든 답변을 계속 편집하고 편집 해 주셔서 감사합니다.
Bhavuk Mathur

1
감사합니다. 로컬 변경 사항을 취소하기 위해 4 가지 명령을 모두 실행했습니다.
Vincent Tang

답변:


505

실행 취소 / 복귀하려는 대상에 따라 다릅니다. Ube의 링크에서 게시물 을 읽으 면서 시작하십시오 . 그러나 대답을 시도하려면 :

하드 리셋

git reset --hard [HEAD]

추적 파일에 대한 모든 단계적 및 비 단계적 변경 사항을 완전히 제거하십시오.

"리모콘에서 완전히 다시 복제 한 경우와 같이 모든 것을 실행 취소합니다"와 같은 경우 하드 재설정을 자주 사용합니다. 당신의 경우, 당신이 당신의 repo 깨끗한 것을 원한다면, 이것은 효과가 있습니다.

깨끗한

git clean [-f]

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

임시 파일을 제거하되 이미 추적 된 파일에 대한 준비된 단계 및 준비되지 않은 변경 사항은 유지하십시오. 대부분의 경우 C # 프로젝트의 bin / obj 폴더와 같이 반복적으로 정리하는 대신 무시 규칙을 작성하여 공간을 절약하기 위해 일반적으로 리포지토리에서 제외하려는 경우가 있습니다.

에 -f (강제) 옵션은 추적되지 않는 파일을 제거 하고 무시 규칙을하지만 또한 자식에 의해 무시됩니다. 위의 경우 bin / obj 폴더를 추적하지 않는 ignore-rule을 사용하면 git에서 이러한 폴더를 무시하더라도 force-option을 사용하면 파일 시스템에서 해당 폴더가 제거됩니다. 스크립트 배포와 같은 용도로 산발적으로 사용되는 것을 보았으며 배포, 압축 또는 기타 작업을 수행하기 전에 코드를 정리하려고합니다.

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

체크 아웃 "도트"

git checkout .

나는 당신의 게시물을 읽기 전에 실제로이 표기법을 본 적이 없었습니다. 이것에 대한 문서를 찾는 데 어려움을 겪고 있습니다 (아마도 도움이 될 수 있습니다).

"작업 트리에서 모든 변경 사항을 취소하십시오".

즉, 추적 파일에서 비 단계적 변경을 취소합니다. 단계적 변경 사항을 건드리지 않고 추적되지 않은 파일 만 남겨 둡니다.

스 태싱

일부 답변은 말뚝 박기에 대해 언급합니다. 문구에서 알 수 있듯이, 커밋 할 준비가되지 않은 중간에있을 때 스 태싱을 사용하고 분기를 일시적으로 전환하거나 코드의 다른 상태에서 작업을 수행해야합니다. 책상". 나는 이것이 당신의 질문에 적용되는 것을 보지 못하지만 확실히 편리합니다.

요약하자면

일반적으로 자신이 확신하고 원격으로 중요한 변경 사항을 푸시했다고 확신하는 경우, 그냥 놀거나 등을 사용하는 경우 git reset --hard HEAD다음을 사용 git clean -f하여 코드를 상태로 결정적으로 정리하면 코드가 복제 된 것입니다. 지점에서 체크 아웃했습니다. 재설정은 단계적이지만 커밋되지 않은 변경 사항도 제거한다는 점을 강조하는 것이 중요합니다. 커밋되지 않은 모든 것을 지울 것입니다 (추적 되지 않은 파일은 제외하고 clean 사용하십시오 ).

다른 모든 명령은 "실행 취소 항목"의 세분성이 필요한보다 복잡한 시나리오를 용이하게하기 위해 존재합니다. :)

나는 당신의 질문 # 1이 다루어 졌다고 생각하지만, 마지막으로 # 2에 결론을 내릴 것입니다 : git reset --hard당신이 사용할 필요를 결코 찾지 못한 이유 는 당신이 아무것도 무대에 놓지 않았기 때문입니다. 당신이 변화를 개최했다, 어느 쪽 git checkout .git clean -f있다는 복귀 것이다.

희망이 있습니다.


를 사용하는 이유에 대해 감사합니다 git reset --hard. 나는 그것을 밖으로 시도, 그래 .. 지수 (준비)에 추가하는 파일은 후 제거 git reset --hard및 기본에 의해 나는 가정 git reset --hard이다 git reset --hard head. 이 링크는 도움이되었다 gitready.com/beginner/2009/01/18/the-staging-area.html
스파이더

왜 내가 git stash -u가장 이해가 되는지 내 대답을 개선 했습니다.
Christoph

2
둘 다 고마워 나는 대답을 요약하고 내 질문에 포함시켰다. 크리스토프는 나에게 알려 git stash -u어떻게 팝 않지만, 프레데릭 나를 다시 하드와의 조합을 사용하여 알려 git reset --hardgit clean -f, 그리고 왜 stash일부 시나리오에서 바람직하다. 이제 답변으로 표시해야 할 것을 선택하도록 도와주십시오.
spiderman

3
.repo의 루트 일 수있는 현재 작업 디렉토리를 참조하는 pathspec입니다. git-scm.com에서 : git checkout [<tree-ish>] [--] <pathspec>…작업 트리의 명명 된 경로를 인덱스 파일 또는 명명 된 <tree-ish>에서 업데이트합니다.
Jerry101

3
충분히 모두 강조 결코 git reset --hardgit clean -dfx등이 파괴 . 어쨌든, head답변에 소문자를 수정하십시오. 대문자 HEAD이거나 존재하지 않아야합니다.
Pavel Šimerda 2016 년

25

지금 답변을 추가하는 이유 :

지금까지 초기 질문 자체에 결론과 '답변'을 추가하여 질문을 매우 길게 작성하여 별도의 답변으로 옮겼습니다.

또한 다른 사람을 도울 수 있도록 더 자주 사용되는 git 명령 을 추가했습니다 .

기본적으로 모든 로컬 커밋을 정리 $ git reset --hard하고 $ git clean -d -f


커밋을 수행하기 전에 첫 번째 단계는 커밋과 함께 표시되는 사용자 이름과 전자 메일을 구성하는 것입니다.

커밋 트랜잭션에 첨부하려는 이름을 설정합니다.

$ git config --global user.name "[name]"

# 커밋 거래에 도달하려는 이메일을 설정합니다

$ git config --global user.email "[email address]"

# 글로벌 설정 목록

$ git config --list

# 원격 URL 나열

$ git remote show origin

#상태를 확인하세요

git status

# 모든 로컬 및 원격 지점 나열

git branch -a

# 새 지역 지점을 만들고이 지점에서 작업을 시작하십시오.

git checkout -b "branchname" 

또는 2 단계 프로세스로 수행 할 수 있습니다.

지점 만들기 : git branch branchname 이 지점에서 작업하십시오.git checkout branchname

#commit local changes [2 단계 프로세스 :-파일을 인덱스에 추가합니다. 즉, 준비 영역에 추가됩니다. 그런 다음이 준비 영역에있는 파일을 커밋합니다.]

git add <path to file>

git commit -m "commit message"

# 다른 지역 지점을 점검하십시오.

git checkout "local branch name"

# 로컬 브랜치의 모든 변경 사항 제거 [새 파일 추가 또는 기존 파일 수정 또는 로컬 커밋 만들기와 같이 로컬 브랜치에서 일부 변경 사항을 적용했지만 더 이상 필요하지 않음] git clean -d -fgit reset --hard [ 지역 커밋]

git stash -u 또한 모든 변경 사항을 제거합니다

참고 : 원하는 결과를 얻기 위해 (1) 조합 git clean –d –fgit reset --hard OR (2) git stash -u를 사용할 수 있음이 분명합니다 .

참고 1 : 단어는 '지정된 장소에 안전하고 비밀리에 보관'이라는 의미입니다. 이것은 항상 자식 숨김 팝을 사용하여 검색 할 수 있습니다. 따라서 위의 두 가지 옵션 중 하나를 선택하는 것이 개발자의 요청입니다.

참고 2 : git reset --hard작업 디렉토리 변경 사항이 삭제됩니다. 이 명령을 실행하기 전에 유지하려는 로컬 변경 사항을 숨기십시오.

# 마스터 지점으로 전환하여 최신 상태인지 확인하십시오.

git checkout master

git fetch [원산지 / 마스터에 대한 업데이트를 수신하려면 (git 구성에 따라) 필요할 수 있습니다]

git pull

# 기능 분기를 마스터 분기로 병합합니다.

git merge feature_branch

# 마스터 브랜치를 원산지 상태로 재설정합니다.

git reset origin/master

#local에서 실수로 파일을 삭제했습니다. 어떻게 다시 검색합니까? DO가 git status삭제 된 자원의 전체 파일 경로를 얻을 수 있습니다

git checkout branchname <file path name>

그게 다야!

#otherotherbranch와 마스터 브랜치 병합

git checkout master
git merge someotherbranchname

# 지역 지점 이름 바꾸기

git branch -m old-branch-name new-branch-name

# 지점 삭제

git branch -D branch-name

# 원격 지사 삭제

git push origin --delete branchname

또는

git push origin :branch-name

# 커밋을 이미 원격 저장소로 푸시 되돌리기

git revert hgytyz4567

GIT를 사용하여 이전 커밋에서 #branch

git branch branchname <sha1-of-commit>

# 최근에 원격으로 푸시 된 최근 커밋의 커밋 메시지 변경

git commit --amend -m "new commit message"
git push --force origin <branch-name>

#이 브랜치에서 모든 로컬 커밋을 버림 [로컬 커밋 제거]

이 브랜치의 모든 로컬 커밋을 버리고 로컬 브랜치를이 브랜치의 "업스트림"과 동일하게 만들려면 간단히 실행하십시오.

git reset --hard @{u}

참조 : http://sethrobertson.github.io/GitFixUm/fixup.html 또는 git reset --hard origin/master[로컬 브랜치가 마스터 인 경우]

# 커밋을 이미 원격 저장소로 푸시 되돌리기?

$ git revert ab12cd15

# 로컬 지점 및 원격 지점에서 이전 커밋 삭제

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

git reset --hard HEAD~1[로컬 지점에서 커밋을 삭제합니다. 1은 한 번의 커밋을 나타냅니다.]

git push origin HEAD --force[둘 다 명령을 실행해야합니다. 원격 지사에서 삭제]. 현재 체크 아웃 된 지점을이 작업을 수행하는 지점이라고합니다.

# 로컬 및 원격 리포지토리에서 최근 커밋을 삭제하고 원하는 커밋을 유지합니다. (로컬 및 원격에서 커밋을 되돌림)

' develop'(이) 라는 원격 지점으로 푸시했다고 3 개의 커밋이 있다고 가정 해 봅시다.

commitid-1 done at 9am
commitid-2 done at 10am
commitid-3 done at 11am. // latest commit. HEAD is current here.

이전 커밋으로 되돌리려면 (브랜치 상태 변경)

git log --oneline --decorate --graph // 모든 커밋을 보려면

git clean -d -f // 로컬 변경 사항 정리

git reset --hard commitid-1 //이 commitid로 로컬 복귀

git push -u origin +develop//이 상태를 원격으로 푸시합니다. + 강제 밀기

# 로컬 git merge 제거 : 사례 : 나는 마스터 브랜치에 있고 마스터 브랜치는 새롭게 작동하는 브랜치 phase2와 병합

$ git status

지점 마스터

$ git merge phase2 $ git status

지점 마스터

지점은 8 커밋 으로 '원산지 / 마스터'보다 앞서 있습니다.

Q : 이 로컬 git merge를 제거하는 방법은 무엇입니까? 시도 git reset --hard하고 git clean -d -f둘 다 작동하지 않았습니다. 있는 유일한 일이 일이 사람 다음 중 하나를 수 있습니다 :

$ git reset-하드 오리진 / 마스터

또는

$ git reset-하드 헤드 ~ 8

또는

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

#gitignore 파일 생성

touch .gitignore // mac 또는 unix 사용자에서 파일을 만듭니다.

샘플 .gitignore 내용 :

.project
*.py
.settings

GIT 치트 시트에 대한 참조 링크 : https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf


1
원격 지점 삭제 명령이 적합 하지 않을 수 있습니다 . 당신은 git push origin :branch-name그러나 사용을 권장합니다git push origin --delete branchname
vibs2006

, 난 당신의 제안에 업데이트 동의 주셔서 감사합니다 @ vibs2006
스파이더

21

자식의 모든 것과 마찬가지로 여러 가지 방법이 있습니다. 사용한 두 명령은 한 가지 방법입니다. 당신이 할 수있는 또 다른 일은 단순히 그것들을 숨기고 있습니다 git stash -u. 는 -u(비 추적) 새로 추가 된 파일도 포함되어 있는지 확인합니다.

핸디 것은 약 git stash -u이다

  1. 아마도 목표를 달성하는 가장 간단한 (단지?) 단일 명령 일 것입니다
  2. 나중에 마음이 바뀌면 모든 작업을 다시 수행 git stash pop할 수 있습니다 (이후 마음이 바뀌면 취소 할 수있는 Gmail의 이메일을 삭제하는 것과 같습니다)

다른 질문으로 git reset --hard추적되지 않은 파일을 제거하지 않으므로 여전히 git clean -f. 그러나 git stash -u가장 편리 할 수 ​​있습니다.


git reset --hard추적되지 않은 파일은 실제로 제거하지 않지만 이미 색인에있는 추적되지 않은 변경 사항 (예 : 파일 변경) 제거합니다. 나는 그것이 당신
이 생각한 것입니다

내가 사용할 때 git stash -ugit bash 에서이 응답을 보았습니다. "{branchname}에 작업 디렉토리 및 색인 상태 WIP를 저장했습니다.이 저장 파일을 사용하여 검색 할 수 git stash pop있습니다.
spiderman

둘 다 고마워 나는 대답을 요약하고 내 질문에 포함시켰다. 크리스토프는 나에게 알려 git stash -u어떻게 팝 않지만, 프레데릭 나를 다시 하드와의 조합을 사용하여 알려 git reset --hardgit clean -f, 그리고 왜 stash일부 시나리오에서 바람직하다. 이제 답변으로 표시해야 할 것을 선택하도록 도와주십시오.
spiderman

그러나 내 저장소에 추가하고 싶지 않은 파일이 있으면 추적하지 않으려면 어떻게해야합니까? 내 레포에서만. 무시 목록에 추가하면 커밋 할 .ignore 파일이있어 다른 모든 사람에게도 영향을 미칩니다.
user20358

7

1. 로컬 변경 사항을 전혀 유지하지 않으려는 경우.

git reset --hard

이 명령은 로컬 저장소에서 모든 로컬 변경 사항을 완전히 제거합니다. 이것은 로컬 변경 사항을 전혀 유지하지 않으려는 경우에만 pull 명령 중에 충돌을 피하는 가장 좋은 방법입니다.

2. 로컬 변경 사항을 유지하려는 경우

원격에서 새 변경 사항을 가져오고이 풀 중 로컬 변경 사항을 무시하려면

git stash

모든 로컬 변경 사항을 숨기고 이제 원격 변경 사항을 가져올 수 있습니다.

git pull

이제 다음을 통해 로컬 변경 사항을 되돌릴 수 있습니다.

git stash pop

1
git reset --hard모든 로컬 변경 사항을 제거하지는 않습니다. 수정 사항 만 제거합니다. 추가를 제거하려면git clean -fd
John Henckel


4

git에는 명확하게 문서화되지 않은 것이 있다고 생각합니다. 나는 그것이 실제로 무시되었다고 생각합니다.

git checkout .

넌 내 하루를 구했어 나는 항상 수정 된 코드를 사용하려고합니다. 그러나 때로는 수정 된 코드를 엉망으로 만들고, 추적되지 않은 새 파일을 추가하는 등의 일이 있습니다. 따라서 내가 원하는 것은 내가 원하는 것을 준비하고, 지저분한 일을 한 다음, 빨리 정리하고 내가 행복하다면 커밋하는 것입니다.

git clean -fd추적되지 않은 파일 에는 잘 작동합니다.

그런 다음 git reset단계적으로 제거하지만 git checkout너무 번거 롭습니다. 파일을 하나씩 지정하거나 디렉토리를 사용하는 것이 항상 이상적인 것은 아닙니다. 때로는 제거하려는 변경된 파일이 유지하려는 디렉토리 내에 있습니다. 스테이지되지 않은 변경 사항을 제거하는이 명령 하나를 원했습니다. 감사.

그러나 나는 git checkout옵션 이 없어야 하고 모든 비 단계적 변경 사항을 제거하고 무대에 닿지 않아야한다고 생각합니다 . 모듈 식이며 직관적입니다. 더 좋아하는 것 git reset. git clean또한 똑같이해야합니다.


2

가장 좋은 방법은 변경 사항을 확인하는 것입니다.

project-name 프로젝트에서 pom.xml 파일을 변경하면 다음과 같은 작업을 수행 할 수 있습니다.

git status

# modified:   project-name/pom.xml

git checkout project-name/pom.xml
git checkout master

# Checking out files: 100% (491/491), done.
# Branch master set up to track remote branch master from origin.
# Switched to a new branch 'master'

2

내용은 모두 폐기 내가 숨기고 그 숨긴 드롭 좋아, 당신이 다수의 repos 사이에 작동 특히, 모두를 폐기하는 가장 빠른 방법입니다.

{0}키의 모든 변경 사항을 숨기고 즉시 삭제합니다.{0}

git stash && git stash drop


1

우선 다음 사항을 확인하여 중요한 변경 사항을 저장했는지 확인하십시오.

$ 자식 상태

시도보다

$ git reset --hard

분기를 기본값으로 재설정합니다

그러나 실행 취소가 필요한 경우 :

$ 편집 (1) $ git add frotz.c filfre.c $ mailx (2) $ git reset
(3) $ git pull git : //info.example.com/ nitfol


더 읽기 >> https://git-scm.com/docs/git-reset


참고 : reset --hard는 위험한 명령입니다. 이렇게하면 모든 변경 사항이 제거되고 취소 할 수 없습니다. 사용자는 하드 리셋을 사용할 때 알고 있어야합니다.
danglingpointer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.