Git을 쓰는 법

개발 블로그·2022년 4월 27일
1
post-thumbnail

Git의 장점

  1. 버전 관리(형상 관리)

상사가 마지막 최종 보고서를 보더니

"저번주에 준게 낫다 그걸로 줘라!"

말한다면 우리는 어떻게 그 파일을 찾아야 될까요? 심지어는 날짜보다 좀 더 구체적인 내용의 버전으로 돌아가고 싶다면 우리는 한 보고서를 쓰더라도 수백개를 저장해야 할겁니다.

Git, Svn, CVS 등의 시스템들은 소스코드를 효과적으로 관리하기 위해 개발되었습니다. Git은 '분산형 버전 관리 시스템'으로 기존 시스템들과 구조가 다르다고 합니다.

  1. 협업

여러 사람들이 한 파일을 각자 수정한다면 우리는 관리하기가 힘들어질겁니다. 이런 부분에서 git은 여러 사람이 병렬적으로 작업하는 것이 가능하며 github라는 중앙서버를 지원해서 개인 컴퓨터의 파일이 전부 날라가도 복구할 수 있으며 개인은 인터넷이 없어도 오프라인으로 git을 사용하여 관리할 수 있습니다.

설치

WindowOS


https://git-scm.com/

MacOS

brew install git // Homebrew 설치 후 brew로 설치 가능

명령어로 보는 파일 관리

해당 글은 mac 기준으로 쓰였으며 window에서는 LF 설정등 다른 문제가 있을 수 있습니다. VScode로 진행하겠습니다.

1. git config

git config --global user.email "자기 이메일"

git config --global user.name "원하는 자기 이름"

git 설치 후 환경 설정을 위한 명령어입니다. git은 commit을 할때마다 사용자의 이름과 이메일을 등록합니다. --global을 붙여 한번 실행하면 다시 선언하지 않아도 됩니다.
만약 프로젝트마다 다른 이름과 이메일 주소를 사용하고 싶으면 --global 옵션을 빼고 명령을 실행하시면 됩니다.

2. git init

git init 

이제 폴더를 생성해주시고 터미널로 해당 경로에서 명령어를 치면 폴더 내에 git 저장소가 생성됩니다.

2. git add

이제 우리가 관리할 파일을 생성하고 git에게 이 파일의 모습을 기억해달라고 하는 명령어입니다.
앞으로 커밑을 할때는 변화된 파일을 매번 add해야 그 버전에서의 모습이 저장될 것입니다.

// 파일명들을 치거나 
git add test.txt test2.txt ...

// 현재 모든 파일 추가
git add . 

// 현재 상태 로그 확인
git status

3. git commit

현재 상태를 버전으로 저장하고 싶을 때 -a, -m을 붙여서 제목과 함께 커밑합니다.

// m은 메세지, a은 모든 파일을 git add하겠다는 뜻입니다.
git commit -am "메세지"


// git에서 저장한 커밑들의 로그를 확인할 수 있습니다.
git log 

commit 4392699758c081e8fe29f01f7a117d6a48ce8319 (HEAD -> master)
Author: ranja <seolin9340@gmail.com>
Date:   Tue Apr 26 09:55:08 2022 +0900

    버전 1
    
// 커밑의 디테일한 정보없이 간략하게 로그를 확인할 수 있습니다.
git shortlog

ranja (1):
      버전 1

4. git diff

추적중인 파일에 내용을 변경하고 git diff를 치면 그전 버전과 무엇이 바뀌었는지 보여줍니다.

git diff 

diff --git a/test.txt b/test.txt
index e69de29..748d4ef 100644
--- a/test.txt
+++ b/test.txt
@@ -0,0 +1 @@
+git은 개꿀이다.
\ No newline at end of file

5. git reset / git revert

내용을 변경 후 커밑하고 작업을 하던 중 파일을 다시 전으로 되돌려야겟다고 마음먹었습니다. git reset / git revert를 활용하면 우리가 원하는 버전으로 돌아올 수 있습니다. 다만 현재 내용을 모두 잃어버릴 수도 있어서 주의해서 사용해야 합니다.
git tool중에는 버전을 시각화해서 보여주는 것들이 많은데요. vscode의 git graph 익스텐션을 설치하시면 저와 같은 화면을 보실 수 잇습니다.

// test.txt 파일
git은 개꿀이다. // 버전 1에서 추가된 내용

아니다 생각해보니 아니다. // 버전 2에서 추가된 내용

실수!! // 현재 작업중이던 내용이지만 실수로 상관없는 내용을 커밑해버려서 돌아가려 합니다.

저는 내용을 작업하던 중 버전 2로 돌아가야겟다는 마음을 먹었습니다. 이때 저희가 사용할 수 있는 명령어는 2개인데요. git reset의 경우를 먼저 설명드리겟습니다.

git reset HEAD~1 // HEAD는 현재 위치 (브랜치, 커밑)에서 1단계

이렇게 명령어를 적용하면 실제로 버전2로 돌아왔다는 것을 확인할 수 있습니다. reset에는 총 3가지 모드가 있는데요.

git reset HEAD~1                                                                                                          
리셋 뒤에 스테이징하지 않은 변경 사항:
M       test.txt

git status
현재 브랜치 master
커밋하도록 정하지 않은 변경 사항:
  (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오)
  (use "git restore <file>..." to discard changes in working directory)
        수정함:        test.txt

커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를
사용하십시오)

첫째 디폴트 값인 --mixed는 우리가 실수라고 적은 부분을 지우지 않고 버전2로 들고 옵니다. 우리는 매번 파일이 변화하고 나면 git add를 해주엇는데요. git status 후 메세지를 보시면 파일이 변경되었지만 커밑하도록 정하지 않은 파일인 상태인 것을 확인할 수 있습니다.

git reset HEAD~1 --soft                                                 

git status
현재 브랜치 master
커밋할 변경 사항:
  (use "git restore --staged <file>..." to unstage)
        수정함:        test.txt

두번째 --soft에서는 버전2로 오는 동시에 실수라고 적은 커밑의 내용을 그대로 git add해놨습니다.

git reset HEAD~1 --hard    
HEAD의 현재 위치는 b7309a2입니다 버전 2

세번째 --hard에서는 버전2로 오면서 "실수한 버전3"의 내용은 하나도 들고 오지 않습니다. 만약 그 내용들을 다시 찾고싶다면 git reflog라고 검색해보면 되십니다.

reset에서 주의할 점은 로컬 저장소에서는 커밑내용이 사라지지만 원격 저장소에 올려논 것은 지워지지 않습니다. 혼자 사용하는 branch라면 강제로 push할 수도 있지만 팀원이 있다면 충돌이 날 것입니다.

git revert는 이럴때 이전 커밑 내역을 그대로 남겨둔 채 reset한 버전으로 새 커밑을 생성할 수 있습니다.

git revert HEAD "지금 실수한 commit의 id"
[master 45499db] Revert "실수한 버전 3"
 1 file changed, 1 insertion(+), 3 deletions(-)

실수한 버전의 커밑은 유지하면서 새로운 커밑을 추가해 이전 버전으로 돌아가는 방식입니다.

6. git push

깃허브에서 새로운 레포지토리를 만들겠습니다. git의 장점으로 협업이라고 언급햇었는데요. 우리가 다른 개발자들과 같이 작업하려면 원격저장소에 먼저 우리의 자료를 올리고 branch를 추적하게 해야합니다.

//             [name]       [url]
git remote add origin [우리의 레포지토리 주소]
origin이라는 이름으로 원격저장소의 주소를 등록

// origin에 등록된 url 확인 가능
git remote get-url origin

이제 원격저장소가 제대로 등록된 것을 확인했으면 파일을 업로드해봅니다.

//       원격 이름 내이름(정확히는 내 브랜치)
git push origin master

이제 우리의 파일은 두가지 갈래로 각자 관리할 수 있습니다. 하나는 로컬의 파일이고 하나는 원격에 저장된 파일입니다. 이 부분을 주의해주세요!

7. git pull

친구가 우리의 원격저장소에 커밑을 했습니다. 그렇다면 우리의 파일과 원격의 파일을 동기화시킬 필요가 있습니다.

일단 먼저 깃허브에서 파일을 수정해서 커밑을 해보겟습니다.

로컬과 원격의 히스토리가 달라졌는데요. git push를 먼저 시도해보겟습니다.

힌트: 리모트에 로컬에 없는 사항이 들어 있으므로 업데이트가
힌트: 거부되었습니다. 이 상황은 보통 또 다른 저장소에서 같은
힌트: 저장소로 푸시할 때 발생합니다.  푸시하기 전에
힌트: ('git pull ...' 등 명령으로) 리모트 변경 사항을 먼저
힌트: 포함해야 합니다.
힌트: 자세한 정보는 'git push --help'의 "Note about fast-forwards' 부분을
힌트: 참고하십시오.

git push는 로컬에서 서버로 git pull은 반대로 서버에서 로컬로 끌어당깁니다.
이제 하라는대로 git pull을 해보겠습니다.

git pull

8. git merge

pull이 잘된 것을 확인했습니다.
현재 로컬의 master에서 커밑을 한후 pull을 받아 충돌상황을 만들어봤습니다.
이렇게 branch가 나뉘었을 때 우리는 병렬로 작업하던가 아니면 합치는 방법을 선택할 수 있습니다.

만약 origin/master 브랜치에 로컬 master를 합치고 싶다면 먼저 origin/master로 이동해야합니다.

// 브랜치 이동
git checkout [원하는 위치의 브랜치]

git merge [합칠 브랜치]   

자동 병합: test.txt
충돌 (내용): test.txt에 병합 충돌
자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.

현재 원격의 test.txt와 로컬 마스터의 test.txt의 내용이 달라 충돌이 발생했습니다. 그러면 하라는대로 충돌을 해결하고 새로운 커밑을 해봅시다.

전 두 수정사항 다 적용하고 싶어서 Accept Both Changes를 클릭했습니다. vscode에서 지원하는 git tool로 선택해도 되고 직접 아예 새롭게 작성하셔도 됩니다.

git commit -am "버전 5"
[HEAD 분리됨 f014cf8] 버전 5

보이시나요? 버전 5라는 커밑으로 두 내용이 병합되었습니다.

profile
프론트엔드 개발자의 TIL

0개의 댓글