Snapshot과 diff / patch / delta
diff
말 그대로 차이(difference)이다. diff 명령어를 이용해 두 디렉토리/파일 간의 차이를 구할 수 있고, 그 차이를 파일로 생성해 저장한다. 이 때의 파일이 바로 patch 파일이다. 이러한 patch를 이용해 다른 시스템의 파일에 적용할 수 있다. (그래서 이름이 패치군)
delta는 아마 차이 그 자체, 즉 변경된 부분의 데이터를 말하는 듯하다. diff를 통해 패치 파일을 생성하는 과정은 델타들을 패치 파일에 저장하는 과정이라고 받아들였다.
diff를 이용하는 예를 들어보자.
wlqrkrhtlvek 라는 이름의 파일에 대한 작업을 한다고 하자. 우선 작업 전 이 파일을 복제해 wlqrkrhtlvek.orig 라는 파일을 생성한다. 이때의 파일은 원본이 되므로 절대 수정해선 안 된다. 그 후 파일에 대해 작업을 수행한다.
작업을 완료하면:
diff wlqrkrhtlvek.orig wlqrkrhtlvek > wlqrkrhtlvek.diff 를 실행해 원본과 작업 파일간의 차이를 wlqrkrhtlvek.diff에 저장한다.
이렇게 생성된 wlqrkrhtlvek.diff 파일이 바로 패치 파일이다(.patch를 사용하기도 함.)
여기서 wlqrkrhtlvek.orig에 wlqrkrhtlvek.diff를 적용하면 wlqrkrhtlvek와 같은 결과가 되는 것이다.
(패치 파일은 텍스트 파일이다)
original.txt와 modified.txt의 patch 파일의 예시:
--- original.txt 2024-06-22 15:00:00.000000000 +0900
+++ modified.txt 2024-06-22 15:01:00.000000000 +0900
@@ -1,4 +1,4 @@
-This is the original file.
+This is the modified file.
-It has some content.
+It has new content added.
-Here is another line.
+Here is a new line.
(지피티의 예시)
참고: https://kldp.org/node/28938
diff와 patch 프로그램을 사용하는 방법 | KLDP
많은(?) 분들이 오픈 소스 프로젝트에 참여하고 싶어도 이 두 가지 프로그램을 어떻게 쓰는지 몰라 힘들다고 하셔서 여기다 간단히 소개합니다. 우선 diff는 말 그대로 difference, 즉 차이를 만들어
kldp.org
20년 전 글인데 설명을 되게 잘하신 것 같다.
Snapshot
버전 관리 시스템마다 데이터를 관리하는 방식이 다르다. SVN(subversion)과 같은 시스템들은 델타 방식을 사용하는 방면, 깃은 스냅샷 방식을 사용한다.
델타 기반 버전 관리 시스템은 말 그대로 델타, 차이를 저장한다. 파일이 생겨난 시점에는 파일 전체를 저장하고, 이후 시간순으로 파일 집합을 관리하며 파일이 변경되면 그 시점과 처음 상태의 차이를 저장한다.
아래의 사진에서 예를 들면 파일 C의 Version 5는 Version 1 + 델타1 + 델타2 +델타3 으로 계산하는 것이다.
언뜻 보기엔 저장공간도 절약되고 좋아보이지만, 이 델타가 무수히 많아진다고 생각하면 이를 계산하는 것은 비효율적일 수 있다.
반면 스냅샷 방식을 쓰는 깃에서는 특정 시점에서 모든 파일의 '스냅샷'을 저장한다. 지금은 이 스냅샷을 파일들의 정보를 저장한 객체라고 이해하겠다. 깃에서는 시간순으로 '프로젝트의 스냅샷'을 저장하며, 데이터를 파일 시스템 스냅샷의 연속으로 취급한다. 그렇다는 건 버전이 바뀔 때마다 모든 파일을 포함한 스냅샷이 생긴다는 얘긴데, 너무 부담스럽지 않을까? 그렇지 않다! 변경된 부분이 없는 파일은 새로 저장되지 않고 이전 버전에 대한 링크만 저장한다. 이를 통해 깃은 다른 VCS와 구분되게 된다.
https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EA%B8%B0%EC%B4%88
Git - Git 기초
Subversion과 Subversion 비슷한 놈들과 Git의 가장 큰 차이점은 데이터를 다루는 방법에 있다. 큰 틀에서 봤을 때 VCS 시스템 대부분은 관리하는 정보가 파일들의 목록이다. CVS, Subversion, Perforce, Bazaar 등
git-scm.com
https://www.slideshare.net/andabi/git-16126636
Git 기본개념과 사용법 그리고 어플리케이션
Git 기본개념과 사용법 그리고 어플리케이션 - Download as a PDF or view online for free
www.slideshare.net
로컬 공간과 파일의 상태
로컬 공간
로컬에서 작업할 때, 세 가지 '공간'이 존재한다. (공간이 정확한 표현일 지는 모르겠지만 편의상 칭하도록 하겠다.)
- Working Directory
파일을 modify하는 곳이다. 여기서 개발자는 코드를 수정, 생성하는 등의 작업을 한다. - Staging Area
파일을 modify 한 후 Staging Area에 파일을 추가한다. 이때 '파일이 추가된다'고 표현했지만, 파일 자체는 작업 디렉토리에 남아있으며, 파일의 '스냅샷'이 생성되어 Staging Area에 추가된다. 즉 Staging Area에 추가한 시점의 상태가 저장되는 것이다.
(그냥 커밋할 거라고 표시가 된 상태다! 라고 하는데 Staging Area가 정확히 어떤 의미인진 더 공부가 필요할 것 같다.)
이 스냅샷은 commit 할 준비가 됐다. - Git Directory (Repository)
commit을 하면 Staging Area에서 대기 중이던 변경 사항이 로컬 레포지토리에 저장된다. 이후 push를 통해 원격 레포지토리에 로컬의 변경 사항을 저장할 수 있다.
파일의 상태
- Modified
파일이 수정 된 상태. Stage나 Commit을 하지 않은 상태. Working Directory에 존재 - Staged
파일이 Stage 된 상태. Staging Area에 존재 - Committed
파일이 Commit 된 상태. 로컬 저장소에 잘 저장된 상태. Git Directory에 존재
https://velog.io/@chillihc/Git-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
[Git] Git 개념 이해
프로그램 공부를 하다보면 한 번쯤은 Git에 대하여 들어보거나 사용해보게 된다. 대충은 알겠는데 자세히는 모르겠는것, 사용할 줄은 알겠지만 정확히는 모르겠는 것, 이번 기회에 정확한 정의
velog.io
https://velog.io/@kkh30123/GIT
GIT
GITGIT SOURCELinux Kernel ArchivesGit은 DVCS(분산 버전 관리 시스템)입니다. DVCS에서의 클라이언트는 단순히 파일의 마지막 스냅샷을 Checkout1 하지 않고 그냥 저장소를 히스토리와 더불어 전부 Clone 합니다
velog.io
Upstream / Downstream
업스트림과 다운스트림은 상대적인 개념으로, 업스트림에서 다운스트림으로 흐르는 관계가 형성된다.
Upstream
보통 원본 레포지토리로, 작업의 기준점이 된다. 업스트림을 추적하여 프로젝트의 진행과 동기화한다.
push, pull를 '당하는' 레포지토리
Downstream
주로 특정 작업을 위한 레포지토리. 업스트림의 내용을 받아와 새로운 기능을 추가하는 등의 추가 작업 진행
push, pull를 '하는' 레포지토리
https://pers0n4.io/github-remote-repository-and-upstream/
GitHub에서 협업을 위한 remote repository와 upstream 이해하기
Git은 현재 소프트웨어 개발에 사용되는 널리 알려진 버전 관리 시스템으로 '분산 버전 관리 시스템' 중 하나입니다. 버전 관리 시스템에서 분산이라는 말은 사용자가 원격 서버를 거치지 않고서
pers0n4.io
개인적으로 검색과 함께 공부하여 잘못된 내용이 있을 수 있음에 양해를 구합니다!
'git' 카테고리의 다른 글
[git] 분산 버전 관리 시스템(DVCS) (0) | 2024.05.14 |
---|