기타/WWW

Git 간단 사용법

하늘이푸른오늘 2016. 4. 11. 00:36

이 글은 예전에도 관심은 있었지만 포기하고 있다가, 그래도 한번 배워야지 싶어서 며칠 들여다보고, 제 마음대로 정리한 글입니다.


왜 사용해야 하나?

Git은 소스관리 도구입니다. 물론 프로그램 소스 뿐만 아니라, 텍스트형식이라면 뭐든지 추적관리할 수 있습니다. Git을 사용하면 파일을의 변화를 모두 기록합니다. 따라서 언제든지 돌릴 수 있습니다. 따라서 거의 필수적이라고 생각합니다. 특히, 클라우드 저장소인 GitHub.com 와 함께사용하면 언제든 접근할 수 있고, 다른 사람들과 협업 가능해서 활용도가 높습니다.


혼자서도 필요한가? 

저는 아주 간단히 제가 필요한 프로그램을 가끔 개발합니다. 개발한다고 하기도 민망할 수준입니다. 그래도 Git이 필요한가... 라고 고민을 해봤는데, 아직 완벽하게 이해하지 못했지만, 소스관리 목적만으로도 충분히 활용할 가치가 있다고 생각합니다. 회사와 집, 그리고 노트북과 PC를 왔다갔다 하면서 개발한다면 GitHub와 같이 이용하면 좋을 것 같습니다.


아래는 제가 필요한 만큼만 정리한 겁니다. 그래서 첫번째 부분은 혼자, 하나의 기기로 개발하는 경우 (GitHub를 사용할 필요없이) 필요한 명렁어들만 정리했습니다. 두번째 부분은 역시 혼자 개발하지만, 여러 곳, 여러기기로 개발할 때 필요한 명령어들을 정리했습니다.


Git을 혼자서 사용


원한다면 Git을 혼자서 로칼에서만 작업할 수도 있다. 

    • Git 도구를 다운로드 받기
    • 초기 설정
      • 원하는 곳에 디렉토리 만들기
      • git init : 로칼 저장소가 만들어짐. 
      • git config --global user.name "Your Name Here"
      • git config --global user.email  "Your Email here"
    • 파일 보관하는 방법
      • git add <files> : 관리하기 원하는 파일을 stage(index)에 추가. 
      • git commit -m "message" : add로 추가된 파일들을 로칼 저장소(local repository)에 추가함. 이때 이유를 "message"에 명확히 담아줄 것
      • .gitignore에 추가하면 관리하고 싶지 않은 파일(*.o, *.bak 등)이 표시되는 것을 막을 수 있다.
    • 기타 자주 사용하는 명령어
      • git status -s 짧게
      • git diff : 수정했지만, staged 가 아닌 파일을 비교가능
        • git diff --cached : staged 된 파일과, commit된 파일을 비교
      • git log : commit 한 내용들 보여줌
        • git log -p : diff 도 함께 보여줌
        • git log --oneline : 한줄에 하나씩만
      • git show [hash-value]
    • 기타 필요한 명령어
      • git commit --amend : 바로전 commit을 수정. 메시지 수정 혹은 파일 추가 등등 비슷한 내용을 계속 commit 할 때, commit 숫자를 늘릴 필요 없이 바로전 commit을 수정해줌.
      • git reset HEAD --<file명> : staged 되어 있는 파일을 제외시킬 때
      • git checkout -- <file명> : 파일의 변경을 취소하고, 바로 전 commit 상태로 되돌림
      • git config --global alias.unstage 'reset HEAD --' : unstage라는 alias로 만듦. git unstage <file명>


여러 기기에서 사용할 때. 원격 저장소가 필요


    • GitHub에 원격저장소(remote repository) 만들기. 디렉토리명과 같도록 하는 것이 좋음
    • 원격저장소(remote repository)에 처음으로 저장하기
      • GitHub에 원격저장소 생성
      • 원격저장소의 주소 복사
      • git remote add origin [원격저장소 주소]
      • git push origin master : 현재까지 로칼 저장소에 저장된 내용을 원격저장소에 보관함
    • 다른 기기에서 원격저장소로부터  최초로 받아오기
      • mkdir [directory 명]
      • GitHub에서 원격저장소의 주소 복사
      • git clone [원격저장소 주소]
    • 일상 작업
      • git pull : 다른 기기에서 작업하여 원격저장소에 저장된 내용을 가져와서 Merge함
      • .... git add / commit : 기타 작업 수행 
      • git push origin master
    • remote의 상태보기
      • git remote -v
      • git remote show

Branch로 작업할 때. 


계속 수정중인 경우, master는 그대로 두고, branch를 만들어 단위작업을 수행. 완료되면 master와 합침. 수정작업을 branch로 분리하여 수행하면 여러가지 변경을 독립적으로 진행할 수 있어 좋음.

    • git branch [branch-name] : 현재 사용중인 branch를 가르키는 새로운 branch 생성
    • git checkout [branch-name] : 해당 branch로 이동. 그러면 현재 directory의 파일들이 바뀜
      • 그 다음엔 일상적인 작업을 하면 원래의 branch와 새로운 branch에 각각 따로 저장됨
      • 완전히 이상없음을 확인하면 merge하면 됨
        • git branch master -> git merge [branch-name]
      • 완료하기 전에 다른 작업이 필요하면 master branch로 돌아가 필요한 부분에서 새로운 branch를 생성하여 완료하고 다시 예전 branch로 돌아가 작업하면 됨. 완료된 후 merge.
      • merge 후 필요 없는 branch는 git branch -d [branch-name] 명령으로 삭제
    • 확인하는 방법
      • git log --oneline --decorate --graph --all
    • 충돌 발생시 처리. 
      • 각각의 branch에서 동일한 파일/위치를 편집하고 merge하면 충돌 발생

      user@user-PC MINGW64 ~/GIT/git-training (master)

      $ git merge testbranch

      Auto-merging test.txt

      CONFLICT (content): Merge conflict in test.txt

      Automatic merge failed; fix conflicts and then commit the result.

      • 이 상황에서 충돌이 발생한 파일(test.txt)을 열어보면 아래와 같이 충돌난 부분이 보임

      <<<<<<< HEAD

      This change is for master branch. Different from "testbranch"'s version

      =======

      Changed again for branch test.

      >>>>>>> testbranch

      • <<<< 부터 >>>> 까지를 편집하여 정리함
      • 완료 된 후, git commit 명령을 사용하면 두 개의 branch  merge 작업이 완료됨
    • 처리 순서
      • 로컬에서 git checkout master 명령으로 master 브랜치로 이동
      • git merge [branch name] 명령으로 브랜치를 합침
      • git push origin [branch name] 명령으로 gitHub로 송부
      • git branch -d [branch name] 명령으로 브랜치를 삭제
      • 그 다음 gitHub에 접속
        • [branch name] 브랜치에 들어감
        • Pull request 수행
        • Pull request 를 Merge 함.
    • 기타 명령
      • git branch --merge 를 하면 merge가 된 branch가 보임. *가 없는 branch는 삭제
      • git branch --no-merge


=====

1. 시작. 전반적인 개념.

    • https://rogerdudler.github.io/git-guide/index.ko.html
    • 잘 사용하려면 여기에 있는 내용을 어느 정도 이해할 수 있어야 함.
    • 하지만, 이해하기 쉽지 않음. 뭘 배워야 하는지 미리 파악하기 위함.
    • 맨 아래쪽에 안내서들 목록이 있음.

2. 기본적인 Git 사용법.

      • 일련의 설명과 함께 가장 기본적인 사용법
      • 맨 아래에 Resource 가 있음.

3. 심화 학습이 필요하다면

4. Permission denied(publickey) 에러에 대한 대처

    • 사용자의 ssh가 등록되지 않아서 발생하는 문제
    • 이 에러가 발생하면 push, clone 등이 불가능함
5. 좀 더 읽어 봐야 할 글
    • http://tmondev.blog.me/220759303637