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

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


 현재 상태 확인.

현재 상태는 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는 각각 독립된 저장소라고 생각 할 수있습니다. 




이번 포스팅은 git을 좀 더 편리하게 사용하도록 해주는 명령어의 옵션을 보는 방법과 자주 사용되는 옵션을 살펴보겠습니다.




1. 옵션을 보기위한 방법 : --help

 'git 명령어를 사용하는데 옵션이 뭐가 있는지 모르겠다','옵션을 어떻게 쓰는지 까먹었다' 이런 경우 등 옵션이 궁금한 경우가 생기기 마련입니다.

이런 경우 --help를 사용해서 볼 수 있습니다.

예를들어 

 git commit이 무엇인지, 어떤 옵션이 있는지 궁금하다 ▶ 'git commit --help' 

 git add가 무엇인지, 어떤 옵션이 있는지 궁금하다 ▶ 'git add --help'


'git commit --help'를 보게되면 위와같은 내용이 나오고 아래에 'git commit'에 대한 서술, 옵션이 나오게됩니다.

이것을 읽어보면 사용방법, 옵션들에 대해 알 수 있습니다.



 

 2. git commit의 Option을 살펴보고 사용해보기.

1) git commit -a 

 -a 옵션을 추가하면 Git은 Tracked 상태의 파일을 자동으로 Stage area에 넣는다. 즉, -a옵션을 사용하면 해당 디렉토리의 수정된 파일을 모두 자동으로 add하고 commit하는 것이다.

a옵션을 사용한 예를 보도록 하겠습니다.

 


새로운 파일을 만들어  -a 옵션을 사용해서 commit 하였습니다.

 a옵션을 사용해서 commit후 log(와 status)를 보면 commit이 잘 된 것을 확인 할 수 있습니다.





      -a 옵션을 사용하면 편한 점도 있지만, 선택적으로 add를 해서 commit을 하는 것이 아니므로 주의해서 사용하도록 하는게 좋을 것 같습니다.


2) git commit -m

기본적으로 git commit만 할 경우 vi가 켜지고 커밋메시지를 입력해야한다. 

하지만 vi가 켜져서 입력하고 저장하고 하는게 commit을 많이 하다보면 여간 귀찮은게 아니다. 

따라서 이런 작업 없이 commit message를 commit할때 바로 option으로 입력하는 것이 -m 옵션이다.

사용방법은 git commit -m "Add cal function" 이런식으로 커밋 메시지와 함께 commit을 하면 된다.

예를 보면서 확인해보겠습니다.


 

 mOption이라는 c파일을 생성후 add를 해줍니다.

 그리고 commit할때 -m 옵션을 사용해서 commit message를 입력해주고 log를 보면

다음과 같이 옵션 뒤에 썼던 내용이 log에서 커밋메시지로 보여지는 것을 확인 할 수 있습니다.










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

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



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를 통해 버전 간 코드 차이나 현재 변경된 코드 부분을 볼 수 있다.


지난 글에 이어서 여러가지 실습을 해보면서 사용법을 익히도록 해봅시다.

1) Git설치.

2) Git으로 버전관리 할 디렉토리인 'git Study'를 생성

3) 'git Study' 디렉토리 내에서 'git init' 명령어를 통해 이 디렉토리가 git으로 관리됨을 선언

4) 'git Study' 디렉토리 내에서 'test.c'라는 파일을 만들고, add, commit 해보기.

여기까지가 지난 글에 했던 작업입니다.

이번 글은 add와 commit에 대한 좀 더 자세한 사용법에 대한 실습을 하겠습니다.




오늘 실습을 하기전에 먼저 commit을 하려면 add를 먼저 해야된다는 것을 알아야합니다.

그리고 여러 파일에 대해 git add를 하고 commit를 하게되면 add한 파일이 한꺼번에 commit됩니다. (즉, 한꺼번에 commit했으므로 이전 Version으로 돌아가려면 add한 파일들 모두 다 이전 Version으로 돌아갑니다.)

그러므로 각 파일에 대해 따로 버전관리를 하려면

git add test.c    -> git commit

git add test2.c   -> git commit

이런식으로 각각 따로 add와 commit을 해 줘야합니다.

이해하기 어려웠다면 실습을 통해 보여드리겠습니다.



git add,commit에 대해 좀 더 자세히 소개하고자

현재 디렉토리 내에 'test.c' 파일을 수정하였고, 'test2.c' 파일을 추가적으로 생성하였습니다.


1)  'git status' , 'git log'  

< test.c가 변경되었다는 것과 test2.c가 추적되고있지 않다는 status를 볼 수 있습니다>

<현재 Version 1까지 commit된 것을 확인할 수 있습니다.(version1은 test.c를 commit하고 test.c를 수정하기 전>


2) git add test.c -> git add test2.c  -> git commit

<현재 상태>

위의 상태에서 git add test.c  , git add test2.c 를 하고 git commit를 해보겠습니다.

즉, 두 파일을 add하고 한꺼번에 commit하는 것입니다.

두 파일을 add하고 commit하니까 새로운 Version2가 '1개' 생긴 것을 볼 수 있습니다.

이것은 'add한 파일들이 같이 버전 갱신이 된다'입니다.

만약 test.c에 대해 Version1으로 돌아가고싶다 -> test2.c도 test.c와 같이 commit 했으므로 test2.c는 commit되지 않은 상태로 돌아가는 것입니다.

Version1으로 되돌린 후 디렉토리 모습입니다.

Version1은 test2.c가 없고 test.c가 수정되기 전 버전이므로 이 버전으로 돌아가는 것입니다.

(이전으로 돌리는 방법은 추후에 포스팅 할 예정입니다)


3) git add test.c -> git commit -> git add test2.c -> git commit

<현재 상태>

위의 상태에서 git add test.c -> git commit -> git add test2.c -> git commit을 해보도록 하겠습니다.

test.c를 수정했으므로 commit message를 'Fix test.c'로 하였고, test2.c를 추가했으므로 'Add test2.c'로 하였습니다.

이렇게 되면 'Fix test.c'의 상태로 돌아가도 test.c까지 commit된 것은 남아있고 test2.c가 commit 된 내용만 삭제.

이렇게 각 파일을 따로 add와 commit을 하게되면 좀더 확실히 버전 관리를 할 수 있습니다.


결론 : git add를 통해 commit할 파일을 선택할 수 있다.


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