# Git 시작

예제 시나리오를 통해 Git의 기본 사항을 배워보세요.

코드에 타임머신이 있으면 좋겠다고 생각해 본 적이 있으신가요? 그렇다면 Git을 활용해 보세요. 기대 이상의 기능을 선보입니다!

Git에 익숙하지 않다면, Git은 코드 변경 내용을 추적하는 데 도움이 되는 **버전 제어** 시스템이라는 것을 알아두세요. 특정 시점에 프로젝트의 스냅샷을 저장한 후에는 언제든지 스냅샷으로 돌아갈 수 있으므로 작업을 위험에 빠뜨리지 않고도 실험적으로 변경할 수 있습니다.

GitHub 자체는 Git을 기반으로 구축된 플랫폼으로, 이를 통해 Git 프로젝트를 클라우드에 저장하고 다른 개발자와 함께 작업할 수 있습니다.

Git은 복잡해 보일 수도 있지만 모든 개발자에게 강력하고 필요한 도구입니다. 이 문서에서는 일상적인 워크플로에서 Git을 사용하는 데 필요한 모든 도구를 알려줍니다.

## 필수 조건

이 자습서를 수행하려면 [Visual Studio Code를 설치](https://code.visualstudio.com/download)해야 합니다.

## GitHub Desktop을 사용하여 Git 기본 사항 학습하기

표준 Git 작업의 경우, 작성된 명령 대신 시각적으로 Git과 상호 작용할 수 있는 앱인 GitHub Desktop을 사용하는 것이 좋습니다. 이 섹션에서는 GitHub Desktop을 사용하여 가장 일반적인 Git 작업을 신속하게 수행하는 방법을 알아봅니다.

### GitHub Desktop 설정하기

GitHub Desktop을 처음으로 사용하는 경우, 앱을 먼저 설치하고, GitHub 계정을 연결해야 합니다.

1. ```
          [GitHub Desktop을 다운로드](https://desktop.github.com/download/)합니다.
   ```
2. GitHub Desktop을 연 다음, **Sign in to GitHub.com** 을 클릭하고 GitHub Desktop이 사용자의 계정에 액세스할 수 있도록 권한을 부여합니다.
3. GitHub Desktop으로 돌아가서 **Finish**를 클릭합니다. 그러면 GitHub 계정의 이름과 메일이 Git에 추가됩니다.

### 로컬 리포지토리 만들기

이제 **리포지토리**를 만들어 Git에 첫 번째 단계를 수행할 수 있습니다. 리포지토리를 변경 내용을 추적하고 기록을 저장하는 프로젝트 폴더로 간주합니다. 먼저 **로컬** 리포지토리를 만듭니다.

1. GitHub Desktop에서 **Create a New Repository on your Local Drive**를 클릭합니다.
2. 리포지토리 이름을 `learning-git`으로 지정합니다.
3. ```
          **Initialize this repository with a README**를 선택하여 빈 `README.md` 파일을 자동으로 만듭니다.
   ```

   > \[!TIP] 프로젝트에 추가 정보라고도 하는 `README.md` 파일을 포함하는 것이 표준 관행입니다. README 파일에는 다른 사용자가 프로젝트를 이해하고, 설정하고, 실행하는 데 도움을 주는 정보가 일반적으로 포함되어 있습니다.
4. ```
          **Create repository**(리포지토리 만들기)를 클릭합니다.
   ```

### 원격 리포지토리 만들기

방금 만든 로컬 리포지토리는 컴퓨터에 있습니다. 이제 GitHub에 호스트되는 동일한 프로젝트에 대한 \*\*원격 \*\*리포지토리를 만들어 보겠습니다. 원격 리포지토리를 연결하면 작업을 보다 쉽게 협업하고 백업할 수 있습니다.

1. GitHub Desktop에서 **Publish repository**를 클릭합니다.
2. 표시되는 팝업에서 **Publish repository**를 한 번 더 클릭합니다.
3. 원격 리포지토리를 확인하려면 **View on GitHub** 를 클릭합니다.

### 변경할 공간 설정

이제 리포지토리를 만들었으니 **브랜치**를 살펴보겠습니다. 분기는 본질적으로 프로젝트의 복사본이며, 기존 작업의 안정성을 해칠 위험 없이 변경 내용을 테스트할 수 있는 공간입니다.

리포지토리는 프로젝트의 안정적인 기본 버전으로 생각할 수 있는 `main` 분기를 사용하여 자동으로 만들어집니다. 예를 들어, 웹 사이트의 리포지토리에서 `main` 분기는 방문자가 볼 수 있는 사이트에 해당합니다.

새 분기를 만들 때 기본 버전에 영향을 주지 않고 새 기능을 작업할 수 있는 안전한 공간을 만듭니다. 사용자와 협력자는 서로 다른 분기를 사용하여 여러 기능을 동시에 작업할 수 있습니다.

리포지토리의 변경 내용을 작업할 분기를 만들어 보겠습니다.

1. GitHub Desktop에서 <svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-git-branch" aria-label="git-branch" role="img"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg> **Current Branch** 드롭다운 메뉴를 선택한 다음, **New Branch**를 클릭합니다.
2. 새 분기의 이름을 `readme-updates`로 지정한 다음, **Create Branch**를 클릭합니다.

### 프로젝트의 스냅샷 저장

진행 상황을 브랜치에 저장하려면 **커밋**을 수행합니다. 커밋은 특정 시점에 프로젝트의 스냅샷을 찍는 것입니다. 이미 첫 번째 커밋을 수행했습니다. 프로젝트를 초기화할 때 GitHub Desktop에서 `README.md` 파일을 추가하기 위한 초기 커밋을 자동으로 생성했습니다.

저장하려는 작업 청크를 완료할 때마다 커밋해야 합니다. 커밋한 후에는 나중에 변경한 내용이 몇 개든지 상관없이 항상 해당 시점으로 돌아갈 수 있습니다.

1. GitHub Desktop에서 **Open in Visual Studio Code** 를 클릭합니다.

2. VS Code에서 다음 텍스트를 `README.md`에 붙여넣고 변경 내용을 저장합니다.

   ```markdown copy
   Hello, World!

   This is a demo project for learning how to use Git.
   ```

3. GitHub Desktop으로 돌아가서 방금 업데이트한 README 파일의 내용이 표시됩니다. 왼쪽 아래의 GitHub 프로필 사진 옆에 있는 텍스트 상자에 "Update README"를 입력합니다. 이를 **커밋 메시지**라고 하며, 각 커밋에서 변경한 내용을 추적하는 데 도움이 됩니다.

4. 커밋을 수행하려면 **Commit to readme-updates**를 클릭합니다.

### 주요 브랜치에 변경 사항 통합하기

분기에서 변경한 내용에 만족하면 원격 리포지토리에 분기를 게시하고 **끌어오기 요청**을 만들 수 있습니다. 끌어오기 요청을 사용하면 제안된 변경 내용 집합을 검토한 다음, 한 분기에서 다른 분기로 병합할 수 있습니다. 이 경우 `readme-updates`에서 변경한 내용을 원래 분기인 `main`으로 가져오는 끌어오기 요청을 만들게 됩니다.

1. ```
          **Publish branch**를 클릭하여 변경 내용이 포함된 `readme-updates` 브랜치를 원격 리포지토리에 푸시하기 위해 사용합니다.
   ```

2. 제안된 변경 내용을 검토하려면 **Preview Pull Request**를 클릭합니다.

3. ```
          **끌어오기 요청 만들기**를 클릭합니다.
   ```

4. 표시되는 GitHub 창에서 끌어오기 요청 제목을 "Add a message to the README"로 변경한 다음, 주석 상자에 변경 내용에 대한 간략한 설명을 작성합니다.

5. ```
          **[끌어오기 요청 만들기]** 를 클릭합니다.
   ```

6. 변경 내용을 `main` 분기로 가져오려면 페이지 아래쪽에서 **Merge pull request**를 클릭합니다.

   > \[!NOTE] 다른 개발자와 함께 프로젝트를 작업하는 경우, 끌어오기 요청이 병합되기 전에 다른 사용자가 끌어오기 요청을 검토하는 것이 표준 관행입니다.

7. 페이지 아래쪽에서 **Delete branch**를 클릭합니다.
   `main`에 병합된 분기를 삭제하면 리포지토리를 깔끔하고 탐색하기 쉽게 유지하는 데 도움이 됩니다.

### 더 많은 변경 내용 준비

첫 번째 끌어오기 요청 병합에 성공한 것을 축하합니다! 이제 변경 내용을 `main` 분기로 가져왔으니, 다음 라운드의 변경 내용을 준비하기 위해 수행해야 하는 몇 가지 단계가 있습니다.

1. GitHub Desktop에서 `main` 브랜치에 있지 않다면, <svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-git-branch" aria-label="git-branch" role="img"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg> **Current Branch** 드롭다운 메뉴를 선택하고, **main**을 클릭합니다.

   새 분기는 현재 선택한 분기의 복사본으로 생성되므로 새 분기를 만들기 전에 거의 항상 `main` 분기로 다시 전환해야 합니다.
2. 원격 `main` 분기에 변경 내용이 있는지 확인하려면 **Fetch origin**을 클릭합니다.
3. 마지막으로, 로컬 `main` 분기를 원격 `main` 분기의 변경 내용으로 업데이트하려면 **Pull origin**을 클릭합니다.

이제 프로젝트에서 Git을 설정하고 사용하는 데 필요한 모든 기술을 갖추었습니다.

## 명령줄에서 Git에 대해 더 자세히 알아보기

GitHub Desktop은 일상적인 Git 요구 사항을 충족하도록 설계되었습니다. 개발자로 성장함에 따라 Git 작업을 더 많이 제어하거나 더 복잡한 명령을 사용해야 하는 몇 가지 비정상적인 상황이 발생할 수 있습니다. 이러한 경우 명령줄에서 작성된 Git 명령을 사용하도록 전환해야 합니다.

### 명령줄 설정

명령줄 작업을 시작하기 전에 몇 가지 도구를 설정해야 합니다.

1. GitHub Desktop에서 <kbd>Ctrl</kbd>+<kbd>\`</kbd> 키를 눌러 명령줄에서 프로젝트를 엽니다.
2. Windows를 사용하는 경우 [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)을 설치합니다. macOS 및 Linux의 경우, 기본적으로 Git이 설치됩니다.
3. GitHub CLI 관련 작업을 명령줄에서 빠르게 수행할 수 있는 [GitHub를 설치](https://github.com/cli/cli?tab=readme-ov-file#installation)합니다.
4. GitHub에서 GitHub CLI에 인증하려면 다음 명령을 실행합니다.

   ```shell copy
   gh auth login
   ```

   ```
          **GitHub.com** 에서 인증하도록 선택한 다음, 화면의 프롬프트를 따릅니다.
   ```
5. GitHub Copilot 명령 줄 인터페이스 (CLI)를 설치하여 명령줄에서 Copilot를 사용할 수 있습니다.
   [GitHub Copilot CLI 설치](/ko/copilot/how-tos/set-up/install-copilot-cli)을(를) 참조하세요.

### 복잡한 명령어 실험

이제 설정이 완료되었으니, 앞으로 필요할 수 있는 명령어를 찾고 이해하는 방법을 알아보겠습니다. 예를 들어, 온라인에서 누군가가 `git blame`을 언급하는 것을 보았지만 무엇을 수행하는지 모른다고 가정해 보겠습니다. Copilot에게 다음 명령어를 사용하여 설명해 달라고 요청해 보세요.

```shell copy
gh copilot explain "git blame"
```

Copilot은 `git blame`이 파일의 각 줄을 마지막으로 수정한 작성자 및 커밋을 보여 주는 파일의 자세한 기록을 제공합니다. 다음 명령어를 사용하여 직접 실습해 보세요.

```shell copy
git blame README.md
```

훌륭한 도구이긴 하지만, 예측할 수 있듯이 파일에 대한 비난이 정말 길어질 수 있습니다. 파일의 특정 줄에 대한 최신 업데이트에만 관심이 있다고 가정해 보겠습니다. Copilot에게 올바른 명령을 빌드하도록 요청할 수 있습니다.

```shell copy
gh copilot suggest "Show me the blame for line 1 of README.md"
```

Copilot에서 어떤 종류의 명령어를 찾고 있는지 묻는 메시지가 표시되면 화살표 키를 사용하여 **git command**를 선택한 다음, <kbd>Enter</kbd> 키를 누릅니다. 그러면 Copilot에서 다음과 같은 명령어를 제안합니다.

```shell copy
git blame -L 1,1 README.md
```

화살표 키를 사용하여 **Execute command**를 선택한 다음, <kbd>Enter</kbd> 키를 누릅니다. 그러면 `README.md`의 1번 줄을 마지막으로 수정한 작성자와 커밋 정보를 확인할 수 있습니다.

## 검토 및 다음 단계

이 문서에서는 GitHub Desktop을 사용하여 Git의 기본 사항을 다루었으며 다음과 같은 중요한 용어를 학습했습니다.

* **리포지토리**: 프로젝트의 파일에 대한 모든 변경 내용을 저장하는 폴더입니다.
* **커밋**: 특정 시점의 프로젝트 스냅샷입니다.
* **브랜치**: 변경 사항 작업을 위해 프로젝트의 복사본입니다.
* **끌어오기 요청**: 한 분기의 변경 내용을 다른 분기로 병합하라는 요청입니다.

또한 명령줄에서 더 복잡한 Git 작업을 수행하는 방법에 대해서도 설명했습니다.
`gh copilot explain` 및 `gh copilot suggest`를 실습하여 새로운 명령과 기능을 이해하려고 노력했습니다.

이제 배운 내용을 자신의 작업에 적용해 보세요. <kbd>Ctrl</kbd>+<kbd>O</kbd>를 눌러 GitHub Desktop를 사용하여 기존 프로젝트에 Git을 추가합니다. Windows/Linux) 또는 <kbd>Command</kbd>+<kbd>O</kbd>(Mac) 버전 제어의 이점을 직접 경험하세요!