-
Git 명령어 정리 - 파일관리 편서비스 공부/Git 2022. 10. 14. 22:58
이 포스트와 사용된 사진은 아래의 책 내용을 기반으로 작성하였습니다.
또한 크리에이티브커먼즈에 의거 CC-BY-NC-SA를 따릅니다.
이 포스트에서는 아래의 명령어들을 다룹니다.
- config
- init
- clone
- add
- reset
- commit
- checkout
- rm
- vm
- status
- diff
- log
- (.gitignore 파일 다루기)
- 초기 설정
$ git config --global user.name "wjlee611" $ git config --global user.email "wjlee611@gmail.com"
--local: 이 리파지토리에서만 적용될 설정을 한다.
--global: 이 시스템에서 현재 사용자에게만 적용될 설정을 한다.
--system: 이 시스템 전제에서 적용될 설정을 한다.
- git 저장소 초기화
$ git init
해당 명령어로 로컬 저장소에 git 저장소를 만들 수 있다.
$ git clone https://github.com/libgit2/libgit2
해당 명령어로 원격 저장소에 있는 git 저장소를 로컬에 복사할 수 있다.
- 파일 상태 변경
$ git add . | <파일 이름>
위 명령어를 통해서 모든 파일을 추적, 스테이징 에어리어에 올릴 수 있다.
. 대신 <파일 이름>을 집어넣으면 특정 파일만 추적, 스테이징 에어리어에 올릴 수 있다.
(위 그림에서 Add the file, Stage the file 에 해당)
$ git reset . | <파일 이름>
위 명령어를 통해서 모든 파일을 스테이징 에어리어에서 내릴 수 있다.
. 대신 <파일 이름>을 집어넣으면 특정 파일만 스테이징 에어리어에서 내릴 수 있다.
(위 그림에서 Stage the file의 역에 해당)
git commit -m <message>
위 명령어를 통해서 스테이징 에어리어에 있는 모든 파일을 커밋할 수 있다.
커밋 시 커밋의 이름은 <message>가 된다.
(위 그림에서 Commit에 해당)
-m 대신 -am 키워드를 사용하면 앞서 사용했던 git add . 명령어를 생략할 수 있게 된다.
즉, add와 동시에 지정한 message로 커밋이 가능하다.
단, 한 번이라도 add된 파일, 즉 추적하고 있는 파일에 한하여 가능하다.
$ git commit -m 'initial commit' $ git add forgotten_file $ git commit --amend
-amend 키워드를 사용시 바로 이전의 커밋을 덮어씌울 수 있다.
즉, 오타나 사소한 수정사항이 있을 경우 사소한 커밋을 만들지 않고도 이전 커밋에 추가할 수 있다.
$ git checkout -- <파일 이름>
위 명령어를 통해서 <파일 이름>에 해당하는 파일의 수정사항 (변경 내역)을 삭제한다.
즉, 변경 전 상태로 원상 복구된다.
(위 그림에서 Edit the file의 역에 해당)
특정 파일 뿐 만 아니라 버전도 되돌릴 수 있다.
$ git checkout <checksum>
위 명령어를 통해서 해당 체크섬에 해당하는 커밋의 버전으로 되돌릴 수 있다.
물론, 기존의 내역들이 삭제되는 것이 아니라, 해당 버전으로 이동하는 것 뿐이다. (마치 브랜치 이동하는 것 처럼)
<checksum> 대신 <이름>을 사용하면 해당 이름과 매치되는 브랜치의 Head가 가리키는 버전으로 되돌릴 수 있다.
<태그>사용시 해당 태그가 가리키는 버전으로 되돌릴 수 있다.
-b <new_branch> <tag>사용시 현재 작업을 new_branch 이름의 브랜치로 만든 후 tag가 가리키는 버전으로 되돌릴 수 있다.
$ git rm --cached <파일 이름>
위 명령어를 통해서 <파일 이름>에 해당하는 파일을 더이상 git에서 추적하지 않게 할 수 있다.
(위 그림에서 Remove the file에 해당)
--cached 키워드를 빼면 git에서 더이상 추적하지 않을 뿐 만 아니라 파일 자체를 지울 수 있다.
주의 사항은 <파일 이름> 작성시 와일드 카드 문자 *를 사용할 수 있는데, 이 경우에 * 앞에 반드시 이스케이프 문자 \ 를 붙여주자.
왜냐하면, git과 shell에서 모두 이 문자를 인식하기 때문에 원치않는 상황이 발생할 수 있기 때문이다.
마지막으로 이런 명령어도 쓸만하다.
$ git mv <name1> <name2>
위 명령어를 통해서 name1 이름의 파일을 추적을 그만 두고, 이름을 name2로 바꾼 뒤 name2를 추적하는 명령어이다.
(mv 키워드는 rm, add 키워드 조합을 한 줄로 처리해준다)
간단하게 말하면 name1 -> name2로 이름을 변경하는 것이다.
- 파일 상태 확인
$ 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 modified: CONTRIBUTING.md 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
위 명령어를 통해 현재 파일들의 상태를 확인할 수 있다.
위의 경우에는 README 라는 새로운 파일을 추가했고, CONTRIBUTING.md 라는 파일을 수정한 후
두 파일을 스테이징 한 상태에서,
CONTRIBUTING.md 라는 파일을 또 수정한 경우이다.
$ git status -s M README MM Rakefile A lib/git.rb M lib/simplegit.rb ?? LICENSE.txt
-s 키워드를 붙이면 현재 파일들의 상태를 간략하게 확인할 수 있다.
추적하지 않은 파일은 ?, 수정된 파일은 M, 새로 추가된 파일은 A로 표시하고,
앞은 스테이징 에어리어의 상태, 뒤는 작업폴더의 상태이다.
위의 경우에는 README의 경우에는 수정은 했으나 스테이징 하지 않은 상태,
Rakefile은 수정 후 스테이징 했으나, 한 번 더 수정한 상태,
lib 폴더 안의 git.rb는 새로 추가된 파일을 추적, 스테이징 한 상태,
lib 폴더 안의 simplegit.rb는 수정 후 스테이징 한 상태,
LICENSE.txt는 추적하지 않은 상태이다.
$ git diff
위 명령어를 통해 바로 이전에 커밋된 파일과 수정된 파일 사이의 변경사항을 확인할 수 있다.
@@ -65,7 +65,8 @@ 와 같은 숫자도 볼 수 있는데, 이 것이 의미하는 바는 다음과 같다.
65번 째 줄 부터 7줄이 제거되었고, 65번 째 줄부터 8줄이 추가되었다.
--staged 키워드 (또는 --cached) 를 사용하면 바로 이전에 커밋된 파일과
스테이징 에어리어에 올라간 파일의 변경사항을 확인할 수 있다.
- 파일 무시하기
중요한 파일(데이터베이스의 접근 비밀번호, 토큰 생성의 시드 등) 이나,
컴파일, 시스템에 의해 생성되는 찌거기 파일, 로그 파일, node_modules같은 크기가 매우 큰 파일 등
git에서 굳이 추적이 필요하지 않거나 해서는 안되는 파일을 제외할 수 있다.
추적을 안 하면 상관 없지만, git add . 을 자주 쓴다면 번거로운 일이 벌어질 것이다.
따라서 .gitignore 파일에 추적하지 않을 파일을 추가한다면, git add . 을 해도, .gitignore에 추가된 파일은 추적되지 않는다.
.gitignore 파일에 입력하는 패턴은 아래의 규칙을 따른다.
- 아무것도 없는 라인이나, `#`로 시작하는 라인은 무시한다.
- 표준 Glob 패턴을 사용한다. 이는 프로젝트 전체에 적용된다.
- 슬래시(/)로 시작하면 하위 디렉토리에 적용되지(Recursivity) 않는다.
- 디렉토리는 슬래시(/)를 끝에 사용하는 것으로 표현한다.
- 느낌표(!)로 시작하는 패턴의 파일은 무시하지 않는다.
이는 .gitignore 파일에 입력된 예시이다.
# 확장자가 .a인 파일 무시 *.a # 윗 라인에서 확장자가 .a인 파일은 무시하게 했지만 lib.a는 무시하지 않음 !lib.a # 현재 디렉토리에 있는 TODO파일은 무시하고 subdir/TODO처럼 하위디렉토리에 있는 파일은 무시하지 않음 /TODO # build/ 디렉토리에 있는 모든 파일은 무시 build/ # doc/notes.txt 파일은 무시하고 doc/server/arch.txt 파일은 무시하지 않음 doc/*.txt # doc 디렉토리 아래의 모든 .pdf 파일을 무시 doc/**/*.pdf
- 커밋 히스토리 조회
$ git log
위 명령어를 통해 가장 최신의 커밋부터 커밋 기록을 보여준다.
여러가지 키워드 조합을 통해 표시 방법, 범위를 제한할 수 있다.
- 표시 방법 옵션
옵션 설명 -p 각 커밋에 적용된 패치를 보여준다. --stat 각 커밋에서 수정된 파일의 통계정보를 보여준다. --shortstat --stat 명령의 결과 중, 수정한 파일, 추가/삭제된 라인만 보여준다. --name-only 커밋 정보 중에서 수정된 파일의 목록만 보여준다. --name-status 수정된 파일의 목록 및 해당 파일이 추가/수정/삭제된 것인지에 대한 정보도 보여준다. --oneline --pretty=oneline + 체크섬 처음 몇 자를 보여준다. --relative-date 정확한 날짜가 아닌 "2 weeks ago"와 같은 상대적인 형식으로 보여준다. --graph 브랜치와 머지 히스토리 정보까지 아스키 그래프로 보여준다. --pretty 지정한 형식으로 보여준다. --pretty 옵션은 oneline, short, full, fuller, format 옵션이 있는데, 보통 oneline, format을 많이 쓴다.
oneline은 각 커밋을 한 라인으로 보여주는데 전체 체크섬, 요약 정보를 보여준다.
(short, full, fuller은 oneline과 비슷하지만 여기서 좀 더 가감된 모습이다)
format은 지정한 포맷으로 커밋을 표시한다.
$ git log --pretty=format:"%h - %an, %ar : %s" ca82a6d - Scott Chacon, 6 years ago : changed the version number 085bb3b - Scott Chacon, 6 years ago : removed unnecessary test a11bef0 - Scott Chacon, 6 years ago : first commit
--pretty=format:""에 들어갈 포매터는 다음과 같다.
포매터 설명 %H, %h 커밋 해시, 짧은 커밋 해시 %T, %t 트리 해시, 짧은 트리 해시 %P, %p 부모 해시, 짧은 부모 해시 %an, %cn 저자 이름, 커미터 이름 %ae, %ce 저자 이메일, 커미터 이메일 %ad, %cd 저자 커밋 시각, 커미터 커밋 시각 %ar, %cr 저자 커밋 상대적 시각, 커미터 커밋 상대적 시각 %s 요약 (커밋 메세지) - 범위 제한 옵션
옵션 설명 -n 최근 n개의 커밋만 조회한다. --since, --after 명시한 날짜 이후의 커밋만 조회한다. --until, --before 명시한 날짜 이전의 커밋만 조회한다. --author 입력한 저자의 커밋만 보여준다. --committer 입력한 커미터의 커밋만 보여준다. --grep 커밋 메세지 안의 텍스트를 검색한다. -S 커밋시 추가/수정/삭제된 내용 안의 텍스트를 검색한다. 전체 예시이다.
$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \ --before="2008-11-01" --no-merges -- t/ 5610e3b - Fix testcase failure when extended attributes are in use acd3b9e - Enhance hold_lock_file_for_{update,append}() API f563754 - demonstrate breakage of detached checkout with symbolic link HEAD d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths 51a94af - Fix "checkout --track -b newbranch" on detached HEAD b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch
위 경우에는 "%h - %s" 형식으로
gitster가 작성한 파일 중
2008-10-01 ~ 2008-11-01 기간의 커밋을 보여준다.
단, 마지하는 커밋은 보여주지 않는다.
'서비스 공부 > Git' 카테고리의 다른 글
분산 환경 워크플로 (0) 2022.12.06 Git 명령어 정리 - 리모트 브랜치 편 (0) 2022.12.06 Git 명령어 정리 - 로컬 브랜치 편 (2) 2022.12.05 Git 명령어 정리 - 협업 기초 편 (0) 2022.10.23 Git 특징 (2) 2022.10.13