Git 커밋
git commit
명령은 프로젝트의 현재 스테이징된 변경 사항의 스냅샷을 캡처합니다. 커밋된 스냅샷은 프로젝트의 “안전한” 버전이라고 생각할 수 있습니다. 사용자가 명시적으로 요청하지 않는 한 Git은 절대 변경하지 않습니다. git commit
을 실행하기 전에 git add 명령을 사용하여 커밋에 저장될 프로젝트의 변경 사항을 승격하거나 '스테이징'합니다. git commit
및 git add
는 가장 자주 사용되는 두 가지 명령입니다.
Git commit 및 SVN commit 비교
이름은 같지만 git commit
은 svn commit
과는 전혀 다릅니다. 이러한 비슷한 용어는 svn 배경을 가진 Git을 처음 사용하는 개발자에게 혼동을 줄 수 있으므로 차이점을 강조하는 것이 중요합니다. git commit
과 svn commit
을 비교하는 것은 중앙 집중식 애플리케이션 모델(svn)과 분산 애플리케이션 모델(Git)을 비교하는 것과 같습니다. SVN에서 커밋은 로컬 SVN 클라이언트에서 원격 중앙 집중식 공유 SVN 리포지토리로 변경 사항을 푸시합니다. Git에서는 리포지토리가 분산되고 스냅샷은 로컬 리포지토리에 커밋되므로 다른 Git 리포지토리와의 상호 작용이 전혀 필요하지 않습니다. 나중에 Git 커밋을 임의의 원격 리포지토리로 푸시할 수 있습니다.
작동 방식
전반적으로 Git은 타임라인 관리 유틸리티로 생각할 수 있습니다. 커밋은 Git 프로젝트 타임라인의 핵심 빌딩 블록입니다. 커밋은 Git 프로젝트 타임라인의 스냅샷 또는 마일스톤으로 생각할 수 있습니다. 커밋은 git commit
명령으로 만들어지며 해당 시점의 프로젝트 상태를 캡처합니다. Git 스냅샷은 항상 로컬 리포지토리에 커밋됩니다. 작업 복사본이 중앙 리포지토리에 커밋되는 SVN과는 근본적으로 다릅니다. 반대로 Git은 준비되기 전까지는 중앙 리포지토리와 상호 작용하도록 강제하지 않습니다. 스테이징 영역이 작업 디렉터리와 프로젝트 기록 사이의 버퍼인 것처럼, 각 개발자의 로컬 리포지토리는 기여와 중앙 리포지토리 사이의 버퍼입니다.
이는 Git 사용자의 기본 개발 모델을 변경합니다. Git 개발자는 변경 사항을 적용하고 중앙 리포지토리에 직접 커밋하는 대신 로컬 리포지토리에 커밋을 축적할 수 있습니다. Git은 SVN 방식의 공동 작업에 비해 장점이 아주 많습니다. 기능을 원자성 커밋으로 분할하고, 관련 커밋을 함께 그룹화하며, 중앙 리포지토리에 게시하기 전에 로컬 기록을 정리하는 것이 더 쉽기 때문입니다. 또한 개발자는 분리된 환경에서 작업하여 다른 개발자들과 병합하기 편리한 시점에 도달할 때까지 통합을 연기할 수 있습니다. 분리된 작업과 통합 연기는 개별적으로는 유용하지만, 팀 입장에서는 소규모 단위로 자주 통합하는 것이 가장 좋습니다. Git 팀 공동 작업의 모범 사례에 관한 자세한 내용은 팀이 Git 워크플로를 구성하는 방법을 읽어보세요.
관련 자료
Git 브랜치
솔루션 보기
Bitbucket Cloud에서 Git에 대해 알아보기
차이점이 아닌 스냅샷
SVN과 Git은 실질적인 차이점 외에도 기본 구현도 완전히 다른 설계 철학을 따릅니다. SVN은 파일의 차이점을 추적하는 반면, Git의 버전 제어 모델은 스냅샷을 기반으로 합니다. 예를 들어, SVN 커밋은 리포지토리에 추가된 원본 파일과 비교한 diff로 구성됩니다. 반면 Git은 매 커밋마다 각 파일의 전체 내용을 기록합니다.
따라서 파일의 특정 버전을 diffs에서 “어셈블”할 필요가 없기 때문에 많은 Git 작업은 SVN보다 훨씬 빠르게 수행됩니다. 즉, Git은 내부 데이터베이스에서 각 파일의 전체 수정본을 즉시 사용할 수 있습니다.
Git의 스냅샷 모델은 브랜칭 및 병합 도구에서 공동 작업 워크플로에 이르기까지 버전 제어 모델의 거의 모든 측면에 광범위한 영향을 미칩니다.
일반적인 옵션
git commit
스테이지 스냅샷을 커밋합니다. 커밋 메시지에 대한 메시지를 표시하도록 텍스트 에디터를 시작합니다. 메시지를 입력한 다음 파일을 저장하고 에디터를 종료하여 실제 커밋을 생성합니다.
git commit -a
작업 디렉터리에서 모든 변경 사항의 스냅샷을 커밋합니다. 여기에는 추적 파일(기록의 어느 시점에서 git add
로 추가된 파일)에 대한 수정만 포함됩니다.
git commit -m "commit message"
전달된 커밋 메시지로 즉시 커밋을 만드는 바로 가기 명령입니다. 기본적으로 git commit
은 로컬로 구성된 텍스트 편집기를 열고 커밋 메시지를 입력하라는 메시지를 표시합니다. -m
옵션을 전달하면 텍스트 편집기 프롬프트가 취소되고 인라인 메시지가 표시됩니다.
git commit -am "commit message"
-a
와 -m
옵션을 결합한 강력한 사용자 바로 가기 명령입니다. 이 조합은 모든 스테이징된 변경 사항의 커밋을 즉시 만들고 인라인 커밋 메시지를 가져옵니다.
git commit --amend
이 옵션은 커밋 명령에 또 다른 수준의 기능을 추가합니다. 이 옵션을 전달하면 마지막 커밋이 수정됩니다. 새 커밋을 만드는 대신 스테이징된 변경 사항이 이전 커밋에 추가됩니다. 이 명령은 시스템의 구성된 텍스트 편집기를 열고 이전에 지정한 커밋 메시지를 변경하라는 메시지를 표시합니다.
예제
커밋으로 변경 사항 저장
다음 예시에서는 현재 브랜치에서 hello.py
라는 파일의 일부 콘텐츠를 편집했고 프로젝트 기록에 커밋할 준비가 되었다고 가정하겠습니다. 먼저 git add
로 파일을 스테이징해야 합니다. 그러면 스테이징된 스냅샷을 커밋할 수 있습니다.
git add hello.py
이 명령은 Git 스테이징 영역에 hello.py
를 추가합니다. git status
명령을 사용하여 이 작업의 결과를 검사할 수 있습니다.
git status
On branch main
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: hello.py
녹색으로 출력된 new file: hello.py
는 다음 커밋과 함께 hello.py
가 저장됨을 나타냅니다. 다음을 수행하면 커밋에서 만들어집니다.
git commit
그러면 커밋 대상 목록과 함께 커밋 로그 메시지를 요청하는 텍스트 편집기(git config
를 통해 사용자 지정 가능)가 열립니다.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch main
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
#modified: hello.py
Git은 커밋 메시지가 특정한 형식의 제약 조건을 따르도록 요구하지는 않지만 기본 형식은 전체 커밋을 첫 줄에 50자 미만으로 요약하고 빈 줄을 남겨둔 다음 변경 사항을 자세히 설명하는 것입니다. 예를 들면 다음과 같습니다.
Change the message displayed by hello.py
- Update the sayHello() function to output the user's name
- Change the sayGoodbye() function to a friendlier message
커밋 메시지의 첫 줄을 이메일처럼 제목으로 사용하는 것이 일반적입니다. 나머지 로그 메시지는 본문으로 간주하여 커밋 변경 집합의 세부 정보를 전달하는 데 사용됩니다. 참고로 설명하자면 많은 개발자가 커밋 메시지에 현재 시제를 사용하는 것을 좋아합니다. 그러면 리포지토리의 작업처럼 읽을 수 있으므로 기록 다시 쓰기 작업의 많은 부분을 직관적으로 볼 수 있습니다.
커밋 업데이트(수정) 방법
위의 hello.py
예시를 사용하여 계속해 보겠습니다. hello.py
에 추가로 업데이트하고 다음을 실행합니다.
git add hello.py
git commit --amend
그러면 구성된 텍스트 편집기가 다시 열립니다. 하지만 이번에는 이전에 입력한 커밋 메시지가 미리 채워집니다. 이는 새 커밋을 만드는 것이 아니라 마지막 커밋을 편집한다는 것을 나타냅니다.
요약
git commit
명령은 Git의 핵심 주요 기능 중 하나입니다. 다음 커밋에서 스테이징될 변경 사항을 선택하려면 git add
명령을 미리 사용해야 합니다. 그런 다음 git commit
을 사용하여 Git 프로젝트 기록의 타임라인에 따라 스테이징된 변경 사항의 스냅샷을 만듭니다. 해당 페이지에서 git add 사용법에 대해 자세히 알아보세요. git status 명령을 사용하면 스테이징 영역과 보류 중인 커밋의 상태를 살펴볼 수 있습니다.
SVN과 Git의 커밋 모델은 상당히 다르지만 공통된 용어 때문에 혼동되는 경우가 많습니다. 개인적으로 SVN을 사용한 적이 있는 상태에서 Git을 사용한다면 Git에서는 커밋이 저렴하고 자주 쓰는 게 좋다는 사실을 알게 될 것입니다. SVN 커밋은 원격 요청이 필요하며 비용이 많이 드는 작업이지만 Git 커밋은 로컬에서 보다 효율적인 알고리즘으로 수행됩니다.
이 문서 공유
다음 토픽
여러분께 도움을 드릴 자료를 추천합니다.
이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.