[GIT] 수정하고 저장소에 저장하기

  1. 파일 상태 확인
      • 파일은 Tracked(관리 중)와 Untracked(관리되지 않음)으로 나뉩니다. 파일의 상태를 확인하는 데에는 `git status` 명령어를 사용합니다. 초기에 저장소를 Clone 한 직후, 아무런 수정이 없는 상태에서 `git status` 명령어를 실행하면 아래와 같은 메시지를 확인할 수 있습니다.
        $ git status
        On branch master
        nothing to commit, working tree clean
        // 위의 내용은 어떤 파일도 수정되지 않았음을 나타냅니다. 
        // 현재 브랜치가 'master'이며, 서버의 'master' 브랜치와 동기화되어 있음을 알려주며, 
        // 수정된 파일이 없는 상태를 나타냅니다.
  2. 새로운 파일을 만들어보기
    • 프로젝트에 새로운 파일인 README를 만들어보겠습니다. 아래 명령어를 실행하면 README 파일이 생성되며, 그 후 `git status` 명령어를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
      $ 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 files' 부분에 README 파일이 포함되어 있습니다. 
      // 이는 README 파일이 아직 Git에서 추적되지 않은(Untracked) 상태임을 의미합니다. 
      // 아직 이 파일이 스냅샷에 포함되지 않았기 때문에 커밋되지 않습니다.
  3. 파일을 새로 추적하기
    • `git add` 명령어를 사용하여 README 파일을 추적할 수 있습니다.
      $ 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' 부분에 README 파일이 Staged 상태로 되어 있습니다. 이제 이 파일을 커밋하면 해당 커밋에서의 상태가 저장소 히스토리에 기록됩니다.
  4. Modified 상태의 파일을 Stage 하기
    • 이미 Tracked 상태인 파일을 수정하고 Staged 상태로 변경하는 방법에 대해 알아봅시다. 이미 커밋한 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
      `CONTRIBUTING.md` 파일은 "Changes not staged for commit"에 있습니다. 이것은 파일이 Tracked 상태이지만 아직 Staged 상태가 아니라는 것입니다. 파일을 Staged 상태로 만들기 위해서는 `git add` 명령어를 실행해야 합니다.
    • $ git add 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
          modified:   CONTRIBUTING.md
      이제 `CONTRIBUTING.md` 파일이 Staged 상태에 있어 다음 커밋에 포함될 것입니다. 하지만, 파일을 계속 수정해야 하는 상황이라면, 추가 수정 후에는 다시 `git add` 명령어를 실행하여 최신 버전을 Staged 상태로 만들어야 합니다.
  5. 파일 상태를 짤막하게 확인하기
    • `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에서의 상태를 나타냅니다.
      - `??`: 아직 추적하지 않는(Untracked) 새 파일을 나타냅니다.
      - `A`: Staged 상태로 추가된(Newly Added) 파일을 나타냅니다.
      - `M`: 수정(Modified)된 파일을 나타냅니다.
    • 위의 예시에서 `README` 파일은 내용을 변경했지만 아직 Staged 상태로 추가되지 않았으므로 `M`이 표시되어 있습니다. `lib/simplegit.rb` 파일은 내용을 변경하고 Staged 상태로 추가한 상태이므로 왼쪽 M이 표시되었습니다. `Rakefile` 파일은 변경 후 Staged 상태로 추가하고 또 다시 내용을 변경하여 Staged와 Unstaged 상태가 함께 표시되어 있습니다.
  6. 파일 무시하기
    • Git에서 관리할 필요가 없는 파일은 .gitignore 파일을 생성하여 무시할 수 있습니다. 보통 로그 파일이나 빌드 시스템이 자동으로 생성한 파일 등이 해당됩니다. 아래는 .gitignore 파일의 예시입니다.
    • $ cat .gitignore
      *.[oa]
      *~
    • 첫 번째 라인은 확장자가 ".o" 나 ".a" 인 파일을 Git이 무시하도록 지시합니다.
      두 번째 라인은 "~" 로 끝나는 모든 파일을 Git이 무시하도록 지시합니다.
    • 보통 텍스트 편집기의 임시 파일이나 빌드 과정에서 생성되는 파일들이 여기에 해당합니다. 추가로, .gitignore 파일에는 다양한 규칙이 적용됩니다.
      • 아무것도 없는 라인이나, # 로 시작하는 라인은 무시합니다.
      • 표준 Glob 패턴을 사용하며, 이는 프로젝트 전체에 적용됩니다.
      • 슬래시(/)로 시작하면 하위 디렉토리에 적용되지 않습니다.
      • 디렉토리는 슬래시(/)를 끝에 사용하여 표현합니다.
      • 느낌표(!)로 시작하는 패턴의 파일은 무시하지 않습니다.
    • # 확장자가 .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
  7. Staged와 Unstaged 상태의 변경 내용 보기
    • 파일의 수정 내용을 자세히 살펴보려면 `git diff` 명령을 사용합니다. 이 명령은 워킹 디렉토리에 있는 것과 Staging Area에 있는 것을 비교하여 변경 내용을 보여줍니다.
    • $ git diff
    • 이 명령은 워킹 디렉토리의 수정 내용을 보여줍니다.
    • $ git diff --staged
      # 또는
      $ git diff --cached
    • 이 명령은 Staging Area에 있는 파일의 수정 내용을 보여줍니다.
  8. 변경사항 커밋하기
    • 수정한 파일들을 Staging Area에 추가합니다. 이를 위해 `git add` 명령을 사용합니다.
    • $ git add <파일1> <파일2> ...
      #  또는 모든 수정 파일을 한 번에 추가하려면
      $ git add .
    • Staging Area에 파일을 추가하면 해당 파일이 커밋에 포함될 준비가 된 상태입니다.
    • # Staging Area에 파일을 추가한 후, `git commit` 명령을 사용하여 커밋을 수행합니다.
      $ git commit
    • 실행하면 커밋 메시지를 작성하는 편집기가 열립니다. 첫 번째 라인은 비어 있어서는 안되며, 나머지 라인은 변경된 파일 및 수정 내용이 표시됩니다.
    • 메시지를 작성하고 저장한 후에 편집기를 종료하면 커밋이 완료됩니다.
    • 또는 `-m` 옵션을 사용하여 커밋 메시지를 직접 명령어로 전달할 수 있습니다.
    • $ git commit -m "커밋 메시지"
    • `git commit` 명령을 실행하면 Staging Area에 있는 파일들이 현재 브랜치에 새로운 커밋으로 저장됩니다.
    • 커밋이 완료되면 해당 커밋의 체크섬과 변경된 파일의 통계가 표시됩니다.
    • 커밋을 확인하려면 `git log` 명령을 사용합니다.
    • $ git log
      # 저장소의 커밋 기록을 출력합니다.
  9. Staging Area 생략하기
    • Git에서 Staging Area를 건너뛰고 쉽게 커밋하는 방법은 `git commit` 명령에 `-a` 옵션을 추가하는 것입니다. 이 옵션을 사용하면 수정된 모든 Tracked 파일이 자동으로 Staging Area에 추가되어 커밋됩니다.
    • $ git commit -a -m '커밋 메시지'
    • `-a` 옵션을 사용하면 `git add` 명령을 사용하지 않고도 모든 수정된 파일이 자동으로 Staging Area에 추가됩니다.
    • 새롭게 생성된 파일들은 add를 해줘야됩니다.
    • `-a` 옵션을 사용할 때는 변경된 파일 중에서 무엇이 Staging Area에 추가되고 커밋되는지 주의 깊게 확인해야 합니다.
  10. 파일 삭제하기
    • Git에서 파일을 삭제하려면 `git rm` 명령을 사용합니다. 이 명령은 워킹 디렉토리에 있는 파일을 삭제하고 동시에 Staging Area에 이 변경 사항을 추가합니다. 삭제한 파일은 커밋을 통해 저장소에서도 삭제됩니다.
    • $ git rm PROJECTS.md
    • 위 명령은 `PROJECTS.md` 파일을 삭제하고 해당 변경 사항을 Staging Area에 추가합니다. 이후 커밋을 통해 파일이 영구적으로 삭제됩니다.
    • $ git rm --cached README
    • 위 명령은 `README` 파일을 Staging Area에서만 제거하고 워킹 디렉토리에는 그대로 남겨둡니다. 이는 Git이 해당 파일을 더 이상 추적하지 않도록 만들지만, 실제로 파일은 삭제하지 않습니다.
    • Glob 패턴을 사용하여 삭제할 수 있습니다.
  11. 파일 이름 변경하기
    • 파일 이름이 변경되었다는 별도의 정보를 저장하지 않습니다. 그러나 Git은 파일의 이름이 변경된 것을 스스로 추적할 수 있습니다. 파일 이름이 변경되면 Git은 파일 삭제와 추가를 함께 처리하여 이름이 변경된 것처럼 인식합니다.
    • $ git mv file_from file_to
    • `git mv` 명령은 실제로는 단축 명령으로, `mv` 명령을 통해 파일 이름을 변경한 후 `git rm`과 `git add`를 수행하는 작업을 한 번에 처리합니다.

'GIT > GIT의 기초' 카테고리의 다른 글

[GIT] 태그  (1) 2024.02.08
[GIT] 리모트 저장소  (1) 2024.02.07
[GIT] 되돌리기  (1) 2024.02.07
[GIT] 커밋 히스토리 조회하기  (0) 2024.02.07
[GIT] GIT 저장소 만들기  (0) 2024.02.05