[Git] 5. 수정하고 저장소에 저장하기

Noah_·2021년 12월 8일
0

Git

목록 보기
5/5
post-thumbnail
post-custom-banner

수정하고 저장소에 저장하기

  • 워킹 디렉토리의 모든 파일은 크게 Tracked와 Untracked로 나뉜다.
  • Tracked 파일은 이미 스냅샷에 포함돼 있던 파일
    - Unmodified와 Modified, Staged 상태 중 하나이다.
  • 그 외에 나머지 파일들은 Untracked 파일이다.
    - 워킹 디렉토리에 있는 파일 중 스냅샷에도 Staging Area에도 포함되지 않은 파일이다.
  • 처음 저장소를 Clone 하면 모든 파일은 Tracked이면서 Unmodified 상태이다.
  • 실제로 커밋을 하기 위해서는 이 수정한 파일을 Staged 상태로 만들고, Staged 상태의 파일을 커밋한다.

파일의 상태 확인하기

파일의 상태를 확인하려면 보통 git status 명령을 사용한다.

	$ git status
	On branch master
	Your branch is up-to-date with 'origin/master'.
	nothing to commit, working directory clean

위의 내용은 파일을 하나도 수정하지 않았다는 것을 의미한다.

프로젝트에 README 파일을 만들어보자. 해당 파일은 새로 만든 파일이기 때문에 git status 명령어를 실행하면 'Untracked files'에 들어가 있다.

	$ echo 'My Project' > README
	$ git status
	On branch master
	Your branch is up-to-date with 'origin/master'.
	Untracked files:
  	(use "git add <file>..." to include in what will be committed)
		README
	nothing added to commit but untracked files present (use "git add" to track)

해당 파일은 Untracked 상태로, 파일이 Tracked 상태가 되기 전까지는 커밋되지 않는다.

파일을 새로 추적하기

git add 명령으로 파일을 새로 추적할 수 있다.

	$ git add README

후에, git status 명령을 사용하면, README 파일이 Tracked 상태이면서, 커밋에 추가될 Staged 상태라는 것을 확인할 수 있다.

	$ git status
	On branch master
	Your branch is up-to-date with 'origin/master'.
	Changes to be committed:
	(use "git reset HEAD <file>..." to unstage)
		new file:   README

'Changes to be committed'에 들어 있는 파일은 Staged 상태라는 것을 의미한다.
커밋하면, 'git add'를 실행한 시점의 파일이 커밋되어 저장소 히스토리에 남는다.

추가로, git add (files) 명령은 파일 또는 디렉토리의 경로를 아규먼트로 받는다. 디렉토리면 아래에 있는 모든 파일들까지 재귀적으로 추가한다.

Modified 상태의 파일을 Stage하기

CONTRIBUTING.md라는 파일을 수정하고 나서 git status 명령을 다시 실행하면 아래와 같다.

	$ git status
	On branch master
	Your branch is up-to-date with 'origin/master'.
	Changes to be committed:
  	(use "git reset HEAD <file>..." to unstage)
	    new file:   README
	Changes not staged for commit:
  	(use "git add <file>..." to update what will be committed)
  	(use "git checkout -- <file>..." to discard changes in working directory)
	    modified:   CONTRIBUTING.md

'Changes not staged for commit'는 수정한 파일이 Tracked 상태이지만, 아직 Staged 상태는 아니라는 것을 의미한다.
따라서, git add 명령어를 통해, Staged 상태로 만들어줘야 한다.
add의 의미는 프로젝트에 파일을 추가한다기 보다는 다음 커밋에 추가한다고 받아들이는게 좋다.

파일 상태를 짤막하게 확인하기

git status 명령으로 확인하는 내용이 조금 길면, 간단하게 변경 내용을 보여주는 옵션이 있다. git status -s 또는 git status --short 옵션을 주면 된다.

	$ git status -s
	M README
	MM Rakefile
	A  lib/git.rb
	M  lib/simplegit.rb
	?? LICENSE.txt

아직 추적하지 않은 새 파일 앞에는 ??표시가 붙는다.
왼쪽은 Staging Area, 오른쪽은 Working Tree 상태를 표시한다.

파일 무시하기

어떤 파일은 Git이 관리할 필요가 없다. 보통 로그 파일이나 빌드 시스템이 자동으로 생성한 파일이 그렇다. 그런 파일을 무시하려면, .gitignore 파일을 만들고 그 안에 무시할 파일 패턴을 적는다.

	$ cat .gitignore
    *.[oa]
    *.~

첫번째 라인은 .o 나, .a인 파일을 Git이 무시하라는 것이고,
두번째 라인은 ~로 끝나는 모든 파일을 무시하라는 것이다.
o나 a는 각각 빌드 시스템이 만들어내는 오브젝트와 아카이브 파일이고,
~로 끝나는 파일은 Emacs나 VI같은 텍스트 편집기가 임시로 만들어내는 파일이다. .gitignore 파일은 보통 처음에 만들어 두는 것이 편리하다.
그래야 실수로 불필요한 파일을 실수로 커밋하는 일을 방지할 수 있다.

.gitignore 파일에 입력하는 패턴은 아래 규칙을 따른다.

  • 아무 것도 없는 라인이나, '#'으로 시작하는 라인은 무시한다.
  • 표준 Glob 패턴을 사용한다. 이는 프로젝트 전체에 적용된다.
    - 애스터리스크(*)는 문자가 하나도 없거나 하나 이상을 의미
    • [abc] 는 중괄호 안에 있는 문자 중 하나를 의미한다.
    • 물음표(?) 는 문자 하나를 의미
    • [0-9] 처럼 중괄호 안의 캐릭터 사이에 하이픈(-)을 사용하면 그 캐릭터 사이에 있는 문자 하나를 말한다.
    • 애스터리스크 2개를 사용하여 디렉토리 안의 디렉토리까지 지정할 수 있다.
    • a/**/z 패턴은 a/z, a/b/z, a/b/c/z 디렉토리에 사용할 수 있다.
  • 슬래시(/)로 시작하면 하위 디렉토리에 적용되지 않는다.
  • 디렉토리는 슬래시(/)를 끝에 사용하는 것으로 표현한다.
  • 느낌표(!)로 시작하는 패턴의 파일은 무시하지 않는다.

Staged와 Unstaged 상태의 변경 내용을 보기

어떤 내용이 변경됐는지 살펴보려면 git diff 명령을 사용해야 한다.

	$ git diff
	diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
	index 8ebb991..643e24f 100644
	--- a/CONTRIBUTING.md
	+++ b/CONTRIBUTING.md
	@@ -65,7 +65,8 @@ branch directly, things can get messy.
 	Please include a nice description of your changes when you submit your PR;
 	if we have to read the whole diff to figure out why you're contributing
 	in the first place, you're less likely to get feedback and have your change
	-merged in.
	+merged in. Also, split your changes into comprehensive 	chunks if your patch is
	+longer than a dozen lines.
 	If you are starting to work on a particular area, feel free to submit a PR
 	that highlights your work in progress (and note in the PR title that it's

해당 명령은 워킹 디렉토리에 있는 것과 Staging Area에 있는 것을 비교한다. 만약 커밋하려고 Staging Area에 넣은 파일의 변경 부분을 보고 싶으면, git diff --staged 옵션을 사용한다.
해당 명령은 저장소에 커밋한 것과 Staging Area에 있는 것을 비교한다.

주의해야할 점
git diff 명령은 마지막으로 커밋한 후에 수정한 것들 전부를 보여주지는 않는다. git diff는 Unstaged 상태인 것들만 보여준다. 수정한 파일을 모두 Staging Area에 넣었다면 git diff 명령은 아무것도 출력하지 않는다.

변경사항 커밋하기

Unstaged 상태의 파일은 커밋되지 않는다는 것을 기억해야 한다.

	$ git commit

메세지를 인라인으로 첨부할 수도 있다.

	$ git commit -m "hi, my name is noah"

Staging Area 생략하기

git commit 명령을 실행할 때, -a 옵션을 추가하면, Git은 Tracked 상태의 파일을 자동으로 Staging Area에 넣는다. 그래서 git add 명령을 실행하는 수고를 덜 수 있다.

	$ git commit -a -m "added new brackmarks"

파일 삭제하기

Git에서 파일을 제거하려면 git rm 명령으로 Tracked 상태의 파일을 삭제한 후에(정확하게는 Staging Area에서 삭제하는 것) 커밋해야 한다. 해당 명령은 워킹 디렉토리에 있는 파일도 삭제하기 때문에 실제로 파일도 지워진다. Git 명령을 사용하지 않고 단순히 워킹 디렉토리에서 파일을 삭제하고 git status 명령으로 상태를 확인하면, Git은 현재 'Changes not staged for commit'(즉, Unstaged 상태)라고 표시해준다.

	$ git rm test1.txt

파일 이름 변경하기

Git은 다른 VCS 시스템과는 달리 파일 이름의 변경이나 파일의 이동을 명시적으로 관리하지 않는다. 다시 말해서 파일 이름이 변경됐다는 별도의 정보를 저장하지 않는다. Git은 똑똑해서 굳이 파일 이름이 변경되었다는 것을 추적하지 않아도 아는 방법이 있다.

	$ git mv file_from file_to

git mv 명령은 아래 명령어를 수행한 것과 완전 동일하다.

	$ mv README.md README
	$ git rm README.md
	$ git add README

참고자료

Git - 수정하고 저장소에 저장하기

profile
경제적 자유를 꿈꾸는 개발자
post-custom-banner

0개의 댓글