이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ

게시글

강좌4 - Git - 일 년 전 등록 / 5달 전 수정

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

조회수:
0
이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ
이 블로그는 광고 클릭 수익으로 운영됩니다!
괜찮으시다면 광고 차단을 풀어주세요 ㅠㅠ

안녕하세요. 이번 시간에는 두 번째 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>
 <b>깃</b> 파일을 수정했습니다.
</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를 클릭하면 보입니다.

undefined

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

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

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

투표로 게시글에 관해 피드백을 해주시면 많은 도움이 됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright © 2016- 무단 전재 및 재배포 금지

댓글

1개의 댓글이 있습니다.
5달 전
잘 배우고 있습니당 ㅎㅎ 그런데 중간에 :q가 아니라 :wq!가 수정 뒤 저장하고 나가기 아닌가요!?
5달 전
감사합니다. 그냥 :wq도 됩니다. w는 write q는 quit !는 강제를 의미하거든요.
5달 전
아하 감사하무니다