협업을 하기 위해서는
git
이 거의 필수가 되었다. 그리고 쓰다가 보면 실수를 하거나 했던 행위를 되돌리고 싶을 때가 있다. 나는 특히 많았다..ㅠ 그럴 때마다 검색해서 사용하고 또 까먹고 또 검색하기가 힘들어 정리를 해보고자 한다.
git add {filename}
명령어 입력 시 해당 파일이 staged 상태로 변경된다. git reset {file}
명령어를 통해 git add를 취소할 수 있다. // Test.js 파일 add
git add Test.js
// 상태 확인
git status
/*
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: Test.js
*/
// add 취소 (staged 상태 -> unstaged 상태)
git reset Test.js
// 상태 확인
git status
// 1. commit을 취소하고 해당 파일들을 staged 상태로 워킹 디렉토리에 위치시킴
git reset --soft HEAD^
// 2. commit을 취소하고 해당 파일들을 unstaged 상태로 워킹 디렉토리에 위치시킴
git reset --mixed HEAD^
git reset HEAD^ // 위 옵션과 동일
git reset HEAD~2 // 최근 2개의 commit을 취소
// 3. commit을 취소하고 해당 파일들을 unstaged 상태로 워킹 디렉토리에서 삭제
git reset --hard HEAD^
2-1. reset 옵션
위와 같이 reset에는 옵션이 여러가지가 존재하고, 각각 결과가 상이하기 때문에 주의해서 사용해야 한다.
soft
: index 유지(staged 상태 유지, 워킹 디렉토리에 파일 보존)mixed
: index 취소(unstaged 상태, 워킹 디렉토리 파일 보존, 기존 옵션)hard
: index 취소(unstaged 상태, 워킹 디렉토리 파일 삭제, 모두 취소)2-2. 워킹 디렉토리를 원격 저장소의 마지막 commit 상태로 되돌리고 싶은 경우
// 워킹 디렉토리를 원격 저장소의 마지막 commit 상태로 되돌림
git reset -hard HEAD
2-3. commit message 변경
커밋 메시지 변경과 관련하여 이미 push를 한 상황이라면 force
옵션을 통해 변경은 가능하지만,, 혼자가 쓰는 레포지토리가 아닌 공용레포지토리에서는 다른 팀원들이 로그를 수동으로 수정해줘야하는 불편함이 있기 때문에 최대한 지양
해야한다고 한다. 그렇기에 로컬
에 commit이 존재할 때만 정리해보겠다.
1. 가장 최근 커밋 수정
- git commit --amend
는 vi 터미널에서 메시지 수정 후 저장
- git commit --amend -m "commit message"
는 편집기로 넘어가지 않고 바로 메시지가 수정된다.
2. 더 오래된 commit 수정이나 한 번에 여러 commit 수정
git rebase -i HEAD~숫자
을 입력하면 해당 수 만큼의 최근 commit을 보여준다
git rebase -i HEAD~3
/*
pick eaa4c91 TEST1
pick 4e1c7cc TEST2
pick ecd14be Fix: TEST3
# Rebase 2d70f45..ecd14be onto 2d70f45 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
-- INSERT --
각 commit 앞에 붙여진pick
을 reword로 바꾸고 :wq
를 통해 저장하면 각각의 commit 메세지를 수정할 수 있는 창이 순차적으로 띄워진다.
이후 원하는 메세지로 수정한 뒤 다시 :wq
로 저장하면 메세지가 성공적으로 변경된다.
//가장 최근의 commit을 취소, 기본 옵션 --mixed
$git reset HEAD^
//Reflog(브랜치와 HEAD가 지난 몇 달 동안에 가리켰던 커밋) 목록 확인
$git reflog 또는 $git log -g
//원하는 시점으로 워킹 디렉토리 되돌림
$git reset HEAD@{number} 또는 $git reset [commit id]
//되돌려진 상태에서 다시 commit
$git commit -m "커밋 메시지"
//원격 저장소에 강제 push
$git push origin [branch name] -f 또는 $git push origin +[branch name]
// Ex) master branch를 원격 저장소(origin)에 강제로 push
$ git push origin +master
3-1. untracked 파일 삭제
.gitignore
에 명시한 무시되는 파일은 안지움)//디렉토리를 제외한 파일들만 삭제
$git clean -f
//디렉토리까지 삭제
$git clean -f -d
//무시된 파일까지 삭제
$git clean -f -d -x
3-2. option
-d
: 디렉토리까지 지우는 것-x
: 무시된 파일까지 모두 지우는 것 (빌드 파일도 지워질 수 있으니 주의가 필요하다)-n
: 가상으로 실행 후 어떤 파일이 지워질지 알려줌안전 장치로 지우기 전엔 -n
옵션을 사용해서 확인 후에 지우도록 하자!!
git clean -n -d
Would remove .vscode/tasks.json
Would remove algorithm.js