Git의 기초

git 기초

모르고 있었던 내용을 추가해서 정리한다.

1
2
3
4
5
6
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt

아직 추적하고 있지 않는 파일은 ?? 로 뜬다. README 파일은 아직 staged 상태가 안된 파일이여서 오른쪽에만 M이 붙는다. Rakefile 같은 경우는 수정 후 한번 add 했다가 다시 수정해서 왼쪽에 staged 된 변경사항이라는 정보와 오늘쪽에 staged 안된 변경 사항이라는 정보가 같이 적힌다(MM). staged 상태로 추가한 파일 중 새로 생성한 파일 앞에는 A 표시가 붙난다.

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

git diff 명령을 수행하면 수정했지만 아직 staged 상태가 아닌 파일을 비교해 볼 수 있다.

만약 커밋하려고 Staging Area에 넣은 파일의 변경 부분을 보고 싶으면 git diff --staged 옵션을 사용한다.

commit 하기

git commit -v 옵션을 추가하면 편집기에 diff 메세지도 추가된다. 기본적으로넌 git status 명령의 결과가 채워진다.

파일 삭제하기

git rm 명령으로 Tracked 상태의 파일을 삭제한 후 (Staging Area에서 삭제 하는 것) 커밋을 실시. 그냥 제거 하게 되면 Unstaged 상태로 파일이 지워 졌다고 표시함.
반면에, git rm 명령어를 사용하면 파일이 지워졌다는 메세지와 함께 staged 된다(파일도 함께 지워짐). 만약 변경하고 Staging Area 에 추가했다면 -f 옵션을 주어 강제로 삭제 해야 한다.

Staging Area에서만 제거하고 워킹 디렉토리에 있는 파일은 지우지 않고 남겨두고 싶다면 --cached 옵션을 사용한다.

git rm -- cached README

파일 이름 변경하기

이름을 바꿀 때에는 git mv명령을 사용한다.
git mv file_from file_to

이것은 다음 세가지에 명령을 단축한 명령어이다.

1
2
3
$ mv README.md README
$ git rm README.md
$ git add README

커밋 히스토리 조회하기

git log

옵션

-p, --patch : 각 커밋의 diff 결과를 보여준다. 다른 유용한 옵션으로는 -2가 있는데 최근 두 개의 결과만 보여주는 옵션이다.

--stat : 각 커밋의 통계 정보를 조회할 수 있다.

--pretty : 히스토리 내용을 보여주는 형식, online, short, full, fuller, format --prety=format: "%h -%an, %ar: %s" 와 같은 방법으로 사용함.

--oneline : --pretty=oneline --abbrev-commit 두 옵션을 함께 사용한 것과 같다.

--graph : 브랜치와 머지 히스토리를 보여주는 마스키 그래프를 출력한다.

조회 제한 조건

--since--until 같은 시간을 기준으로 조회하는 옵션도 있다.

--author 옵션이나 --grep 옵션도 있는데 각각 저자 , 커밋메세지 키워드 기준으로 검색할 수 있다. 두 가지 모두를 만족하는 커밋을 찾으려면 --all-match옵션도 반드시 함깨 사용해야 한다.

-S 코드에서 제거되거나 추가된 내용 중에 특정 텍스트가 포함되어 있는지를 검색한다.

되돌리기

git을 사용하면 우리가 저지른 실수는 대부분 복구할 수 있지만 되돌린 것은 복구할 수 없다.
만약 커밋 메세지를 되돌리고 싶다면 파일을 수정하고 staging area에 추가한 다음 --amend 명령어를 추가해서 수정하면된다.

1
$ git commit --amend

만약 파일 수정 내용 없이 해당 내용을 입력하면 마지막 커밋 메세지만 수정된다. 명령어를 입력하면 편집기가 열릴때 전에 커밋한 내용이 포함된체로 열린다.

1
2
3
$ git commit -m 'initail commit'
$ git add forgotten_file
$ git commit --amend

첫번째 커밋은 무시 된다.

파일 상태를 Unstage로 변경하기

실수로 git add . 같은 명령어를 수행했는데 내려야 한다면 어떻게 해야 할까?

git reset HEAD <file> 명령을 수행하면 된다. 만약 잘못 Staging area 에 올린 파일이 README.md 파일이였다면 git reset HEAD README.me 이렇게 입력하면 된다.

사실 git reset 명령어는 매우 위험하다. 특히 --hard 옵션과 같이 사용할때는 더더욱 그렇다. 하지만 위에서 처럼 옵션 없이 사용하면 워킹 디렉토리의 파일은 건드리지 않는다.

Modified 파일 되돌리기

Staging area 에 올리지는 않았는데, modifed 된 상태라면 어떻게 전 상태로 돌릴 수 있을까?

git checkout -- <file>을 입력하면 된다. 정상적으로 복원된다.

git checkout - [file]은 꽤 위험한 명령이다. 원래 파일을 덮어 쓰우기 때문에 수정한 내용이 모두 사라진다. 정말 수정한 내용이 필요 없을때만 사용해야 한다.

리모트 관련 명령어

git remote -v 리모트 저장소에 대한 정보를 표시해 줌.

git remote add <저장소 별칭> <url> 저장소 별칭으로 url에 해당하는 저장소를 remote 저장소로 추가한다.

git remote remove <저장소 별칭> remote 저장소를 제거한다.

git remote rename <이전> <이후> 이전 저장소에 해당하는 remote 저장소에 이름을 이후 저장소로 바꿈

git remote show <저장소 별칭> 저장소 별칭에 해당하는 다양한 정보를 출력해 준다.

tag

git tag tag 목록을 확인할 수 있다.

git tag -l 와일드 카드로 검색하려 한다면 필수적인 옵션으로 -l을 사용해야 한다.

git tag -a <tagname> annotated tag를 추가한다. 명령어를 입력하면 편집기가 생성되서 메세지를 적을 수 있다.

git show <tagname> tag에 대한 정보를 확인할 수 있다.

lightweight tag, annotated tag

git 에 태그에는 두 종류가 있다. lightweigth tag는 단순히 커밋에 포인터와 같고, annotated tag는 git 저장소에 지정된 메세지 서명정보 등이 포함된다. 일반적으로 annotated tag를 사용한다.

lightweight tag

git tag <버전> 옵션을 사용하지 않고 추가하면 lightweight tag 로 추가 할 수 있다.

나중에 테그하기

git tag -a <체크섬> 특정 체크섬으로 tag 를 생성할 수 있다.

테그 공유하기

git push 명령으로 remote 저장소에 tag 정보까지 올라가지는 않는다.

git push orgin <tagname>으로 remote 저장소에 올린다.

git push origin --tags 를 이용하여 저장소에 내에서 태그 내용 중에서 remote 저장소에 없는 태그를 저장소로 올린다.

lightweight tag 만 저장소로 올리는 방법은 없다. 무조건 annotated tag 와 같이 저장소로 올라간다. 다만 annotated tag 만 저장소로 올리고 싶다면 git push <remote> --folww-tags 를 사용하면 된다.

태그 삭제하기

git tag -d <tagname>을 통해서 특정 태그를 삭제할 수 있다. 이는 작업하고 있는 저장소에 tag 만 삭제하는 것이여서 remote 서버에 push 해야 한다.

두가지 방법 중 하나를 선택한다.

  1. git push <remote> :refs/tags/<tagname> 올리기 전에 tag를 null 로 설정해서 비워 주는것과 같다.
  2. git push origin --delete <tagname>

특정 버전으로 checkout

git checktou <tagname>으로 특정 tag로 checkout 할 수 있다. 이렇게 checktout 하면 detached HEAD 상태가 된다. 이상태에서 작업한 내용을 커밋해도 도달할수 없는 상태가 된다.

따라서 버그를 고친다 같은 작업을 수행할 때는 특정 브랜치를 만들어서 작업해야 한다. 이렇게 작업해도 tag 에서 작업한 내용과 커밋한 내용간의 차이가 존재함에 주의해야 한다.

alias 사용하기

git config --global alias.ci commit 이렇게 사용하면 commit 에 대한 별칭을 사요할 수 있다.

git ci 로 사용한다.

외부 명령어를 사용할 때는 !를 붙힌다.

git config --global alias.visual '!gitk'

git visual를 입력하면 gitk가 실행된다.