본문 바로가기
Base/ETC

[Git] 기초

by 오우영 2021. 2. 22.

 

Git을 쓰는 이유

1. 버전을 관리하기 위해 (파일 하나로 버전을 관리할 수 있다)

2. 두 명 이상의 협업시에 버전을 따로 관리할 수 있고 다시 합치며 관리하는 것이 쉬워진다.

 

처음 로컬과 원격 저장소 연결

git remote add origin "Repository URL"

 

처음 로컬과 upstream 연결

git remote add upstream "Repository URL"

 

upstream에서 dev 브랜치 pull

git pull upstream dev

 

1. Git 기본 명령어

 

- 디렉토리는 우리가 흔히 아는 폴더라고 생각하면 된다

 

$ pwd - 현재 위치의 경로가 나타난다.

 

$ ls - 현재 디렉토리에 어떤 파일이나 디렉터리가 있는지 확인

  • 파일과 디렉토리의 상세 정보까지 표시하는 옵션을 추가하려면 '-l' 을 추가로 입력한다.
  • 숨긴 파일과 디렉토리를 표시하려면 '-a' 를 추가 입력해준다.
  • '-la' 또는 '-al' 처럼 순서에 상관없이 글자를 붙여서 추가 입력해준다.

$ cd - 디렉토리 이동하기

  • $ cd .. 상위 디렉토리로 이동
  • $ cd Users Users 디렉토리로 이동
  • $ cd ~ 홈 디렉토리로 이동
  • $ cd / 루트 디렉토리 (시스템의 최상위 디렉토리)

$ rm test - test 디렉토리 삭제 

  • '-r' 옵션을 붙이면 디렉토리 안에 있는 하위 디텍도리와 파일까지 함께 삭제됩니다

 

$ git init - 깃 초기화 하기

  • $ mkdir처럼 현재 디렉토리 안에 하위 디렉토리를 만드는 과정없이 $ git init 명령만으로 현재 디렉토리에 깃을 사용할 수 있도록 디렉토리를 초기화하는 명령이다.
  •  이 명령어를 사용 후 $ ls -la 로 현재 디렉토리 안의 내용을 확인하면 처음과는 다르게 '.git'이라는 디렉토리가 생겨 있다. 이 디렉터리가 깃을 사용하면서 버전이 저장될 '저장소'이다.
  • '.git' 디렉토리는 감춰져 있다. 맥 Finder에서 디렉토리를 열었을 때 '.git' 디렉토리가 화면에 나타나지 않을 수도 있는데 사용자가 실수로 '.git' 디렉토리를 지우지 않도록 숨어 있기 때문이다.

$ touch [file_name] - 빈 파일 생성

 

$ cat [file_name] - 텍스트 형태의 파일 확인

 

$mv [file_or_dir] [target_dir] - 파일 및 디텍도리 옮기기

 

$cp [file] [target_dir], cp -r [folder] - 복사

 

 

2. Git으로 버전 관리하기

깃에서 버전을 만드는 3단계는 작업 트리, 스테이지, 저장소로 나눌수 있는데 여기서 스테이지와 저장소는 '.git' 디렉토리로 가상의 개념이라 처음에는 이해가 힘들 수 있다.

 

작업 트리 - 파일 수정, 저장 등의 작업을 하는 디렉토리 (우리 눈에 보이는 디렉토리)

스테이지 - 버전으로 만들 파일이 대기하는 곳 (스테이지 영역이라고 부르기도 함)

저장소 - 스테이지에서 대기하고 있던 파일들을 버전으로 만들어 저장하는 곳 ('리포지토리'와 '저장소' 라는 용어가 모두 사용)

 

파일을 수정하고 저장하면 그 파일은 작업 트리에 있게 됩니다. 그리고 수정한 파일을 버전으로 만들고 싶을 때 스테이지에 넣습니다. 파일 수정을 끝내고 스테이지에 다 넣었다면 깃에게 '커밋 명령'을 내립니다 커밋 명령을 내리면 새로운 버전이 생성되면서 스테이지에 대기하던 파일이 모두 저장소에 저장됩니다.

 

1. 디렉토리만 초기화한 상태로 $ git status 명령을 입력하면

 

On branch master : 현재 master 브랜치에 있습니다.

No commits yet : 아직 커밋할 파일이 없습니다.

nothing to commit : 현재 커밋할 파일이 없습니다.

 

라는 상태 메시지가 나타납니다.

 

2. 디렉토리안에 파일을 만들어 $ git status 명령을 입력하면 조금 다른 메시지가 나타나는데

 

untacked files : branch master에 untacked files이 있다. 깃에서는 아직 한번도 버전 관리하지 않은 파일을 untacked files라고 부릅니다.

 

3. $ git add - 수정한 파일을 스테이징하기

 

작업 트리에서 파일을 만들거나 수정했다면 스테이지에 수정한 파일을 추가합니다. 이렇게 깃에게 버전 만들 준비를 하라고 알려주는 것을 '스테이징' 이라 합니다.

 

$ git add 파일이름 명령 후에 $ git status 명령을 입력하면 untacked files이라는 문구가 changestobecommitted로 바뀝니다.

그리고 파일 이름 앞에 'new file' 이라는 수식어가 추가로 나타납니다.

 

git add .  - 모든 파일 스테이징

 

4. $ git commit - 스테이지에 올라온 파일 커밋

  • 한 칸 띄운 후에 '-m' 옵션을 붙이면 커밋과 함께 저장할 메시지를 적을 수 있습니다.

5. $ git log - 저장소에 저장된 버전을 확인할 때 사용

  • 커밋 해시 옆에 있는 (HEAD -> master) 은 이 버번이 가장 최신이라는 표시
  • 커밋과 관련된 파일까지 함께 살펴보려면 --star 옵션 추가
  • $ git log --oneline 한 줄에 한 커밋씩 나타내줍니다
  • $ git log --oneline --branches 각 브랜치의 커밋도 함께 볼 수 있습니다
  • $ git log --oneline --branches --graph 커밋과 커밋의 관계를 파악할 수 있습니다

 

6. $ git commit -am "message" - 스테이징과 커밋 한꺼번에 처리하기

  • 이 명령어는 한 번이라도 커밋한 적이 있는 파일을 다시 커밋할 때만 사용할 수 있습니다.
  • git commit -a -m "message" 라고 입력해도 됩니다.

7. $ git diff - 변경 사항 확인

  • 작업 트리에 있는 파일과 스테이지에 있는 파일을 비교하거나, 스테이지에 있는 파일과 저장소에 있는 최신 커밋을 비교해서 수정한 파일을 커밋하기 전에 검토할 수 있다.
  • '-'는 삭제 '+'는 추가되었다는 뜻

 

- tracked 파일과 untracked 파일

  • 한번도 커밋을 안했다면 $ git status 명령 시 untracked, 커밋한 적이 있다면 tracked

 

'Changes not stage for commit:' 이라는 메시지가 나타나면 파일이 수정만 된 modified 상태 (tracked 파일일 경우)

'Changes to be committed:' 라는 메시지가 나타나면 커밋 직전 단계, staged 단계

 

  • untracked, unmodified, modified, staged 상태를 통해 파일의 단계를 알 수 있다.

 

8. $ git checkout - 작업 트리에서 수정한 파일 되돌리기

  • $ git checkout -- 파일이름 바로 전에 수정한 내용이 사라집니다

9. $ git reset HEAD 파일이름 -  스테이징 되돌리기

  • 명령 시에 Unstaged changes after reset: 메시지가 나타나고 not staged 상태로 돌아갑니다.

10. $ git reset HEAD^ - 최신 커밋 되돌리기

  • 최신 커밋이 사라지고 커밋 전에 했던 스테이징도 함께 취소됩니다.
  • -- soft HEAD^ 최근 커밋을 하기 전 상태로 작업 트리를 되돌립니다
  • --hard HEAD^ 최근 커밋과 스테이징, 파일 수정을 하기 전 상태로 작업 트리를 되돌립니다.

11. $ git reset 커밋해시 - 특정 버전으로 되돌린 다음 그 이후 버전을 삭제

  • 특정 커밋을 리셋하는게 아니라 최근 커밋을 특정 커밋으로 리셋, 특정 커밋으로 이동하겠다는 의미

12. $ git revert - 커밋 삭제하지 않고 되돌리기

  • 나중에 사용할 것을 대비해서 커밋을 되돌리더라도 취소한 커밋을 남겨둬야 할 때 사용

 

3. branch

깃으로 버전 관리를 시작하면 기본적으로 master라는 브랜치가 만들어집니다. 사용자가 커밋할 때마다 master 브랜치는 최신 커밋을 가리킵니다. 기존에 저장한 파일을 master 브랜치에 그대로 유지하면서 기존 파일 내용을 수정하거나 새로운 기능을 구현할 파일을 만들 수 있습니다. 새 브랜치에서 원하는 작업을 다 끝냈다면 원래 master 브랜치에 합칠 수 있습니다. 이렇게 분기했던 브랜치를 합치는 것을 병합(merge)라고 합니다.

 

1. $ git branch apple 명령 입력시

  • git log 명령으로 커밋을 확인해보면 apple 브랜치가 추가되면서 (HAED->master,apple)로 바뀌어 있습니다.
  • 저장소에 master, apple 2개의 브랜치가 있고, HEAD->master이므로 현재 작업중인 브랜치는 master라는 의미

2. $ git checkout 브랜치이름 - 브랜치 사이 이동하기

  • git checkout apple 입력 시 $ 위에 나타난 파일 경로 끝에 (apple)이라고 표시가 됩니다.
  • 현재 브랜치가 apple 이라는 의미
  • git checkout -b 브랜치이름 : 생성과 동시에 이동

3. 브랜치 병합하기 (merge)

  • $ git merge 브랜치이름 master 브랜치에 특정 브랜치를 가져와 병합합니다.
  • $ git merge 브랜치이름 --no-edit 편집창을 열지 않고 깃에서 지정하는 커밋 메시지 그래도 사용
  • $ git merge 브랜치이름 --edit 편집창이 나타나지 않도록 설정 후, 커밋 메시지를 추가하거나 수정

4. 같은 문서의 같은 위치를 수정했을 때 병합하기 (충돌)

 

CONFLICT (content) : merge conflict in work.txt

Automatic merge failed; fix xonflicts and then commit the result

 

병합시에 위의 메시지가 뜬다면 충돌이 발생했다는 뜻

 

충돌이 생긴 문서는 자동으로 병할될 수 없으므로 사용자가 직접 충돌 부분을 해결한 후 커밋해야 한다.

 

'<<<<<<<HEAD'와 가운데 가로줄(========) 사이의 내용은 현재 브랜치, 즉 master 브랜치에서 수정한 내용

가로줄(========)과 '>>>>>>> o2' 사이의 내용은 o2 브랜치에서 수정한 내용

 

내용을 원하는대로 수정한 후에 문서에 나타나있던 '<<<<<<<HEAD', 가로줄(========), '>>>>>>> o2' 은 삭제합니다.

 

수정한 파일을 스테이지에 올리고 커밋하면 됩니다.

 

5. $ git branch -d 브랜치이름 - 특정 브랜치를 삭제합니다

  • 이 브랜치는 완전히 지워지는 것이 아니라 다시 같은 이름의 브랜치를 만들면 예전 내용을 다시 볼 수 있습니다.

6. 브랜치가 여러 개일때는 현재 브랜치가 아닌 다른 브랜치에 있는 커밋을 골라서 최신 커밋으로 지정할 수 있습니다.

  • $ git reset 커밋해시 커밋해시의 브랜치의 파일로 이동하면서 이전 브랜치가 원래 가르키고 있던 커밋은 연결이 끊기면서 삭제됩니다.

 

7. $ git stash - 수정 중인 파일 감추기 및 되돌리기

  • 파일이 tracked 상태여야 합니다. (한번은 커밋한 상태)
  • 가장 최근에 보관한 것이 stash@{0}에 담깁니다.
  • $ git stash pop 명령으로 stash 목록에서 가장 최근 항목을 되돌립니다.
  • stash 목록에 저장된 수정 내용을 나중에 또 사용할지도 모른다면 git stash apply 명령을 사용합니다. stash 목록에서 가장 최근 항목을 되돌리지만 저장했던 내용은 그대로 남겨둡니다.
  • git stash drop 명령은 stash 목록에서 가장 최근 항목을 삭제합니다

댓글