2025. 4. 29. 22:03ㆍDevelopers 공간 [Shorts]/Software Basic
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew,
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter
- Module Bundler : React, Webpack, Parcel
B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS
C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight
1. What? (현상)
이번 글에서는 git에서 add, commit, push 등의 작업을 한뒤에 이들을 취소하고 싶을 때 조치할 수 있는 방법들을 정리하려고 합니다.
각 단계에 대해 취소하는 방법들을 살펴보겠습니다.
2. Why? (원인)
- X
3. How? (해결책)
각각의 단계별로 코드를 살펴보겠습니다.
1. git add 다음 Staging Area에 올린 것 취소하기
git add 함수를 통해 Staging Area에 올렸는데, 해당 내용을 다시 unstaged 상태로 돌리고 싶을 때 사용하는 상황입니다.
아래는 Working Directory 내용은 그대로 두고 add 만 취소하고 싶을 때 입니다.
# reset specific file
git reset HEAD FILE_NAME
# reset all
git reset HEAD
git reset
2. git commit 다음 Local Repository에 올린 것 취소하기
git add 후 git commit 함수를 통해 commit을 만들었는데, 이를 취소하고 싶을 때 사용하는 방법입니다.
아래는 Working Directory 내용은 그대로 두고, HEAD를 한 커밋 이전으로 되돌리면서 Working Directory의 변경 내용은 유지하는 방법입니다.
** HEAD : 해당 브랜치의 마지막 commit
# reset all
git reset --mixed HEAD^ # Version 1
git reset HEAD^ # Version 2
근데 위는 문제가 있습니다. 위는 "이전의 commit을 취소하는 과정"인데, 이후에 수정하고 git push를 하는 경우 이미 해당 commit이 remote history에 기록이 되었을 때 Local과 Remote의 커밋 기록이 달라져서 git이 push를 거부합니다.
따라서 이를 해결하려면 --force로 “내 로컬 커밋 이력이 맞으니까 강제로 덮어써줘”라고 명령할 수 있습니다.
이런 문제가 생기는 것이 싫으면, 이에 대한 대책은 아래와 같습니다. 아래는 위처럼 "커밋 이력을 삭제"하지 않고 "커밋 이력을 보존하면서 오히려 되돌리는 커밋을 생성"하는 방법입니다.
** 아래 git reset은 Staged 상태로 된 것을 처리하기 위함입니다.
# reset all
git revert --no-commit HEAD && git reset
3. git push를 잘못했을때 취소하기
이미 git push를 했다면 사실 remote에서 직접 revert하지 않는 이상 로컬에서 할 수 있는 것은 로컬 파일을 업데이트 한 뒤 다시 push하는 방법입니다.
예를 들어 아래는 "내 작업 branch가 master가 아닌데, push를 이미 했고 master 상태로 바꾸고 싶을 때", 일단 로컬을 origin/master로 전부 변경해주고 다시 add/commit/push를 해주면 됩니다.
# reset specific file
git checkout origin/master -- FILE
# reset all
git checkout origin/master -- .
--------------------------------------------------------
<remote에 있는 파일로 전부 대체 하는 방법 두가지 >
모든 파일과 폴더를 origin/master 브랜치에서 가져오는 방법은 아래와 같이 두가지가 있습니다.
근데 두개가 같은 뜻인 것 같으면서도 다른 부분이 있습니다.
1. git checkout origin/master -- *
이미 추적 중인 하위 디렉토리가 아닌 하위 디렉토리의 경우 아래와 같은 에러로 불가능합니다.
error: pathspec 'FOLDER_NAME' did not match any file(s) known to git
또한 해당 디렉토리(하위는 아님)의 숨김파일은 아예 위 명령어로 추적이 안됩니다.
위 현상들이 일어나는 모든 원인은, 위 명령어를 쉘(Bash 등)이 먼저 해석하는데 명령어 중 "*"를 아래와 같이 변경해서 실행하게 되기 때문입니다.
git checkout origin/master -- file1 file2 study …
이렇게 변경해서 실행할 때 숨김파일이나, 하위 폴더안에 있는 것들은 "*"에서 해석되지 않기 때문에 위와 같은 일들이 일어납니다.
2. git checkout origin/master -- .
현재 디렉토리(.) 이하 모든 파일과 폴더를 origin/master 브랜치에서 가져옵니다
--------------------------------------------------------
'Developers 공간 [Shorts] > Software Basic' 카테고리의 다른 글
[PyTorch] Layer Freeze 하기 (0) | 2025.05.27 |
---|---|
[Python] parameter & argument 몇가지 특징 기록 (0) | 2025.05.01 |
[PyTorch] Tensor와의 기본연산시 Broadcasting 문제 (0) | 2025.04.29 |
[Bash] 여러개의 Disk를 모아서 mount하기 (0) | 2025.04.28 |
[PyTorch] scaled dot product에서 Attention Map 디스플레이 하기 (0) | 2025.04.10 |