Git Hi_2 (9/8)

권숙현·2023년 9월 8일

Javascript's Adventure

목록 보기
6/10

2장. Git 시작하기

1. Git 파일 생성

[새로운 파일 생성]

저장소 생성 완료 후, 새로운 'comment.js'파일 작업을 완료하였습니다.
이 파일을 저장소에 어떻게 반영할 수 있을까요?

[파일 영역의 라이프 사이클]


Image 출처: git-scm.com

[새로운 파일 생성]

먼저, comment.js 파일을 준비영역으로 보내야 한다. > git add 명령어를 사용
한 번에 추가할 파일이 너무 많다면 현재 폴더 대상으로 지정 가능 > git add .

$ git add comment.js
$ git add .

[Staging 상태 확인]

git status 명령어로 Staging area의 어떤 파일이 변경되었는지 등의 파일의 상태를 확인 할 수 있음

$ git status

2. Git 저장소 반영

comment.js 파일을 staging area(준비영역)에 올려놓았으므로, 어떤 것을 수정했는지 메시지와 함께 저장소에 저장하는 작업을 진행

[git 저장소 반영]

1) .git 저장소 내에 staging area에 있는 모든 파일을 저장

$ git commit

2) 저장소 반영에 "커밋 메시지"는 생략이 가능하지만 반영한 내용을 추후에 쉽게 알 수 있도록 적절한 메세지를 넣어주기

$ git commit -m "Initial commit"
/*"Initial commit"이 메세지 내용*/

3) 앞에서 적은 메세지에 오타가 있거나 누락된 파일이 있을 경우 수정 가능

$ git commit --amend
/*텍스트 편집기가 실행되고, 수정하고 싶은 수정하면 수정되어 반영됨*/
/*메세지 수정하고 [control+X] > [Y] > [Enter] */
$ git commit --amend -m "add main.py"
/*텍스트 편집기 없이 바로 수정하는 방법 " " 안이 수정하고 싶은 메세지*/

4) 저장소 반영 내영이 궁금하면 아래 명령어를 통해 확인 가능

$ git log
commit commit ID
Autor: sukki <knk1213@gmail.com>
Data:  Fri Sep 8 13:45:22

     Initial commit

[문제!] git add와 commit으로 저장소에 파일 추가하기
1) 저장소에 파일을 넣으려고 해도 아래와 같은 오류가 발생하면서 넣어지지가 않음
nothing added to commit but untracked files present
2) git status로 파일을 상태를 확인해보니

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to inclued in wha will be committed)
        README.text
        searching.py

두 파일 중 searching.py 파일만 commit 하려면 어떻게 해야할까?

git add searching.pygit commit -m "add searching.py"로 커밋한다

3. Git 관리 상태 확인

[파일 상태 확인]

Git 저장소까지 저장을 완효하면, 파일들의 상태와 history를 git status, git log를 통해 확인할 수 있음

  • git status : staging file들의 상태 확인
  • git log : .git repository에 존재하는 commit history 확인

[status]

git diff : commit 된 파일 중 변경된 사항을 비교할 때

$ git diff
diff --git a/article.js b/article.js
index ~~~~~~~
--- a/article.js
--- b/article.js
@@ -1 +1 @@
-#let
+#trysome

[대표적인 log 옵션들]

git log @

  • -p, --patch : 각 commit의 수정 결과를 보여주는 diff와 같은 역할을 수행합니다.
  • -n : 상위 n개의 commit만 보여줍니다.
  • --start : 어떤 파일이 commit에서 수정되고 변경되었는지, 파일 내 라인이 추가되거나 삭제되었는지 확인
  • --pretty=oneline : 각 commit을 한 줄로 출력
  • --graph : commit간의 연결된 관계를 아스키 그래프로 출력 (branch 생성 시 아주 유용하게 활용)
  • -S function_name : 코드에서 추가되거나 제거된 내용 중 특정 텍스트(function_name)가 포함되어 있는지 검사
  • git rm --chahed <>file<> : to unstage할 수 있음

[문제!] git 파일의 상태를 확인하고 staging을 취소할 수 있을까?
상황1) README.txt파일만 commit되어 올라감 (초록)
상황2) searching.py 파일은 commit되었다가 수정함 > modified상태
상황3) searching.py 파일만 commit하고 싶음
(tip. modified > staging > commit 이 순서로 진행이 되어야 함

① git add searching.py
② git reset HEAD README.txt
③ git commit -m "add searching.py"

3장. Git 가지치기

git에서 브랜치를 만들고, 여러 작업을 독립적으로 수행하여 브랜치의 내용을 병합할 수 있음

1. Git Branch

[Git Branch?]

독립적으로 어떤 작업을 진행하기 위한 개념.
각각의 Branch는 다른 Branch의 영향을 받지 않음

[Git Branch 종류]

  • 메인 Branch : 배포할 수 있는 수준의 안정적인 Branch
  • 토픽 Branch : 기능 추가나 버그 수정과 같은 단위 작업을 위한 Branch (수시로 생겼다가 없어질 수 있음)

[Git Branch 생성]

Branch는 아래의 명령어로 생성할 수 있음

$ git branch like_feature

[Git Branch 전환]

$ git branch
$ git checkout like_feature
Switched to branch 'like_feature'

↓ HEAD가 현재 위치해 있는 branch 위치를 나타냄 ↓

[Git Navigation]

checkout은 branch를 전환하는데 사용할 수도 있고, 아래와 같이 git log 로 확인한 snapshot을 넘나들때도 사용이 가능합니다.

git checkout <snapshot hash>
  
$git log --pretty=online
e4abb6f... (HEAD -> master) this is master
d97d387... another snapshot

$ git checkout d97d387 another snapshot

$git log --pretty=online
e4abb6f... (master) this is master
d97d387... (HEAD) another snapshot

이렇게 snapshot의 hash값을 이용하여 과거의 파일 내용을 확인 할 수 있습니다.

2. fast forward

"like_feature" Branch의 working directory에서 새로운 정보를 넣어 commit하면 새로운 checkpoint가 생성됨

$ git checkout like_feature

3. Git Merge

"like_feature" Branch에서의 작업을 끝마치고 "master" Branch로 통합

[fast-forward 병합]

1) master branch로 이동
2) like_feature branch를 병합

$ git checkout master
$ git merge like_feature

"like_feature" Branch의 내용이 "master" Branch에서 업데이트 된 내용이기 때문에 곧바로 merge가 되는 것을 확인할 수 있음
> 이렇게 merge가 이루어지는 것을 fast-forword 라고 부름

[갈라지는 branch]

이번에는 각각의 Branch의 working directory에서 같은 파일의 내용을 다르게 수정
(여러 branch들을 동시에 작업한 경우)

git log --graph --all 을 사용하면 commit graph를 확인 가능

$ git log --pretty=online --graph --all

[Git Branch 삭제]

아래의 명령어로 Merge된 Branch를 볼 수 있음

$ git branch --merged

사용을 마친 branch는 아래 명령어를 이용하여 삭제할 수 있음

$ git branch -d like_feature
$ git log --graph --pretty=online --all
/* branch의 merge, delete 과정이 graph형식으로 나타남 */

4. conflict 해결

[Merge conflict]

충돌은 왜 발생할까? Merge한 두 Branch에서 같은 파일을 변경했을 때 충돌이 발생합니다

① git status명령어로 어느 파일에서 충돌이 발생했는지 확인이 가능
② 어느 부분 때문에 conflict가 일어났는지 확인하고
③ '<<<<' , '====', '>>>>'가 포함된 행을 삭제해주기
④ 수정 완료 후 다시 git add, git commit 과정을 거쳐 다시 merge하기

[Git Merge 충돌 방지]

① master Branch의 변화를 지속적으로 가져와서 충돌이 발생하는 부분을 제거
② master Branch를 변경하는 경우가 없도록 하기

[문제!] 현재 git에 master branch 만 있고, master branch가 선택되어져 있음
① 새 브랜치 sukki를 생성
② sukki브랜치에서 module1.py파일을 생성하고 아무내용이나 채우기
③ module1.py파일을 commit
④ master branch에 병합
⑤ sukki branch 삭제

git branch                        #branch의 현재 구조 파악
git branch sukki                  #sukki branch 생성
git checkout sukki                #sukki branch에 들어가기
nano module1.py                   #module1.py생성 > 명령어 사용 안하고 그냥 만들어도 됨
git add module1.py                #module.py파일 저장소에 올리기
git commit -m "add module1.py"    #저장소에 있는 module.py파일 커밋하기
git checkout master               #master branch로 이동
git merge sukki                   #sukki branch 병합
git branch -d sukki               #sukki branch 삭제
git log --graph                   #지금까지 병합 과정 한눈에 보기

[문제!] merge중 충돌발생! master, apple, banana 3가지 브랜치가 있을 때, crawling.py 파일에서 충돌 발생
① 충돌을 해결 > crawling.py 파일 수정
② banana 브랜치 apple와 병합
③ master에 apple 병합
④ apple, banana 브랜치 삭제

git status                      #충돌 발생 현재 상태 파악
git add crawling.py             #crawling.py파일 저장소에 올리기
git commit -m "crawling.py"     #저장소에 있는 crawling.py파일 커핏하기
git checkout banana             #banana branch로 이동
git merge apple                 #apple merge
git checkout master             #master branch로 이동
git merge apple                 #apple branch 병합
git branch -d apple             #apple branch 삭제
git branch -d banana            #banana branch 삭제
profile
sukki의 velog*^^*

0개의 댓글