Skip to content

Commit

Permalink
Merge branch 'update'
Browse files Browse the repository at this point in the history
  • Loading branch information
djccnt15 committed Apr 5, 2024
2 parents daa4700 + b919c85 commit 58396a6
Show file tree
Hide file tree
Showing 5 changed files with 185 additions and 18 deletions.
32 changes: 29 additions & 3 deletions docs/blog/posts/2022-01-15-git_save_upload.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,32 @@ git add -u
git add *.txt
```

- 특정 블럭만 추가

```bash
git add -p
```

```bash
git add --patch
```

상세 옵션은 아래와 같다.

```
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
g - select a hunk to go to
/ - search for a hunk matching the given regex
e - manually edit the current hunk
? - print help
```

## commit

add된 파일들을 local 저장소에 추가
Expand Down Expand Up @@ -84,17 +110,17 @@ git commit --amend --no-edit --date="May 23 11:08:49 2022 +0900"
- commit된 내용을 원격 저장소로 업로드

```bash
git push <repository> <branchname>
git push <repository> <branch>
```

- dry-run을 통해 명령을 수행할 시 어떤 일이 일어날지 출력

```bash
git push -n <repository> <branchname>
git push -n <repository> <branch>
```

- 원격 저장소의 브랜치 삭제

```bash
git push <repository> -d <branchname>
git push <repository> -d <branch>
```
4 changes: 2 additions & 2 deletions docs/blog/posts/2022-01-16-git_download.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ git fetch <repository>
원격 저장소의 내용을 가져와서 현재 브랜치와 병합(merge)

```bash
git pull <repository> <branchname>
git pull <repository> <branch>
```

## clone
Expand All @@ -56,5 +56,5 @@ git clone <url> <directory>
특정 브랜치만 클론

```bash
git clone -b <branchname> --single-branch <repository>
git clone -b <branch> --single-branch <repository>
```
72 changes: 61 additions & 11 deletions docs/blog/posts/2022-11-08-git_handling_branch.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ git branch -c [<oldbranch>] <newbranch>
- 브랜치 삭제

```bash
git branch -d <branchname>
git branch -d <branch>
```

!!! tip
Expand All @@ -53,7 +53,7 @@ git branch -d <branchname>
- 원격 저장소의 브랜치를 가져오기

```bash
git branch -t <branchname>
git branch -t <branch>
```

!!! note
Expand All @@ -66,13 +66,13 @@ git branch -t <branchname>
- 브랜치 이동

```bash
git switch <branchname>
git switch <branch>
```

- 브랜치 생성 및 이동. `<start-point>`를 입력할 경우 해당 커밋을 브랜치의 시작점으로 지정

```bash
git switch -c <branchname> [<start-point>]
git switch -c <branch> [<start-point>]
```

- 저장 상태를 변경하지 않고 단순히 과거 특정 커밋 상태인 코드를 보기 위한 이동
Expand All @@ -84,27 +84,26 @@ git switch --detach <commit>
!!! note
`--detach` 옵션은 detached HEAD[^1][^2] 상태를 만들어준다.

[^1]: Git에서 HEAD란 저장소에서 현재 위치를 뜻하는데, 쉽게 말하자면 **사용자에게 실제로 보이는 저장소**[^3]의 상태를 뜻한다.
[^1]: Git에서 HEAD란 저장소에서 현재 위치, 즉 **사용자에게 실제로 보이는 저장소**의 상태를 뜻한다.
[^2]: HEAD가 현재 작업중인 브랜치의 최신 커밋을 가리킬 때 attached HEAD, 그렇지 않을 때 detached HEAD라고 부른다.
[^3]: Working Directory나 Staging Area가 아님에 주의

## merge

현재 HEAD가 위치한 브랜치로 대상 브랜치를 합칠 때 사용하는 명령어

```bash
git merge <branchname>
git merge <branch>
```

```bash
git merge --no-ff <branchname>
git merge --no-ff <branch>
```

!!! tip
`git merge`의 기본값인 fast-forward 방식 머지는 머지 commit을 생성하지 않는다. 따라서 `--no-ff` 옵션을 사용해서 머지 commit이 생성되도록 해줘야 이력 관리가 용이하다.

```bash
git merge --no-commit --no-ff <branchname>
git merge --no-commit --no-ff <branch>
```

!!! tip
Expand All @@ -115,8 +114,59 @@ git merge --no-commit --no-ff <branchname>
공통 base를 가진 브랜치에서 한 브랜치의 base를 다른 브랜치의 최신 커밋으로 브랜치의 base를 옮기는 명령어

```bash
git rebase <branchname>
git rebase <branch>
```

!!! note
`merge`에 비해서 사용법이 복잡하고 중간에 걸친 모든 commit의 conflict를 검토해줘야 한다는 단점이 있지만, commit 이력이 더 깔끔해지고 히스토리 추적이 쉬워진다는 장점이 있다.
`merge`에 비해서 사용법이 복잡하고 중간에 걸친 모든 commit의 conflict를 검토해줘야 한다는 단점이 있지만, commit 이력이 더 깔끔해지고 히스토리 추적이 쉬워진다는 장점이 있다.

`B` 브랜치를 베이스로 한 `C` 브랜치가 있다고 할 때, `C` 브랜치의 시작점을 `B` 브랜치에서 `main` 등 다른 브랜치로 옮기려면 `--onto` 옵션을 사용하면 된다.

```bash
git rebase --onto <newbase> <oldbase> <branch> # (1)!
```

1. 마지막의 `<branch>` 입력을 생략할 경우 현재 브랜치에 대해 적용된다.

??? note "좀 더 자세한 설명"

```mermaid
gitGraph
commit id: "A"
commit id: "B"
branch feature/a
commit id: "C"
commit id: "D"
branch feature/b
commit id: "E"
commit id: "F"
commit id: "G"
checkout main
commit id: "H"
commit id: "I"
commit id: "J"
```

위와 같은 커밋 히스토리가 있을 때, `feature/b` 브랜치에서 작업한 커밋이 `feature/a` 브랜치의 커밋 내용과는 완전히 독립적이고, 따라서 `main` 브랜치에서 작업을 시작한 것으로 바꾸고 싶다면 아래와 같이 명령하면 된다.

```bash
git rebase --onto main feature/a feature/b
```

```mermaid
gitGraph
commit id: "A"
commit id: "B"
branch feature/a
commit id: "C"
commit id: "D"
checkout main
commit id: "H"
commit id: "I"
commit id: "J"
branch feature/b
commit id: "E"
commit id: "F"
commit id: "G"
checkout main
```
4 changes: 2 additions & 2 deletions docs/blog/posts/2023-03-12-git_restore.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Git restore 명령어의 활용 방법
## restore

[restore](2022-01-17-git_tips.md/#restore) 명령어는 원래 수정 사항을 되돌리기 위해 사용하는 명령어로, 아래와 같이 사용한다.
[`restore`](2022-01-17-git_tips.md/#restore) 명령어는 원래 수정 사항을 되돌리기 위해 사용하는 명령어로, 아래와 같이 사용한다.

- 수정 사항 되돌리기

Expand All @@ -41,7 +41,7 @@ git restore --source=<commit> <file>

## 특정 소스 지정하기

restore 명령어의 상세 옵션은 아래와 같은데, `--source` 옵션을 사용하면 어느 소스의 내용으로 현재 파일의 내용을 바꿀 것인지 지정해줄 수 있다.
`restore` 명령어의 상세 옵션은 아래와 같은데, `--source` 옵션을 사용하면 어느 소스의 내용으로 현재 파일의 내용을 바꿀 것인지 지정해줄 수 있다.

```bash
git restore (-p|--patch) [--source=<tree>] [--worktree] [<pathspec>…​]
Expand Down
91 changes: 91 additions & 0 deletions docs/blog/posts/2024-04-04-git_rollback.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
---
slug: git-rollback
title: Git 과거 코드로 되돌리기
date:
created: 2024-04-04
description: >
Git을 사용해서 과거 코드 이력으로 되돌리는 방법
categories:
- SW Engineering
tags:
- git
---

Git을 사용해서 과거 코드 이력으로 되돌리는 방법

<!-- more -->

---

> The information manager from Hell. - Linus Benedict Torvalds
## 💡switch

[`switch`](2022-11-08-git_handling_branch.md/#switch) 명령어는 원래 특정 브랜치로 HEAD를 옮기기 위한 명령어인데, HEAD를 옮길 수 있다는 점 때문인지 과거 커밋으로 HEAD를 옮기는 용도로도 사용 가능하다.

아래와 같이 `--detach` 옵션을 사용하면 **과거 특정 커밋 상태인 코드를 보기 위한 이동 개념**으로 detached HEAD 상태를 만들어 저장 상태를 변경하지 않고 코드를 일시적으로 되돌릴 수 있다.

```bash
git switch --detach <commit>
```

!!! warning
detached HEAD 상태에서는 제대로 된 커밋이 이루어지지 않는다. 정상적으로 커밋을 생성하기 위해서는 새로운 브랜치를 만들어야 한다.

!!! info
이 명령어는 **EXPERIMENTAL** 상태이기 때문에 작동 방식이 변경될 수 있다.

## restore

[`restore`](2022-01-17-git_tips.md/#restore) 명령어는 삭제한 파일을 되살리는 명령어인데, 아래와 같이 `-s`, `--sorce` 옵션과 함께 사용하면 특정 커밋에서 해당 파일의 내용을 되살릴 수 있다.

```bash
git restore --s <commit> <file>
```

```bash
git restore --source=<commit> <file>
```

!!! info
이 명령어는 **EXPERIMENTAL** 상태이기 때문에 작동 방식이 변경될 수 있다.

## reset

[`reset`](2022-01-17-git_tips.md/#reset) 명령어는 현재의 HEAD를 특정 상태로 되돌리는 명령어인데, 아래와 같이 특정 커밋의 특정 파일에 대해서도 지정할 수 있다.

```bash
git reset <commit> <file>
```

!!! danger
파일명을 제대로 입력하지 않을 경우 전체 저장소가 되돌려진다.

!!! warning
`reset` 명령어를 사용해서 되돌릴 경우 **커밋 이력이 삭제**된다.

## 💡revert

`revert` 명령어를 사용하면 특정 커밋의 내용을 되돌리는 새로운 커밋을 생성한다. 새로운 커밋을 생성하기 때문에 커밋 이력을 삭제하지 않는다는 장점이 있다.

```bash
git revert <commit>
```

아래와 같이 `--no-commit` 옵션을 사용하면 커밋을 자동 실행하지 않는다.

```bash
git revert --no-commit <commit>
```

여러 커밋을 한 번에 되돌리려면 아래와 같이 `..`으로 범위를 지정해주면 된다.

```bash
git revert -n <start-commit>..<finish-commit>
```

아래와 같이 마지막 범위를 지정하지 않을 경우 HEAD가 마지막 범위로 자동 지정된다.

```bash
git revert -n <start-commit>..
```

0 comments on commit 58396a6

Please sign in to comment.