hyperskill - Git undo/reset 영어 원문
사람들은 모두 실수를 합니다.
당신도 스스로의 프로젝트를 작업하고 있을 때 실수를 만들 수 있습니다.
마치 잘못 된 파일을 삭제하거나, 손상 된 코드를 변경사항으로 만드는 등 말이죠.
다른 개발자들과 작업 하고 있을 때, 누군가는 아마 우연히 손상 된 코드를 가진 변경 사항을 push 할 겁니다.
시간이 지나 갈 수록, 당신은 문제에 대해 서로 다른 접근법들과 해결법들을 실험 할 수 있습니다.
이러한 모든 경우들에 대해서, 당신은 프로젝트를 이전의 작업 상태로 돌아갈 줄 알아야 합니다.
이제 이를 어떻게 하는지 봅시다.
Reset - 리셋
변경 사항을 취소하기 위해 당신이 알아야 하는 주요 명령어는 git reset 입니다.
우리는 git reset
명령어에서 가장 많이 사용되는 옵션들을 보여 줄 겁니다.
첫 번째는 --soft
입니다.
@~1
옵션을 같이 사용하여 마지막 commit을 취소 할 수 있지만,
staging area의 상태와 손대지 않은 working tree 를 유지합니다.
staging area
: 현재 git add로 변경 사항을 추가하고 있는 index
$ git reset --soft @~1
@
은 HEAD
의 별칭이며,
@~1
대신 특정 commit 의 해시를 입력하여 해당 커밋으로 reset 할 수 있습니다.
또는 현재 커밋을 기준으로 상대적인 위치를 지정할 수 있습니다.
예를 들어, @~2
는 마지막 commit 이전의 commit 을 의미합니다.
두 번째는 --mixed
옵션입니다. (이는 git reset
에 어떠한 옵션도 붙지 않았을 때의 디폴트 버전입니다.)
이 옵션은 지정 된 commit 과 매칭되는 staging area를 리셋합니다.
하지만, working tree 의 상태는 유지합니다.
$ git reset --mixed @~1
마지막은 --hard
옵션입니다.
아마 당신이 이미 생각 해 봤을 이것은,
지정 된 commit과 매칭되는 staging area의 상태를 reset 하며,
또한 레포지토리에 커밋 되어 있는 working tree 또한 reset 합니다.
$ git reset --head @~1
이 명령어는 working tree 안에 있는 파일들의 변경 사항을 지우기 때문에 이를 조심히 사용해야 합니다.
만약 working tree 에서 만들어진 변경 사항들이 절대로 commit 되지 않는다면,
우리는 추후에 이를 복구 할 수 없습니다.
하지만, 로컬 파일들의 변경사항들이 한 번 커밋 되었다면,
git reset --hard
의 변경사항을 재설정 하는 방법이 있습니다.
이를 나중에 보여주겠습니다.
flowchart LR
subgraph working
direction TB
working-directory("working directory") -- git add --> staging-area("staging-area");
staging-area -- git commit --> repository("repository");
end
working-directory;
staging-area;
repository;
git-reset-h("git reset --hard") -.-> working-directory
git-reset-h -.-> staging-area
git-reset-h -.-> repository
git-reset-m("git reset --mixed") -.-> staging-area;
git-reset-m -.-> repository;
git-reset-s("git reset --soft") -.-> repository
In the staging area and working area - 준비 영역과 작업 영역
지금, 만약 당신이 staging area에서 몇 개의 파일을 unstage 하고 싶다면?
혹은 working tree에서 조정 된 파일에서 변경 사항들을 제거 하고 싶다면요?
이를 어떻게 수행하는지 봅시다.
commit을 위해 file-1
과 file-2
를 stage 했다고 말해 봅시다.
하지만 당신은 생각을 바꿨고, file-2
를 commit 하지 않길 원합니다.
staging area에서 이 파일을 제거하는 두 가지 방식이 있습니다.
하나는 우리가 이미 알고 있는 git reset
명령어입니다.
우리는 이 명령어를 @
(혹은 HEAD
) 옵션과 파일 이름을 사용합니다, 밑의 예시처럼요 :
$ git reset @ file-2
또 다른 하나는 새로운 명령어 git restore
과 옵션 --staged
를 사용합니다 :
$ git restore --staged file-2
만약 당신이 어떠한 이유에서간에 local file 안의 working tree 에서 만들어진 변경사항을 제거하고 싶다면,
마지막 commit의 상태에 있는 파일들을 복원함으로써 이를 수행 할 수 있습니다.
이것 또한 두 가지 방식이 있습니다 :
git restore
명령어를 사용 할 수 있습니다.
$ git restore file-1
- 또는
git checkout
명령어와--
옵션을 사용할 수 있습니다.
$ git checkout -- file-1
이러한 명령어들이 당신의 파일들을 덮어 쓰는 만큼, 주의하세요.
다시 한번 말합니다. - 당신이 commit 하지 않은 모든 변경사항들은 복구 할 수 없습니다.
Revert - 돌아가기
우리는 git reset
명령어가 local repo의 변경 사항을 취소하는 데 도움이 된다는 것을 알고 있습니다.
지금, 만약 당신이 remote repo(원격 레포지토리)에 잘못된 것을 commit 했으며 이를 취소하고 싶다면?
이러한 경우, git reset
을 사용 할 수 없습니다.
누군가 이 remote repo에서 이미 변경 사항들을 pull 했을 수도 있으며,
당신은 일치하지 않는 기록을 가지고 있기 때문입니다.
이러한 상황에서 올바르게 변경 사항을 취소하는 방식은,
이전의 상태가 가지고 있는 모든 변경사항으로 돌아가는 새로운 commit을 만드는 것 입니다.
git revert 명령어는 이를 도와 줄 겁니다.
이는 마지막 commit과 미러링 된 변경사항을 만들며, 모든 것을 취소 할 겁니다.
따라서 당신의 새로운 commit은 마지막에 했던 commit 이전의 commit과 똑같습니다.
여기 명령어들이 있습니다 :
git revert @ # 현재 commit 으로부터 새로운 revert commit을 만듭니다.
git push origin main # 당신의 remote repository에 새로운 revert commit을 push 합니다.
git reset
명령어와 마찬가지로 당신이 돌아가고자 하는 변경사항을 가진 어떤 commit이던 해시를 사용할 수 있습니다.
git revert
명령어는 이전 커밋을 삭제하지 않고, 해당 커밋에서 만들 어진 변경사항들을 취소 할수 있게 해 줍니다.
How to undo git reset --hard? - git reset --hard
명령어 취소하는 방법
위에서 우리가 git reset --hard
에 대해서 말했던 것이 기억 나나요?
당신은 모든 변경사항들을 잃을 수 있기에 이를 사용하기에 조심해야 합니다.
사실, 변경 사항들을 잃어버리지 않았습니다.
당신이 한번이라도 변경 사항을 commit 했다면, 여전히 Git 내부에 있습니다.
이것들을 찾기 위해서, 당신은 그저 git reflog
명령어를 사용하면 됩니다.
git reflog
명령어는 repository의 모든 commit들과 그들의 해시의 목록을 보여줍니다.
심지어 commit이 삭제(delete) 되었거나, 잃어버렸어도(lost) 말이죠.
당신은 이 정보를 commit 혹은 branch를 복구하기 위해 사용 할 수 있습니다.
$ git reflog
Conclusion - 결론
이제 당신은 git에서 변경 사항을 취소 하는 법을 이해했으며, 이러한 명령어들에 더 자신감을 느끼길 바랍니다.
가장 본질적인 것들을 요약 해 봅시다.
1. git reset
commit을 리셋하기 위해서,
git reset --soft
를 사용하여 staging area의 상태와 working tree의 상태를 유지 할 수 있으며,
git reset --mixed
를 사용하여 working tree 의 상태만 유지 할 수도 있으며,
git reset --hard
를 사용하여 staging area와 working tree의 상태 둘 다 변경사항을 취소 할 수 있습니다.
2. git revert
모든 변경 사항을 하나의 지점으로 복귀하는 새로운 commit을 만들기 위해서 git revert
를 사용합니다.
3. git reflog
리셋 할 commit을 찾기 위해서 이전에 git reflog
명령어를 사용하세요.
words to remember
accidentally : 우연히
experiment : 실험하다, 실험
revert : 돌아가는 것, 달아가다, 옛 상태로 돌아가다, 복귀하다
undo : 실행 취소, 플리다, 풀어 놓다
intact : 손대지 않은
inconsisten : 일관성 없는, 일치하지 않는, 모순되는
confident : 자신감, 자신 만만한, 확신하고 있는, 절친한 친구, 막역한 벗
'Hyperskill - 컴퓨터 CS 및 영어 독해 > Introduction to Git' 카테고리의 다른 글
Conventional Commits and commitlint - 관례적인 커밋 메세지와 이를 돕는 commitlint (1) | 2024.06.07 |
---|---|
Git diff - Git diff 명령어 및 사용법 (1) | 2024.06.05 |
Git internal structure - Git의 내부 구조 (0) | 2024.06.03 |
Explore folders and files - 터미널로 폴더와 파일 탐색하기 (1) | 2024.06.02 |
Semantic versioning - 의미론적 버전 관리 (시멘틱 버저닝) (0) | 2024.06.01 |