Git commit 수정하기, diff, checkout, revert, reset

정보/뉴스

Git commit 수정하기, diff, checkout, revert, reset

담운 0 1,166 2019.06.08 12:44

안녕하세요. 이번 시간에는 두 번째 commit을 push해보겠습니다. 대신 새롭게 배우는 게 있어야하니까 실수로 잘못된 commit을 만든 경우를 가정하고 진행하겠습니다.

예전에 Git에는 크게 두 가지 상태가 있다고 그랬죠? UntrackedTracked 파일입니다. Untracked는 Git 버전관리에 포함되지 않은 파일이고, Tracked는 포함된 파일이죠. 여기서 다시 Tracked는 세 가지 상태로 나뉩니다. 이제부터 알아보겠습니다.

지난 시간의 git.html을 수정합니다.

<!DOCTYPE html>
<html>
<head>
 <title>깃 연습</title>
 <link rel="stylesheet" href="./git.css" />
</head>
<body>
 <h1>깃 수정</h1>
 <p><b></b> 파일을 수정했습니다.</p>
</body>
</html>

git status를 눌러 상태를 확인해보죠.

undefined

Changes not staged for commit이라고 하면서 modified: git.html이 있네요. 수정된 파일도 직접 add를 해주어야 다음 commit 때 반영됩니다. commit은 Git에서는 하나의 단위로 취급됩니다. 따라서 최대한 잘게 commit을 해주는 게 좋습니다. 그래야 나중에 자유자재로 원하는 부분만 되돌릴 수 있거든요.

git diff

만약 수정된 파일에서 어떤 부분이 달라졌는지 확인하고 싶다면 git diff 명령어가 있습니다.

undefined

한글이 깨졌네요. git.html 파일을 메모장으로 열어(혹은 다른 에디터를 열어) 다른 이름으로 저장을 누르고 ANSI나 EUC-KR 대신 UTF-8 인코딩으로 저장합니다. 그리고 다시 git diff를 해볼까요.

undefined

이제 제대로 나오네요. 바뀐 부분이 -와 +를 통해 보여집니다. 명령 프롬프트라서 그런지 보기가 좀 불편하죠? 특히 파일이 많아지면 바뀐 부분도 많아져 더 불편합니다. 나중에는 바뀐 점을 시각적으로 보여주는 Git GUI나 Git을 지원하는 IDE를 사용하세요.

undefined

위의 그림은 Untracked와 Tracked의 3단계를 보여줍니다. 3단계로 Unmodified, Modified, Staged가 있는데요. Unmodified는 commit을 한 후 변경점이 없을 때, Modified는 지금처럼 파일을 변경했을 때, Staged는 변경한 파일을 add했을 때의 상태입니다.(초록색으로 표시되는 파일이 Staged입니다)

파일을 새로 만들어서 add해도 Staged에 등록됩니다. Staged는 이제 commit될 준비가 되었음을 뜻합니다. Staged 상태의 파일을 commit하면 다시 Unmodified 상태가 됩니다.

git checkout

Modified 상태의 파일을 add하지 않고 다시 Unmodified로 되돌려보겠습니다. 수정을 잘못해서 파일을 원상태로 되돌리고 싶을 때 사용합니다. git checkout git.html하면 원래대로 되돌아옵니다.

undefined

더 이상 git diff의 내용이 표시되지 않고 원래대로 되돌아왔습니다.

git reset

만약 add까지 해서 Modified가 아니라 Staged 상태라면 원래대로 어떻게 되돌릴까요? git reset git.html하면 Staged 상태에서 Modified 상태로 돌아갑니다. 그 다음에 git checkout git.html로 Modified에서 Unmodified로 되돌리면 되겠죠?

undefined

commit을 한 후에 되돌릴 때도 git reset이 사용됩니다. 옵션이 세 가지가 있는데요. --soft, --mixed, --hard입니다. --soft는 파일들을 commit 후의 Unmodifed에서 commit 직전의 Staged 상태로 만들고, --mixed는 Unmodified에서 commit 전의 Modified 상태로 만듭니다. --hard는 Unmodified에서 commit 전의 Unmodified로 만듭니다. 다 날려버리는 거죠. --mixed가 기본 옵션입니다.

undefined

git reset HEAD~1을 한 것이 보이죠? HEAD가 현재 commit의 위치를 나타냅니다. ~1을 하는 것은 commit 1개 전으로 되돌아가라는 뜻이고요.

아무런 옵션을 넣어주지 않으면 reset 시 기본적으로 --mixed가 적용됩니다. --mixed는 Unmodified에서 이전 commit의 Modified 상태로 돌아갑니다. git status를 해보면 제대로 돌아간 것을 알 수 있습니다.

git revert

revert는 reset과 비슷하지만 이전 commit 내용을 새 commit으로 만들어서 저장합니다. 무슨 말인지 보여드리자면, 우선 commit을 한 후에 git revert HEAD를 합니다 현재 HEAD를 취소하고 이전 HEAD로 돌아간다는 뜻입니다. 갑자기 화면이 바뀌면서 다음과 같이 나옵니다.

undefined

revert에 대한 commit 메세지를 바꿀 수 있는데요. 메세지를 원하는대로 바꾸고 :wq를 쳐줍니다. 저장하고 나가겠다는 뜻입니다.

undefined

이렇게 revert가 완료되었는데요. reset은 이전 commit으로 직접 되돌아갔다면 revert는 현재 commit 위에 이전 commit을 덮어씌웠기 때문에 새로운 commit이 하나 추가되었습니다.

undefined

git log가 눈이 아프다면 Git을 설치할 때 딸려오는 Git GUI를 사용해서 시각적으로 log를 볼 수 있습니다. 프로젝트 폴더에서 마우스 오른쪽을 누르고, Git GUI를 실행한 후, Repository 메뉴에서 Visualize all branch history를 클릭하면 보입니다.

reset하면 될 것을 왜 revert를 해서 commit을 하나 더 늘리냐고 의문을 가질 수 있겠죠? revert는 commit을 이미 push해서 서버에 저장해버린 경우 자주 사용합니다.

서버에는 이미 잘못된 commit이 저장되었기 때문에 클라이언트에서 reset을 해봤자 서버에서는 되돌릴 수 없습니다. 서버에 한 번 저장된 commit은 다시 되돌리지 못합니다.(한 가지 방법이 있는데 안 쓰는 것을 추천하기 때문에 알려드리지 않겠습니다. 궁금하시면 댓글을 달아주세요.) 그래서 commit을 덮어쓰는 revert 방법을 선택하는 겁니다.

다음 시간에는 대망의 branch에 대해 알아보겠습니다!

Comments

번호 제목 글쓴이 날짜 조회
72 과연 양방향매매로 수익낼 수가 있는가… 댓글+1 담운 2020.05.14 2066
71 [해외선물] 실시간 시세신청 안내-지… 담운 2020.05.11 639
70 해외선물 실시간 시세 무료로 볼 수 … 담운 2020.05.10 1082
69 DB금융투자, 수수료 혜택 등 해외선… 담운 2020.04.02 566
68 위험 고지 담운 2020.03.31 568
67 리스크 고지 담운 2020.03.11 551
66 해외선물 증거금 담운 2019.10.20 831
65 CME E-micro 담운 2019.10.20 823
64 파생상품 양도소득세 확정신고 안내 담운 2019.09.25 856
63 주식, 암호화폐, 해외주식 세금 비교 담운 2019.09.13 880
62 해외선물옵션 API 시세 유료화 정책… 담운 2019.08.28 1863
61 Github에 ssh키 생성하고 등록… 담운 2019.06.08 1194
60 github-white-logo-70… 담운 2019.06.08 1228
59 ssh-key 생성 및 github,… 담운 2019.06.08 1713
58 Git 서버 - SSH 공개키 만들기 담운 2019.06.08 1350
57 Nodejs로 구현한 서비스를 Caf… 담운 2019.06.08 2998
56 GitHub SSH 키 생성 및 등록… 담운 2019.06.08 1526
55 기타 Git 명령어(cherry-pi… 담운 2019.06.08 1016
54 Merge와 Rebase 담운 2019.06.08 1103
53 Git 브랜치(Branch) 관리 담운 2019.06.08 1338
열람중 Git commit 수정하기, dif… 담운 2019.06.08 1167
51 Github 사용하기, remote,… 담운 2019.06.08 1641
50 Git 저장소 생성(init), 최초… 담운 2019.06.08 1236
49 Git 설치와 사용법(Git Bash… 담운 2019.06.08 1296
48 node.js git 사용법 담운 2019.06.08 1453
47 Windows에서 git 및 node… 담운 2019.06.08 1386
46 Nodejs로 구현한 서비스를 Caf… 담운 2019.06.08 1249
45 Git 활용 (기본적인 사용법) 담운 2019.06.08 1257
44 cafe24 nodejs git 저장… 담운 2019.06.08 1865
43 카페24 node.js 접속준비 담운 2019.06.08 1804
42 cafe24 node.js git 사… 담운 2019.06.08 3432
41 GitHub - 소스트리(Source… 담운 2019.06.07 1824
40 Sourcetree 설치 가이드 담운 2019.06.07 1102
39 [Git] 소스트리 (SourceTr… 담운 2019.06.07 1394
38 GitLab 업무환경 구성 가이드 담운 2019.06.07 1338
37 Git :: 소스트리(SourceTr… 담운 2019.06.07 1260
36 cafe24 에서 nodejs hos… 담운 2019.06.06 1757
35 카페24 node.js 접속준비 담운 2019.06.06 2711
34 카페24에서 Node.js 서버로 A… 담운 2019.06.06 1465
33 ssh 키 인증 방식으로 로그인하기 담운 2019.06.06 1436