SW
[Git] 버전관리 본문
0. Git
- Git을 사용할 수 있는 여러 프로그램들이 있다.
- SourceTree, TortoiseGit, Github Desktop 등이 있다.
- 그 중에 명령어를 이용해서 Git을 제어하는 방법에 대해서 알아보자.
- 이 방법에 익숙해지면 복잡한 GUI 없이 간편하게 Git을 다룰 수 있다.
- 명령어 특성상 한번에 명령해서 자동화가 가능하다.
- GUI로 제어할 수 없는 서버에서도 제어할 수 있는 유일한 방법이기 때문에 많이 쓰인다.
1. 설치
- 아래 홈페이지에서 다운로드한다.
- https://git-scm.com/
2. 버전관리의 시작
- 원하는 위치에 폴더를 만든다. 그 폴더로 이동한다.
- git init : initialize repository
- git init . 이라는 명령을 통하여 초기화시킨다.
- 그러면 .git 이라는 디렉토리가 생성된다.
- .git : git repository
3. 버전 만들기
- 우리가 하려는 것은 파일의 변경사항들을 버전으로 만들어 관리 하는 것이다.
- Working tree : 버전으로 만들어지기 전 단계
- Staging Area : 예를들어 버전으로 만드려고 할 때 파일이 10개 있을 때 2개만 하나의 버전으로 만들고 싶다면 그 2개의 파일만 Staging Area에 올린다. 그 후 Git에게 버전을 만들라고 명령하면 Git 은 Staging Area에 있는 2개의 파일만 Repository에 저장한다.
- Repository(저장소) : 버전이 저장되어 있는 곳
- Working tree -> Staging Area -> Repository
- 정리
- git init : Initialize repository
- .git : git repository
- git status : working tree status
- git add : add to staging area
- git commit : create version
- git log : show version
- 위 이미지의 설명을 덧붙이자면,
- nano hello1.txt : 새로운 파일 생성
- cat hello1.txt : hello1.txt의 내용을 화면에 보여줌
- git status : Working tree 상태를 보여줌
- git add hello1.txt : hello1.txt 를 Staging Area에 추가함
- git commit -m "Message 1" : 버전을 생성하고 "Message 1" 이라는 메세지를 기록함
- git log : 버전을 보여주며 그 화면에서는 q를 누르고 나옴
- hello1.txt에 내용을 추가해보겠다.(내용 추가 후 나올 때 Ctrl+x -> y -> Enter 순으로 누르면 됨)
- 정리
- Working tree는 수정한 내용이 들어있다. 수정한 내용들 중 commit 하고 싶은 것들을
- Staging Area 에 올린다. Staging Area에서 commit을 하면 변경사항들이
- Repository에 저장된다.
4. 여러개의 파일을 버전으로 만들기
- hello1.txt 파일을 수정하고 hello2.txt 파일을 하나 더 만들었다.
- 두개의 파일 모두 stage area위에 있지 않다는 공통점이 있다.
- 차이점은 다음과 같다. hello1.txt는 한번이라도 버전관리를 한적이 있기 때문에 기억하고 있다. hello2.txt의 존재는 알지 못한다. 백업하고 싶지 않은 파일은 Untracked files로 그냥 둘 수 있다.
- git log 를 하면 버전별로 어떤 파일이 연관되어 있는지 모른다 -> git log --stat 이라는 명령어를 사용
5. 버전간의 차이점 비교
- git diff : Show changes
- hello1.txt에 four 라는 문자를 추가해보면 다음과 같이 변경 목록을 보여준다.
- git diff는 add하기 전에 실행해야 결과를 볼 수 있다.
- git reset --hard 전 버전으로 reset 해준다.
- git log -p (patch) 바뀐 내용까지 보여줌.
6. checkout과 시간여행
- 이전 버전으로 돌아가고 싶다면 HEAD가 가리키는 것을 바꿔야한다.
- git log 를 실행하면 다음과 같은 화면이 뜬다.
- 이전 버전으로 돌아가고 싶다면 을 통해 commit 뒤에 있는 문자열을 복사해서
- git checkout [문자열] 을 실행하면 된다.
- git log 을 실행시켜보면 다음과 같이 나타난다.
- git checkout master 명령어를 실행시키면 가장 최신 상태로 다시 돌아온다.
7. 추가 설명
- git add . : 현재 디렉토리에 있는 모든 파일을 add 시켜준다. 파일하나하나 지정해줄필요 없다.
- git commit -am "Message" : add와 commit을 한번에 실시한다. 그러나 어떤 파일에 대해서 최초로 add할 때는 git add명령어를 실시해줘야한다.
- git commit 을 실행하면 에디터가 나오면서 메세지를 추가하면된다.
- 에디터를 바꾸고 싶다면 바꿀수 있다. 검색해서 해결 가능.
- git config --global core.editor "nano" : nano 로 바꿈
- git config --global core.editor "vim" : vim 으로 바꿈
8. 삭제 - git reset
- git reset --hard [버전문자열] : "[버전]을 reset 하겠다"가 아니라 "[버전]으로 reset 하겠다" 이다.
- --hard 는 가장 강력하게 지우는 것이다. 버전과 수정하던 것까지 다 지우는 것이다.
- --soft 는 버전은 지우고 수정하던 것은 두는 것이다.
9. 되돌리기 - git revert
- hello1.txt에 R3을 추가 하고 commit 후 R4 추가 하고 commit 한후 작업해보겠다.
- R4를 지우고 R3이 되고 싶다면,
- git reset [버전]을 하면 [버전]으로 간다.
- R4를 되돌려야지만 R3로 갈 수 있다. R3로 가려면 R4가 필요하다.
- git revert [R4의 버전스트링] 을 하면 다시 R3로 다시 돌아온다.
- 반드시 역순으로 revert 를 해야한다. 그래야 충돌이 일어나지 않는다.
- git revert 는 그 전버전의 변화만을 되돌리는 것이기 때문이다. 역순을 건너뛰어서 실행시키면 충돌이 일어난다.
- 결론적으로 reset은 시계를 다시 맞추듯 이력을 그 당시로 되돌리는 것이고, revert는 이전 이력은 그대로 두고, 되돌릴 커밋의 코드만 원복시킨다.
- 아래 사이트는 reset과 revert의 차이를 잘 나타낸 만화이다.
- http://www.devpools.kr/2017/01/31/%EA%B0%9C%EB%B0%9C%EB%B0%94%EB%B3%B4%EB%93%A4-1%ED%99%94-git-back-to-the-future/
10. 추가로 알면 좋을 것들
- 버전관리의 핵심은 비교이다.
- diff tool 이라는 것을 검색해보면 좋은 도구들이 많다. 차이점을 보다 정교하게 비교할 수 있다.
- 버전관리를 안할 파일에 대해서는 .gitignore이라는 파일을 만들어서 무시하고 싶은 파일들의 이름을 적으면 된다.
- branch는 우리의 저장소를 여러가지 상태로 공존할 수 있게 해준다. 예를 들어, 보고서를 작성하고 보고서를 기반으로 각각회사마다 수정해서 제공해야 한다면 저장소 전체를 복사해서 디렉토리를 만든 후 각각 작업하려 할것이다. 그러나 branch 를 사용하면 저장소의 이름을 더럽히지 않고 하나의 저장소에서 다양한 작업을 진행할 수 있다.
- 각각의 버전을 식별하는 식별자로 commit id 가 사용되는데 이것은 기억하기 쉽지 않다. 그럴때는 tag를 이용하여 이해하기 쉬운 이름을 붙인다.
- git은 backup도 가능하다. backup 을 할 줄 알면 협업이라는 기능도 알게 될 것이다.
11. Github
'대학교 > etc' 카테고리의 다른 글
VSCode HTML 태그 자동완성이 안될 때 (32) | 2020.02.06 |
---|---|
스마트폰 앱 만들기 (0) | 2020.02.05 |
웹사이트 만든 후 인터넷에 공개하는 방법 (0) | 2020.02.05 |
Anaconda [zsh] (0) | 2020.02.02 |
기술 정리 (0) | 2020.02.01 |
Comments