이번 포스팅에서는 브랜치들 간 차이점을 비교하는 방법에 대해 소개하고자 합니다.

먼저 현재 상태부터 보여드리고, 실습을 통해 명령어들에 대해 알아가보도록 하겠습니다.


 현재 상태 확인.

현재 상태는 branch가 master, example1, example2가 있으며 master에서 log는 위와 같습니다.

그리고 example1 브랜치에서 상태는 다음과 같다.

위와 같이 master 브랜치에서 git log 명령어를 하면 example1 브랜치에서 commit했던 'add bbbbb.txt' log를 볼 수 없다.

그럼 어떻게하면 한 브랜치에서 다른 모든 브랜치들의 log나, 다른 한 브랜치와 비교하거나, 코드를 비교할 수 있을까?

이제부터 위에 대한 방법을 하나씩 알아가보도록 하자.


1. 모든 Branch의 commit 정보 확인하기 : git log --branches

git log --branches  명령어를 사용하면  현재 어느 브랜치에 있던 모든 브랜치들의 commit 상태를 확인할 수 있다.

(현재 master에 있지만 example1 브랜치가 commit한 'add bbbbb.txt'가 뜨는 것을 볼 수 있다.)

여기에서 다음과 같이 oneline 옵션을 통해 조금 더 간략히 볼 수 있다. 



2. 두 브랜치간 비교하기 : git log '비교할 브랜치1' '비교할 브랜치2'

< git log master example1 >

위의 명령어를 통해서 master과 example1 브랜치간 차이점을 확인 할 수 있다.

그럼 두 브랜치간 코드비교는 어떻게 할까?


3. 두 브랜치간 코드 비교하기 : git diff '비교할 브랜치1' '비교할 브랜치2'

위와 같이 git diff 로 브랜치간 코드를 비교할 수 있는데. 'bbbbb.txt' 파일이 새로 생성되고 내용은 초록색 글씨로 된

'bbbbb'인 것을 확인 할 수 있다.


 이번 포스팅은 Git의 최대 장점이라고 들리는(?) Branch를 알아보고 실습을 해보도록 하겠습니다.



 1. Branch란?

 개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생긴다. 코드를 통째로 복사하고 나서 원래 코드와는 상관없이 독립적으로 개발을 진행할 수 있는데, 이렇게 독립적으로 개발하는 것이 브랜치다.

 실습을 해보면서 어떻게 사용하는 것인지 보도록 하겠습니다.



 2. 실습해보기.


1) 초기 상태.

branch를 추가하지 않은 초기의 모습을 먼저 보겠습니다.

git branch를 입력하게되면 branch의 목록이 나오고, 현재 어느 branch인지 보여줍니다.

git은 저장소를 만들면 기본적으로 'master'라는 이름의 branch를 만들어줍니다. 따라서 위에 보이는 master 브랜치는 자동으로 생성된 branch입니다.



2) 'git branch 브랜치이름' : branch를 생성하는 명령어

실습을 해보기 위해 'example1'이라는 branch를 생성했습니다.

그리고 git branch 를 입력해서 보면 현재 branch가 'example1', 'master' 이렇게 2개가 된 것을 확인할 수 있습니다.



3) 'git branch -d 브랜치이름' : 브랜치이름에 해당하는 branch를 삭제하는 명령어

  'example1','master' 브랜치가 있는 상태에서 'example1' 브랜치를 삭제해보았습니다.

삭제 후 'git branch' 명령어를 통해 브랜치를 보면 'master'브랜치만 남은 것이 보입니다.



4) 'git checkout 전환하려는 브랜치 이름' : 브랜치를 전환하는 명령어

'master' 브랜치에서 'example1'으로 브랜치를 전환해보았습니다.

master에 있던 *가  example1으로 이동한 것을 볼 수 있습니다. 이것은 현재 브랜치가 'example1'이라는 것을 의미합니다.



5) 'git checkout -b 생성하고 변환하려는 브랜치 이름' : branch를 생성함과 동시에 전환하는 명령어

git checkout에 -b 옵션을 주게되면 브랜치를 생성하고 전환까지 하게 됩니다.

즉, git branch 브랜치명 → git checkout 브랜치명  : 이 과정은 'git checkout -b 브랜치명'  하는 것과 같습니다.



6) branch 전환해서 작업해보고 무슨 차이가 있는지 알아보기

 <master 브랜치에서 상태 >

현재 branch는 master, example1, example2 가 있고, aaaaa.txt라는 파일이 있습니다.

git log도 위와같이 볼 수 있습니다.

 이제 example1 브랜치로 전환해서 bbbbb.txt라는 파일을 생성하고, commit까지 해보겠습니다.

 < example1 브랜치에서의 상태 >

example1 브랜치로 전환해서 bbbbb.txt 파일을 생성하고 commit까지 한 상태입니다.

여기서 브랜치를 다시 master로 전환하면 example1 브랜치에서 생성했던 bbbbb.txt파일과 log는 어떻게 바뀔까요?

결론을 먼저 말씀드리자면, master브랜치로 다시 전환하면 bbbbb.txt파일은 없어지고, 'add bbbbb.txt'라는 commit 로그도 없어집니다.


 < example1 -> master branch로 전환 후 모습 >

위의 화면을 보시면 브랜치를  example1 -> master로 변경하고, 현재 디렉토리의 파일, git log를 볼 수 있습니다.

다시 master -> example1 으로 브랜치를 변경하고 파일의 상태와, log를 보고 포스팅을 마무리 짓겠습니다.

< master -> example1 으로 branch 다시 전환 후 모습 >

이것을 통해 branch는 각각 독립된 저장소라고 생각 할 수있습니다. 




코딩을 하다보면 로직이나 구조 등을 변경할 일이 생깁니다. 변경하다가 난관에 부딪혀 이전 버전으로 돌아가고싶다면 어떻게해야할까요? 

 오늘은 위와같은 상황이나 여러가지 상황에서 이전의 버전으로 돌아가는 방법에 대해 공부하겠습니다.



1. git reset 

 git reset은 원하는 version으로 돌아가는 명령입니다.

위는 현재 git log를 보여줍니다.

여기에서 만약 "Version 3까지 완료된 상태로 돌아가고 싶다"="Version 4,5는 날려버리고 싶다"고 한다면

<  git reset --hard 버전id  > 를 입력하면 됩니다. 이를 입력하고 난 후의 모습을 보겠습니다.

버전id는 사진의 commit 우측에 숫자와 영어로된 긴 문자열입니다.

↑ : Version 3으로 돌아가기위해 사용한 명령. (reset 뒤에 hard 옵션이 붙은 것에 대해선 추후에 포스팅 예정입니다.)

git reset을 사용해서 Version 3로 돌아간 후의 git log입니다.

위를 보면 Version 3로 돌아간 것을 알 수 있습니다.

 



2. git revert

 git revert는 버전id의 커밋을 취소한 내용을 새로운 버전으로 만드는 명령입니다.


git reset 후에 남은 version 1,2,3의 상태에서 version 2로 revert 하는 작업 후의 log입니다.

위를 보면 "git revert는 원하는 버전으로 코드 상태는 돌아가지만 기존의 git log 상태에서 새로운 커밋이 생기는 것" 으로 볼 수 있습니다.



정리.

 1. git reset은 원하는 버전으로 돌아감과 동시에 후에 생긴 작업들의 log를 모두 날린다.

 2. git revert는 원하는 버전으로 돌아가고, 그것을 새로운 version으로 추가한다.



이번 시간에는 git log, git diff  명령어를 통해 변경사항을 확인하는 방법을 알아보겠습니다.



먼저 본론으로 들어가기 전에 한가지 알아두고 가도록 하겠습니다.

git log를 보면 위와같이 commit  ~~~~를 볼 수 있습니다.

여기서 commit 우측부분(7f46bddd~)"이 commit에 대한 고유한 주소 (=commit id)" 입니다.


1) git log -p

git log에 -p 옵션을 주게되면 코드의 변경사항을 볼 수 있습니다. (아래Version과 위Version 간의 차이를 볼 수 있음.)

위 그림은 현재 git log -p를 보여주는 것이고, 이제 아래에서부터 하나하나씩 파헤쳐가보도록 하겠습니다.





1-1) 제일 처음에 commit했던 "Version 1"입니다.

여기에서 --- /dev/null  , +++ b/test.c 는  null이었다가 test.c가 됬다는 뜻입니다.

 따라서 test.c가 생성되었다고 볼 수 있습니다.

그리고 아래 초록색 코드는 새로 추가된 코드입니다.

test.c가 생성되어 commit한 것이므로 모두 새로운 코드입니다.





1-2) 두번째로 commit한 내역입니다.

여기에서 commit message는 "Fix test.c" 라는 것을 알 수 있습니다.

아래쪽을 보면 소스코드가 나오고, 초록색 글자로 된 코드가 새로 추가된 코드임을 알 수 있습니다.



(그 다음부터는 똑같은 내용이므로 생략하겠습니다. )




2) git diff : 두 버전의 소스코드 차이를 볼 수 있습니다.

 사용방법 : git diff (commit고유주소1 commit고유주소2)

 만약 위와같이 고유주소를 넣어서 차이점을 보지않고,

git diff를 입력하면 현재 변경된 코드를 볼 수 있습니다. 

따라서 git diff를 통해 commit을 하기전에 변경된 부분을 한번 확인하고 commit할 수 있습니다.





결론.

 1)git log에서 commit 우측에 있는 숫자와 알파벳은 해당 commit에 대한 고유주소이다.

 2)git log에서 -p옵션을 추가하면 버전마다 변경된 부분을 볼 수 있다.

 3)git diff를 통해 버전 간 코드 차이나 현재 변경된 코드 부분을 볼 수 있다.


Git 설치 ( https://git-scm.com/ )

위의 사이트에서 아래의 사진과 같이 Download를 누르고 다운받으면 된다.






다운을 받고 'git bash'를 실행시켜보자.

git bash를 실행시키고, 'git'을 입력하면 사용할 수 있는 명령어들이 다음과 같이 나온다.


이 명령어들은 차근차근 알아보도록 할 것이다.
그리고 먼저 할 작업은 git으로 관리할 디렉토리를 먼저 생성하겠다.


1) git으로 버전 관리를 할 디렉토리를 생성(이미 프로젝트 폴더가 있으면 그 위치로 이동하면 됨)


저는 위와 같이 Documents 디렉토리 내부에 gitStudy라는 디렉토리를 생성했습니다




2) 'git init'


 git init을 하게되면 .git 디렉토리가 생성된다. 

Git init은 뭘까?

- '현재 디렉토리에 작업을 진행하겠다'라고 Git에게 알려주는 것. 현재 디렉토리를 git의 버전 저장소로 만드는 것.

- init을 하게되면 .git 디렉토리가 생성되고 .git 내부에는 버전 관리하면서 생기는 정보가 저장된다. .git을 지우면 마지막 소스코드는 남아있지만 버전에 대한 정보는 다 지워진다.



3) 관리할(추적할) file생성과 'git status'

 'test.c' 파일을 생성하고, 'git status'를 입력해 보았습니다.


git status를 입력하게되면 위와 같이 뜨게됩니다.
'Untracked files : test.c' 라고 되어있는 것을 볼 수 있습니다.  이 것은 "git이 test.c에 대한 버전 관리를 하고 있지 않다" 라고 볼 수 있습니다. 
따라서 이 test.c 파일을 git에게 관리하도록 요청해보겠습니다.

 ※ git status : 현재 저장소의 상태를 확인하는 명령어 






4) 'git add'


 git에게 test.c 를 관리하도록 하기 위해 git add test.c 를 해줍니다.
그리고 git의 상태를 보기위해 git status를 입력해보면
위와 같이 test.c가 새로운 파일이라는 것을 git이 인식하게 되고 이제 추적하도록 하는 것이다.

git add란?
 - git에게 파일을 추적하도록 명령하는 것.
 - 새로 만든 파일에 대한 추적, 수정된 파일을 관리하기 위한 추적 모두 add 명령어를 사용한다.
 


 commit를 하기전에
git config --global user.name "자신의 닉네임"
git config --global user.email "자신의 이메일"
 을 입력해서 버전에 포함될 버전을 만든 사람에 대한 정보를 설정해줍니다. 이 설정은 ~/.gitconfig 파일에 저장 되고 1번만 해주면 됩니다.


5) git version 만들기 = 'git commit'

git version을 만들어보겠습니다.

git version을 만드려면 git commit 명령어를 사용하면 됩니다.
아래와 같이 git commit를 해보겠습니다. 
그리고 현재 버전이 잘 만들어 졌는지 확인을 하기위해 'git log'를 하게되면 다음과 같은 정보가 나오는 것을 확인 할 수 있습니다.  (언제, 누가  commit 했는지가 commit message와 함께 나오는 것을 확인)


 저는 -m 옵션으로 commit message를 입력했지만
git commit만 입력해서 commit message를 입력 할 수 있습니다.


 1~2년간 풀어온 알고리즘 문제를 Github에 저장해오고 있었는데, 얼마전 포멧하고 다시 세팅하는 과정에서

repository를 다 날려 먹었다. (push가 안되서 Stackoverflow에서 글은 읽지않고 명령어만 따라쳤음...)

BOJ, SWExpert 등 합쳐서 600~700개의 코드 파일을 날리고 나니까 Git에 대해 잘 모르고 

쓰고 있었다는 것을 알았다. ( commit, pull, push 밖에 사용하지 않았기때문...)

따라서 오늘부터 Git에 대해 기본적인 것부터 공부하려고한다. 완전 파헤쳐보기 보단 필요한 개념들만 알아가보도록 하자.




Git이란?

- Git은 버전 관리 시스템이다.

예를 들면, 우리가 긴 레포트나 논문을 쓸 때, 한글 파일을  '201102448_사명기_미완성' -> '201102448_사명기_수정완료'

 -> '201102448_사명기_진짜마지막'  이런식으로 여러 Version들로 저장하는 경우가 있다. 

Git은 이런 경우에 하나의 파일만 만들고 변경사항만 저장, 관리하는 기능을 한다.


- Git은 버전 관리 외에도 Backup, Recovery, Collaboration 기능을 한다.

 Backup : 소스코드를 백업해서 만약의 사태에 대비할 수 있다.

 Recovery : 소스코드를 이전 상태(Version)으로 쉽게 돌아갈 수 있다.

 Collaboration : 다른사람과 협업 할 수 잇다.




버전 관리란?

- 버전 관리 시스템은 파일의 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템이다.

 위의 Git 설명 예에서 레포트나 논문 작업을 완료하고 나서 '201102448_사명기_미완성'인 Version을 다시 꺼내 올 수 있다는 것이다.

- 버전 관리는 로컬 버전관리, 중앙집중식 버전관리, 분산 버전 관리 시스템이 있지만, 필자는 Git의 시스템인 '분산 버전 관리 시스템'만 소개하려고 한다.



분산 버전 관리 시스템 

  분산 버전 관리 시스템은 각 개발자가 중앙 서버에 접속하지 않은 상태에서도 코드 작업을 할 수 있다.

클라이언트가 원격 저장소 파일의 마지막 스냅샷을 가져오는 것이 아니라 저장소를 히스토리와 더불어 전부 복제한다. 서버에 문제가 생기면 이 복제물로 다시 작업을 시작할 수 있다. 클라이언트 중에서 아무거나 골라도 서버를 복원할 수 있다.

추후에 git의 작동원리에 대해 자세히 다룰 예정입니다.


Git? Github? 뭐가 다른거지?

- Git은 위에서 말한대로 '버전 관리 시스템'이다. 

  Github는 Git 버전 관리 시스템을 위해 원격 저장소를 제공하는 git호스팅 서비스이다. 




 다음 글에서는 Window에서 Git 설치와 실습을 해보겠습니다!



+ Recent posts