[Git] Git add, commit, push 취소하기

주형(Jureamer)·2022년 11월 19일
0
post-custom-banner

협업을 하기 위해서는 git이 거의 필수가 되었다. 그리고 쓰다가 보면 실수를 하거나 했던 행위를 되돌리고 싶을 때가 있다. 나는 특히 많았다..ㅠ 그럴 때마다 검색해서 사용하고 또 까먹고 또 검색하기가 힘들어 정리를 해보고자 한다.

1. git add 취소하기

  • git add {filename} 명령어 입력 시 해당 파일이 staged 상태로 변경된다.
  • git reset {file} 명령어를 통해 git add를 취소할 수 있다.
  • file명을 입력하지 않으면 staged된 전체 파일을 취소한다.
// 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

2. git commit 취소하기

  • 예정보다 일찍 commit하거나, 특정 파일을 빼먹고 commit 한 경우 commit을 취소해야한다.
// 상태 확인
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 상태로 되돌리지만, add나, 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로 저장하면 메세지가 성공적으로 변경된다.


3. git push 취소

  • 이 명령어는 자신의 local 내용을 remote에 강제로 덮어쓰기 하는 것이므로 주의가 필요하다.
  • 특히, 협업 프로젝트에서는 동기화 문제가 발생할 수 있으므로 팀원과 상의 후 진행해야한다.
//가장 최근의 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 파일 삭제

  • git clean 명령어는 추적 중이지 않은 파일만 지우는 게 기본이다. (.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

참고

profile
작게라도 꾸준히 성장하는게 목표입니다.
post-custom-banner

0개의 댓글