쉬운 영어로 "git reset"은 무엇을 합니까?
에 대한 자세한 내용을 설명하는 흥미로운 게시물을 보았습니다.git reset
.
불행히도, 내가 그것에 대해 더 많이 읽을수록, 나는 그것을 완전히 이해하지 못하는 것처럼 보인다.저는 SVN 출신이고 Git은 완전히 새로운 패러다임입니다.나는 쉽게 얻었지만 Git이 훨씬 더 기술적이다.
생각에는git reset
is에 hg revert
것
이 말은 정확히 의미일까요?git reset
다음 사항에 대한 자세한 설명을 첨부해 주십시오.
- 「」
--hard
,--soft
★★★★★★★★★★★★★★★★★」--merge
; -
HEAD
를 들면, 「」와 같이HEAD^
★★★★★★★★★★★★★★★★★」HEAD~1
; - 구체적인 사용 사례 및 작업 흐름
- 복사본에
HEAD
이치노
으로는, 「 」입니다.git reset
의 기능은 현재 브랜치를 가져와 다른 곳으로 리셋하고 인덱스와 워크트리를 가져오는 것입니다.구체적으로는 마스터브런치(현재 체크아웃)가 다음과 같은 경우:
- A - B - C (HEAD, master)
C가 B를 때, 「C」 「B」를 합니다.git reset B
★★★★★★★★★★★★★★★★★★:
- A - B (HEAD, master) # - C is still here, but there's no branch pointing to it anymore
.을 하다 당신이git checkout B
다음과 같이 됩니다.
- A - B (HEAD) - C (master)
당신은 결국 분리된 헤드 상태에 빠졌습니다. HEAD
match, " " " , " " " " " "B
나 , , , was was was was , , , , , , , , , was , , , , , , , , , , 。C
커밋을 D
되면게 거예요. '그러다', '그러다', '그러다', '그러다', '그러다' 이렇게 될 거예요.이것은 아마 당신이 원하는 것이 아닐 것입니다.
- A - B - C (master)
\
D (HEAD)
리셋은 커밋을 하는 것이 아니라 브랜치(커밋 포인터)를 갱신하여 다른 커밋을 가리킵니다.나머지는 인덱스와 워크트리에서 발생한 작업에 대한 세부 정보입니다.
사용 사례
주요 사용 사례의 대부분을 다루고 있습니다.git reset
다음 섹션의 다양한 옵션에 대해 설명합니다.이것은 매우 다양한 용도로 사용할 수 있습니다.일반적인 스레드는 모두 특정 커밋을 가리키거나 일치하도록 브랜치, 인덱스 및/또는 워크트리를 리셋하는 것입니다.
주의사항
--hard
을 사용하다작업 트리를 변경합니다.git reset [options] commit
커밋을 잃을 수 있습니다.에서는 커밋을 .C
레포에 하실 수 그리고 다음 페이지를 보시면 알 수 있어요git reflog show HEAD
★★★★★★★★★★★★★★★★★」git reflog show master
어느 지점에서도 액세스 할 수 없게 되었습니다.하지만, 그 하는 할 수 (Git 30은 브런치, C는 브런치).
git checkout C; git branch <new branch name>
를 참조해 주세요.
논쟁들
페이지를 바꿔 , 은 man이라는 입니다.git reset [<commit>] [paths...]
이 명령어는 지정된 커밋에서 해당 스테이트에 대한 지정된 경로를 리셋합니다.경로가 제공되지 않으면 트리 전체가 리셋되고 커밋이 제공되지 않으면 HEAD(현재 커밋)로 간주됩니다.이것은 git 명령 간에 공통적인 패턴이기 때문에(예를 들어 정확한 의미는 다르지만 checkout, diff, log), 그리 놀랄 일은 아닙니다.
를 들어, 「」라고 하는 것은,git reset other-branch path/to/foo
의 의 other-display 의 other-display 의 합니다.git reset -- .
는, 현재의 HEAD 로 해, 한 「HEAD」로 합니다.단순한 경우git reset
헤드를 사용하다
주 작업 트리 및 인덱스 옵션
재설정 중에 작업 트리 및 색인에 발생하는 작업을 제어하는 4가지 주요 옵션이 있습니다.
영역입니다. git을 "스테이징 영역"이라고 로 가는지 알 수 있습니다.이 영역은, 「스테이징 에리어」라고 말하면, 사물이 이동하는 장소입니다.git add
약속할 준비를 하고 있습니다.
--hard
이치마마 、 가장가가가가 해해예거 。을 사용법주된 용도 중 하나는 커밋을 전환하지 않고 작업을 낭비하는 것입니다.git reset --hard
「」를 의미합니다.git reset --hard HEAD
예를 들어 브랜치를 변경하지 않고 모든 로컬 변경을 삭제합니다.다른 하나는 단순히 지점을 한 곳에서 다른 곳으로 이동하고 인덱스/워크 트리를 동기화하는 것입니다.이것은 작업 트리를 수정하기 때문에 실제로 작업을 잃게 할 수 있습니다.로컬 작업을 실행하기 전에 반드시 포기해야 합니다.reset --hard
.--mixed
디폴트입니다.★★★★★★★★★★★★★★★★★★★★★」.git reset
「」를 의미합니다.git reset --mixed
는 리셋되지 . 그러면 인덱스가 리셋되지만 워크 트리는 리셋되지 않습니다.즉, 모든 파일은 온전하지만 원래 커밋과 리셋한 커밋의 차이는 git 상태를 가진 로컬 수정(또는 추적되지 않은 파일)으로 표시됩니다.잘못된 커밋을 한 것을 깨달았을 때, 하지만 당신이 한 모든 작업을 유지하고 수정하고 다시 시작할 수 있도록 이 방법을 사용하십시오.다시git add ...
를 참조해 주세요.--soft
인덱스나 워크트리를 건드리지 않습니다.모든 파일은 그대로 유지됩니다.--mixed
ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ 등으로 나타납니다.changes to be committed
기트잘못된 커밋을 했지만 작업은 모두 성공했다는 것을 깨달았을 때 이것을 사용하십시오. - 당신이 해야 할 일은 그것을 다르게 재기동하는 것입니다.색인은 변경되지 않았으므로 원하는 경우 즉시 커밋할 수 있습니다. 결과 커밋은 재설정 전과 동일한 내용을 모두 가집니다.--merge
는 최근에 추가되었으며 실패한 병합을 중단하기 위한 것입니다.은 「이것이 」하기 때문에 필요합니다.git merge
는, 실제로는, 변경 내용이 머지의 영향을 받지 않는 파일에 포함되어 있는 한, 지저분한 작업 트리(로컬의 변경이 있는 작업 트리)와의 머지를 시행합니다.git reset --merge
가 리셋됩니다(예: '리셋').--mixed
은 로컬은 그대로 " 모 - - the - changes - - the - changes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 。이렇게 하면 합병이 잘못되기 전의 모든 것이 복원될 것입니다. 이렇게git reset --merge
)git reset --merge HEAD
)는하는 것이 하는 있기 에, 「브런치」, 「브런치의 이동은 행해지지 않습니다HEAD
을 참조해 주십시오.)좀 더 구체적으로 말하면, 파일 A와 B를 수정하고 파일 C와 D를 수정한 분기에서 병합을 시도했다고 가정합니다.어떤 이유로 마지가 실패하여 사용자가 마지를 중단하기로 결정합니다.은 you 다 you you you
git reset --merge
하면HEAD
그러나 A와 B에 대한 수정은 시도된 병합의 일부가 아니므로 그대로 둡니다.
더 알고 싶으세요?
man git reset
이것은 매우 좋은 일입니다.-아마도 git가 실제로 기능하는 방법에 대한 센스가 필요합니다.특히 시간을 들여 자세히 읽어보면 다양한 옵션과 케이스에 대한 인덱스와 워크트리의 파일 상태를 자세히 설명하는 표가 매우 유용합니다(그러나 매우 조밀합니다.상기 정보의 대부분을 매우 간결한 형태로 전달하고 있습니다).
이상한 표기법
한 표기법 ('이상한 ')HEAD^
★★★★★★★★★★★★★★★★★」HEAD~1
)는커밋을 뿐, 해시 하지 않습니다.3ebe3f6
git-rev-parse의 man 페이지의 "specifying revisions" 섹션에 많은 예시와 관련 구문이 기재되어 있습니다.캐럿과 칠드는 실제로 다른 의미를 가집니다.
HEAD~
말하다HEAD~1
을 사용법HEAD~2
을 사용법HEAD~n
HEAD HEAD "으로 표시됩니다. "N commits before HEAD"는 "N"HEAD"보다 먼저 커밋합니다.HEAD^
(오류)HEAD^1
의 첫 부모도 는 커밋의 첫 번째 부모도 의미합니다.HEAD^2
커밋의 두 번째 부모를 의미합니다.일반 병합 커밋에는 두 개의 부모가 있습니다.첫 번째 부모는 병합된 커밋이고 두 번째 부모는 병합된 커밋입니다.일반적으로 병합은 실제로 임의로 많은 상위(문어 병합)를 가질 수 있습니다.^
★★★★★★★★★★★★★★★★★」~
수 .HEAD~3^2
두, 즉 3세대 조상의 두 번째 부모입니다HEAD
,HEAD^^2
의 첫 의 두HEAD
「」의 경우도 있습니다.HEAD^^^
에에니 , , ,에 해당합니다.HEAD~3
.
점에 주의해 .git
하다
- 포인터는 당신이 어떤 약속을 하고 있는지 알려준다.
- 시스템상의 파일 상태를 나타내는 작업 트리
- 스테이징 영역(인덱스라고도 함)은 나중에 함께 커밋될 수 있도록 "변화"됩니다.
자세한 설명을 첨부해 주세요.
--hard
,--soft
★★★★★★★★★★★★★★★★★」--merge
;
위험도가 증가하는 순서대로:
--soft
HEAD
집결지나 작업용 나무에는 손을 대지 않습니다--mixed
HEAD
스테이징 영역을 업데이트하지만 작업 트리는 업데이트하지 않습니다.--merge
HEAD
는 스테이징 영역을 리셋하고 작업 트리의 모든 변경을 새로운 작업 트리로 이동하려고 합니다.--hard
HEAD
스테이징 영역과 작업 트리를 새로운 환경에 맞게 조정합니다.HEAD
모든 걸 버리면서.
구체적인 사용 사례 및 워크플로우
--soft
다른 커밋으로 이행해, 「자신의 장소를 정리하지 않고」일을 수습하고 싶은 경우.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
--
# git reset --soft example
touch foo // Add a file, make some changes.
git add foo //
git commit -m "bad commit message" // Commit... D'oh, that was a mistake!
git reset --soft HEAD^ // Go back one commit and fix things.
git commit -m "good commit" // There, now it's right.
--
--mixed
(커밋에서의 , 이미 있는--merge
새 지점으로 이동하지만 이미 변경한 내용을 해당 작업 트리에 통합하는 경우.--hard
모든 걸 지우고 새로운 일을 시작할 수 있게 될 거야
블로그 Pro Git의 Reset Demystified 게시물은 매우 간단한 설명을 제공합니다.git reset
★★★★★★★★★★★★★★★★★」git checkout
.
이 글의 맨 위에 있는 유익한 설명 후에 작성자는 규칙을 다음과 같은 간단한 세 단계로 줄였습니다.
본본기예예예예예 예
reset
명령어는 이들 3개의 트리를 특정 순서로 덮어쓰고 사용자가 지시하면 정지합니다.
- 합니다(HEAD의 경우는 합니다).
--soft
)- 다음 (다만, 여기서 ).
--hard
)- 그런 다음 작업 디렉토리를 다음과 같이 만듭니다.
, 또다있 there라는 것도 .
--merge
★★★★★★★★★★★★★★★★★」--keep
옵션입니다만, 지금은 좀 더 심플하게 하고 싶습니다.그것은 다른 기사에 대한 것입니다.
무언가를 get에 커밋할 때는 먼저 변경을 스테이징(인덱스에 추가)해야 합니다.즉, git이 커밋의 일부로 간주하기 전에 이 커밋에 포함할 모든 파일을 추가해야 합니다. repo의 git repo는 git repo.
이제 간단해졌어작업 디렉토리에서 작업하고 파일, 디렉토리 등을 작성해야 합니다.이러한 변경은 추적되지 않은 변경입니다.추적하려면 git add 명령을 사용하여 git 인덱스에 추가해야 합니다.git 인덱스에 추가되면.git 저장소로 푸시하고 싶은 경우 이러한 변경을 커밋할 수 있습니다.
그런데 갑자기 우리는 git 저장소를 푸시하기 위해 인덱스에 추가한 파일이 하나 더 있다는 것을 알게 되었습니다.그 파일을 색인화하지 말라는 뜻이죠.이제 문제는 git 인덱스에서 파일을 어떻게 삭제하느냐입니다. git add를 사용하여 인덱스에 넣었기 때문에 git rm을 사용하는 것이 논리적이겠습니까?땡! git rm은 단순히 파일을 삭제하고 인덱스에 삭제를 추가합니다.이제 어떻게 해야 할까요?
용도:-
git 리셋
인덱스를 지우고 작업 디렉토리를 변경하지 않습니다.(모든 것을 정지시킵니다).
여러 가지 옵션과 함께 사용할 수 있습니다.git reset에는 --hard, --soft, --mixed의 3가지 주요 옵션이 있습니다.이러한 설정은 재설정 시 HEAD 포인터 외에 재설정되는 항목에 영향을 미칩니다.
먼저 --hard는 모든 것을 리셋합니다.현재 디렉토리는 그 지점을 계속 따라다녔을 때와 똑같습니다.작업 디렉토리 및 인덱스가 해당 커밋으로 변경됩니다.제가 가장 자주 사용하는 버전입니다.git reset --hard는 svn revert와 같은 것입니다.
다음으로 정반대인 소프트를 사용해도 작업 트리나 인덱스는 리셋되지 않습니다.HEAD 포인터만 이동합니다.이것에 의해, 현재의 상태는, 디렉토리내의 커밋과는 다른 변경으로 남겨져 커밋을 위해서 「스테이징」됩니다.로컬에서 커밋을 하지만 git 서버에 푸시하지 않은 경우 이전 커밋으로 리셋하여 좋은 커밋 메시지로 다시 시작할 수 있습니다.
마지막으로 --mixed는 색인을 재설정하지만 작업 트리는 재설정하지 않습니다.따라서 변경은 모두 아직 존재하지만 "단계 없이" git added" 또는 git commit -a가 필요합니다.git commit -a에서 의도했던 것보다 더 많이 커밋한 경우 git reset --mixed로 커밋을 취소하고 커밋하고 싶은 것을 추가하여 커밋할 수 있습니다.
git revert와 git reset의 차이:-
쉽게 말해 git reset은 "미승인 실수를 수정하기 위한 명령어이고 git revert는 "미승인 실수를 수정하기 위한 명령어입니다.
즉, 만약 우리가 어떤 변경에 실수를 해서 그것을 git repo에 커밋하고 푸시했다면 git revert가 해결책입니다.또한 푸시/커밋 전에 동일한 오류를 발견했을 경우 git reset을 사용하여 문제를 해결할 수 있습니다.
그것이 당신의 혼란을 없애는 데 도움이 되기를 바랍니다.
TL;DR
git reset
스테이징을 마지막 커밋으로 리셋합니다.--hard
작업 디렉토리의 파일을 마지막 커밋으로 리셋합니다.
긴 버전
그러나 그것은 명백하게 단순하기 때문에 많은 다소 장황한 답변들이 있다.이 책을 읽는 게 더 말이 되더라고요git reset
과 같습니다§:
git revert가 변경을 취소하는 "안전한" 방법이라면 git reset은 위험한 방법이라고 생각할 수 있습니다.git reset을 사용하여 실행 취소하면(커밋은 더 이상 참조 또는 reflog에서 참조되지 않습니다), 원본 복사본을 가져올 방법이 없습니다. 영구 실행 취소입니다.이 도구는 Git 명령어 중 유일하게 작업을 잃을 수 있으므로 사용할 때 주의해야 합니다.
https://www.atlassian.com/git/tutorials/undoing-changes/git-reset 에서
그리고 이건
커밋 레벨에서 리셋은 브랜치 끝을 다른 커밋으로 이동하는 방법입니다.이 명령을 사용하여 현재 분기에서 커밋을 제거할 수 있습니다.
https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting/commit-level-operations 에서
이는 이 복잡한 기능을 이해하기 위한 첫 번째 단계로서 간략화된 설명임을 유의하시기 바랍니다.
각 명령어 후에 프로젝트 상태를 시각화하고 싶은 시각 학습자에게 도움이 됩니다.
색상이 켜진 상태에서 터미널을 사용하는 경우(git config --global color.ui auto):
git reset --soft A
C의 커밋할 되어 ).
git reset --mixed A
(오류)git reset A
C의 미준비, ).
git reset --hard A
B와 C의 변경은 어디에서도 볼 수 없게 됩니다(존재하지 않는 것처럼 됩니다).
또한 '타워' 또는 '소스 트리'와 같은 GUI 프로그램을 사용하는 사용자도 있습니다.
git reset --soft A
가 된C의 이 '됩니다.
git reset --mixed A
(오류)git reset A
않은 파일'후가 되어 것을 볼 수
git reset --hard A
B와 C의 변경은 어디에서도 볼 수 없게 됩니다(존재하지 않는 것처럼 됩니다).
체크 아웃은 특정 커밋의 헤드를 가리킵니다.
리셋은 브랜치를 특정 커밋으로 포인트 합니다.(브런치는 커밋에 대한 포인터입니다).
덧붙여서, 지사에서 지적하고 있는 커밋을 머리가 가리키지 않는 경우는, 분리된 헤드가 됩니다. (잘못된 것으로 판명되었습니다).코멘트를 참조해 주세요...)
항상 git reset을 하는 것은 아니지만, 리셋을 할 때는, 이것을 확인합니다.
* 444668f (HEAD -> main) C
|
* c3739b7 B
|
* 207e8a1 A
|
* 38fab46 Initial commit
git reset --hard 207e8
* 207e8a1 (HEAD -> main) A
|
* 38fab46 Initial commit
To retrieve the changes, use --soft instead
HEAD
A
)main
'왜냐하면' '왜냐하면'HEAD
main
git reset
않다B
★★★★★★★★★★★★★★★★★」C
. 、 볼 、 . can . . . . . . . . 뜹니다B
★★★★★★★★★★★★★★★★★」C
--reflog
옵션:
git log --graph --oneline --all --reflog
경고
git reset
,
스테이징되지 않은 변경이 있는 경우
- ★★★★★★★★★★★★★★★★
--hard
폐기됩니다. - ★★★★★★★★★★★★★★★★
--mixed
(기본값), 단계별 변경 및 검색된 커밋 변경과 혼합됩니다.
- ★★★★★★★★★★★★★★★★
단계적 변경이 있는 경우:
- ★★★★★★★★★★★★★★★★
--hard
폐기됩니다. - ★★★★★★★★★★★★★★★★
--mixed
단계화되지 않은 변경 및 취득된 커밋 변경과 혼합됩니다. - ★★★★★★★★★★★★★★★★
--soft
취득한 커밋의 변경과 혼재합니다.
- ★★★★★★★★★★★★★★★★
, 「이것들」을 할 수 있습니다.git stash
다만, 새로운 브랜치를 작성하고, 거기에 스테이징 된 변경과 스테이징되지 않은 변경을 위한 개별 커밋을 작성하는 것을 선호합니다.+ 를 사용합니다.git reset
내가 필요할 때 말이야
언급URL : https://stackoverflow.com/questions/2530060/in-plain-english-what-does-git-reset-do
'programing' 카테고리의 다른 글
메서드 호출을 1초간 지연하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
---|---|
git에게 자기 서명 증명서를 받아들이게 하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
커스텀 리스트에 WPF ComboBox 바인딩 (0) | 2023.04.09 |
워크시트 데이터에 SQL과 같은 쿼리를 만드는 Excel 함수? (0) | 2023.04.09 |
Swift에서 배열에서 요소를 제거하는 방법 (0) | 2023.04.09 |