22. 환경파일의 관리


데이터 베이스 접속 인증 ID 패스워드 같은 내용이 들어있는 파일이 환경파일이다.

1. 일단 2개의 파일을 만들자


index.php


<?php

  include 'password.php';

  mysql_connect($id, $password);//mysql ID PASSWORD

 ?>


password.php


<?php

$id = 'gakari';

$password = '111111'

 ?>


여기서 설정 파일은 password.php 된다.


2. password.php 버전관리에서 제외해야 한다는 의미이다. 이를 위해 password.php 파일을 ignore 해주자.


3. 아래와 같이 Ignore exact filename(s) 누른다.


4. 그리고 커밋 한다.



5. 다음 Push 해서 원격 저장소로 데이터를 올리자.



6. exnode1_clone으로 이동 Pull 해서 데이터를 가져와보자.



OK 누른다.


7. 다음 프로젝트 폴더로 가면 password.php 파일이 없는 것을 있다.




8. 그래서 여기에서는 password.php파일을 직접 만든 코딩을 해야된다.



9. 이런 불편함을 없애기 위해서는 다음과 같이 하면 된다. 먼저 exnode1.에서 password.php파일을 복사하고

 password_template.php파일을 만든다. 이때 id password 값은 삭제해야한다.



10. 다음 커밋 한다.


11. 다른 작업자들은 template 파일을 보고 자신의 환경에 맞는 아이디와 패스워드를 입력해서 password.php 파일을 만들어서 사용하면 된다.



출처 : https://opentutorials.org/course/1492

 


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

21. 버전관리에서 제외하기(.gitignore)


프로젝트 버전관리를 필요가 없는 파일들을 설정해보자.


1. 먼저 프로젝트에서 쓸모없는 파일을 만들자.



2. 쓸모 없는 파일을 오른쪽 클릭 Ignore 누른다.





3. 여기서 Ignore exact filename(s) 파일 이름이 같으면 무시한다는 의미이다.



Ignore all files with this extension 확장자가 .txt파일을 무시한다.


4. 두번째 라디오 버튼을 선택하고 OK 누르면 다음과 같이 .gitignore 파일이 생긴다.

*.txt 확장자가 txt 모든 파일을 무시한다는 의미이다.


5. 상태에서 커밋을 한다. 그러면 모든 저장소에서 txt파일은 버전관리를 무시하게 된다.



6. 한가지 팁을 주면 .gitignore.io 가보자








7. 이클립스와 자바개발환경에서 ignore할만한 것을 찾고 싶다면 아래와 같이 eclipse 자바를 치고 generate 누른다.



8. 생성된 파일을 복사해서 .gitignore 파일에 붙여넣기를 해주면 된다. 그다음 커밋을 하면된다.



출처 : https://opentutorials.org/course/1492


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

20.  Tag(태그)


여러 가지 버전들이 생겼을 버전들 안에서 의미있는 버전 , 최종 버전 같은 것을 기록하는 것을 태그라고 한다.


1. 태그를 지정한 버전을 선택한 오른쪽 마우스 버튼을 눌러서 tag 클릭하자




2. Tag Name 작성한 Add Tag 누른다.



3. 다음과 같이 입력한 태그가 기록 된다.



4. 만약 브랜치를 생성할 다음과 같이 Specified commit 태그명을 넣어주고 브랜치를 생성하면.


5. 만든 브랜치는 태그에 해당하는 버전을 가지게 된다.



6. 만약 원격 저장소로 푸쉬를 하면 태그는 푸쉬가 되지 않는다. Push 아래 Push all tags 체크하고 Push 해야 모든 태그가 원격 저장소로 올라가게 된다.



7. 깃헙으로 가서 releases 가보면 다음과 같이 태그가 추가된 것을 확인 있다.



출처 : https://opentutorials.org/course/1492


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

18.  비교, 병합 외부 도구 연결


충돌이 났을 수정을 하는데 도와주는 소프트웨어를 diff 한다.


diff 프로그램은 다음 링크에 가보면 있다.


http://en.wikipedia.org/wiki/Comparison_of_file_comparison_tools



이중 유료지만 강력한 툴인 Beyond compare 툴을 사용해본다(30 무료)


1. http://www.scootersoftware.com/ 방문해서 다운받아서 설치한다.







2. 설치가 끝난 소스 트리의 다음 경로로 간다. Tools -> Options(윈도우 기준)



3. Diff탭으로 다음과 같이 세팅을 한다.


4. 비교할 파일을 선택한 Actions -> External Diff 누른다.



5. 다음과 같이 프로그램이 뜨면서 차이점을 알려준다.




6. 그러면 충돌의 상황에서 외부도구를 사용해서 충돌을 해결하는 법을 알아보자.


먼저 실험4 브랜치를 만들자.



7. 실험4 브랜치에서 index.html파일에서 다음과 같이 충돌을 만들기 위해 파일을 수정한다.




8. 이번에는 master 브랜치에서 파일을 수정해보자.

먼저 master 브랜치로 이동


파일을 수정한다.


9. 다음과 같이 master 브랜치도 커밋을 완료했다.



10. 이제 병합을 해서 충돌을 만들기 위해 다음과 같은 버튼을 누르자

Merge 실험4 into current branch







11. 예상대로 충돌이 발생한 것을 있다.



12. 충돌이 발생한 파일에서 오른쪽 버튼을 누르고 Resolve Conflicts -> Launch External Merge Tool 누르면






13. 다음과 같이 Beyond compare 툴이 실행 된다.



14. 윗부분에 파일이 3개가 있는데 파일의 의미는 다음과 같다.


 BASE 파일은 공통의 소스이다.

 LOCAL 현재 수정한 브랜치 master 브랜치이다.


REMOTE 실험4에서 수정한 브랜치이다.



15. 3 파일중에 다음의 화살표를 누르면 그것이 최종 버전이 되는 것이다.


 


16. 직접 수정하고 싶으면 아래 파일에서 수정 저장을 하면 된다.



17. 저장 나오게 되면 다음과 같이 Mark resolved 자동으로 수행되게 된다.

그리고 index.html.orig 파일이 생성되는데 파일은 병합전에 백업 파일로써 필요없으면 지워도 된다.




18. 다음과 같이 병합이 정상적으로 것을 있다.



출처 : https://opentutorials.org/course/1492

 


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

17.  충돌의 해결


충돌은 서로 같은 소스 부분을 수정해서 발생하는 현상이다.


1. 일부러 충돌을 만들기 위해서 exnode1에서 충돌을 작업을 한다.



그리고 커밋을 해둔다.


2. 그다음 exnode1_clone에서 충돌을 만들기 위해 동일한 위치의 소스를 수정 PULL 커밋을 하면 다음과 같이 충돌이 발생한다.



3. exnode_clone으로 가보면 충돌 부분을 있다.

index.html 파일


4. 그러면 소스를 수정해서 충돌을 해결하자.



5. index.html에서 오른쪽 버튼을 누르고 Resolve Conflicts -> Mark Resolved 누른다.



6. 다음 창이 뜨면 Ok 누른다.



7. 다음과 같이 충돌이 해결된 상태로 된다.



8. 그리고 바로 커밋을 해주자. 그러면 다음과 같이 병합이 것을 있다.


9. 여기서 알아야 것은 마지막에 올리는 사람이 충돌을 해결해야 한다는 것을 있다.

여기서 소스를 어떻게 수정해야 모르면 당사자한테 찾아가서 물어봐라


출처 : https://opentutorials.org/course/1492


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

16.  Push & Pull 협업의 기술


간단한 요점 : pull -> work -> commit -> pull -> push


지금 프로젝트는 PC에서 2개의 저장소를 돌리고 있지만 2명이 각각 다른 PC에서 커밋을 한다고 가정을 한다.

다음 화면에서 exnode1 컴퓨터 1이고 exnode1_clone 컴퓨터 2에서 작업을 하는 것이다.


1. 먼저 exnode1 저장소에서 소스를 수정 commit 해보자.

여기서 origin/master 원격저장소를 의미한다. 원격저장도 버전도 최신버전으로 업데이트 되었다.


* 혹시 이렇게 안되있다면 반드시 PUSH버튼을 눌러서 최신버전으로 업데이트를 해야한다.



2. 이제 다른 사람이 exnode1_clone에서 작업을 한다고 하면


먼저 PULL 해서 원격 저장소에 있는 내용을 로컬 저장소로 가져와야 한다.( 자신의 로컬 저장소를 최신으로 업데이트 한다는 의미이다.)

 Pull버튼을 눌러주자

3. 여기서 Ok 누른다.



4. 아래와 같이 exnode1컴퓨터에서 작업한 내용을 그대로 가져왔음을 있다.


5. 이번에는 exnode1_clone에서 작업을 하고 commit 해보자


6. 다음과 같이 커밋이 되었고 origin/master 최신임을 있다.



7. 한번 exnode1에서 작업을 해보자. 먼저 Pull 해서 최신상태를 가져와야 한다.


만약 Pull 한다면 다음과 같은 에러가 뜬다. 반드시 Pull부터 해야함을 잊지말자



8. exnode1_clone Pull 안하고 바로 Push 했을 경우

이전에는 다음과 같았지만

아래와 같이 그래프가 2개로 나눠진 것을 있다.(뭔가 버전이 다르다는 의미이다.)


9. 결론적으로 반드시 다음의 순서로 해야한다.


PULL -> 작업 -> COMMIT -> PULL(이전 시간 동안 누가 작업했을지도 모르니까) -> PUSH


10. exnode2_clone에서 다시 PULL 해서 가져온 PUSH 하면 다음과 같이 그래프가 하나로 합쳐져서 지금의 상태가 최신이 됬음을 있다.



출처 : https://opentutorials.org/course/1492


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

14. Github 이용하여 원격 저장소로 업로드하기


1. 먼저 master branch에서 커밋을 하나 해본다.


2. 다음 깃헙으로 가보면 다음과 같이 커밋이 자동으로 동기화됨을 있다. 이번 시간은 여기까지 이다.

                   

15. 원격 저장소 복제하기


1. 먼저 로컬 저장소를 하나 만들기 위해 다음 버튼을 누른다.




2. 원격 저장소를 로컬 저장소로 복제하는 것이므로 Clone repository 통해서 복제해온다.


3. 깃헙으로 다음 복제하고자 하는 repository HTTPS 주소를 복사한다.


4. 아래와 같이 URL 붙여넣기 하고 로컬저장소 경로를 설정한 clone 누른다.



5. 완료됬다는 메시지를 확인 한다.




6. 다음과 같이 clone repository 생긴 것을 확인할 있다.



출처 : https://opentutorials.org/course/1492


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

12. 원격 저장소의 종류


1) GitHub - 오픈소스에 한해서 무료, private일 경우 유료. https://github.com/

2) GitLab - (https://about.gitlab.com/)
저장소 제한없음. Unlimited Private Collaborators. 약간 불안정한 기억?!,
내 서버에서도 설치할 수 있는 기능 제공.

13. Github 이용하여 원격 저장소 만들기


먼저 https://github.com/ 홈페이지에 접속 회원 가입을 한다.

1. New repository 클릭

2. Repository name 정하고 Create repository 클릭한다.



3. 다음 원격 저장소와 로컬 저장소를 연결해보자. Repository에서 Add Remote 클릭한다.


4. 다음과 같이 Repository Settings 뜬다. 여기서 원격 저장소를 세팅 있다.



5. Add 누르고 아까 깃헙에서 만든 Repository 주소를 따온다.




6.  URL/Path 넣고 기본 저장소라는 의미의 Default remote 클릭 OK 버튼을 누른다.


7. origin 생겼고 OK 버튼을 누른다.



8. 다음 부분이 생겼다.



9. Push버튼을 누르면 로컬 저장소의 내용을 원격 저장소로 복제한다.




10. 다음과 같이 창이 뜨면 업로드 하려고 하는 브랜치를 선택한다.



11. 그러면 다음과 같이 깃헙의 ID PASSWORD 넣으라는 화면이 나온다.






12. 이제 다시 깃헙으로 가보면 다음과 같이 Push 것을 있다.



13.  commits 클릭하면 다음과 같이 지금까지 작업한 내용들이 나온다.



출처 : https://opentutorials.org/course/1492


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

11. Branch 충돌의 최소화 방법


브랜치 변경이 아무 많을 경우 충돌은 불가피하다. 하지만 이것을 일일히 삭제하는 또한 불가능에 가깝다. 이를 최소화 하는 방법에 대해서 알아보자


브랜치 실험 3 먼저 만들자.



다음 Master 브랜치로 이동 내용을 수정한다.



이후 커밋을 한다.



다음 Master 브랜치에 있는 내용을 실험 3 옮긴 작업을 한다. 실험 3 옮긴 다음의 Merge master into current branch 클릭한다.







다음과 같이 master 내용이 실험3으로 복사됬다.


실험 3에서 작업을 커밋을 한다.




master 이동한 커밋을 한다.(충돌이 발생할 있게 해야한다.)



다음 실험3으로 와서 작업을 하기 전에 마스터에 있는 내용을 병합을 한다. 물론 충돌이 것이다.



충돌이 났다.


소스를 보면 충돌이 것을 있다. 여기서 의문점이 드는 것은 당연하다. 어차피 충돌나는 것은 똑같은게 아닌가?


근데 이렇게 작은 충돌을 자주 해결해가는 것이 나중에 한꺼번에 많은 충돌을 해결하는 것보단 쉽다는 것을 의미한다.



다음과 같이 필요한 부분을 가져와서 처리했다.



소스 수정후 Resolve Conflicts 하려니까 Resolve Using ‘Mine’ Resolve Using ‘Theirs’ 보인다.

Resolve Using ‘Mine’ : 현재 브랜치에 있는 내용을 선택해서 충돌을 해결한다는 .

                                        master 브랜치의 내용이 삭제된다.

Resolve Using ‘Theirs’ : master 브랜치에 있는 내용을 선택해서 충돌을 해결한다는 .

                                        실험3 브랜치의 내용이 삭제된다.



우린 이미 충돌을 소스수정을 통해서 해결했으므로 Mark Resolved 선택한다.



다음과 같이 커밋을 완료한다.






마지막으로 실험3에서 작업을 또한 커밋을 하고



실험3 마지막 작업 커밋 완료



이제 실험3에서 작업이 끝났으므로 master branch 돌아와서 실험 3 작업을 병합해야한다.



실험3 master 병합하였다.



결론적으로 말하자면

다음과 같이 실험3 branch master branch 내용을 자주 병합함으로써 충돌을 최소화 있다는 것이다. (한번에 모든 것을 바꾸는 것은 무리다...)


(출처 : 생활코딩 git 강의)


출처 : https://opentutorials.org/course/2136


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

10. Branch 충돌 해결


브랜치간에 같은 부분을 수정하면 충돌이 발생하게 된다.


충돌 상황을 만들기 위해 실험2 브랜치를 만든다.


다음과 같이 수정후 commit 한다.

실험 2 커밋한다.

이번에는 마스터 브랜치로 이동해서 index.html 다음과 같이 수정하자. 실험2 동일한 위치에 있는 내용을 수정하게 된다.



커밋을 한다.


상태에서 병합을 시도해보자. 다음 Merge 실험2 into current branch 누른다.


다음의 창은 ok 누르고


다음 병합하는 과정에서 충돌이 발생했다는 메시지가 뜬다. 그래서 close 누른다.


다시 index.html소스로 되돌아가보면 뭔가 소스가 이상하게 바뀌었다.



====기준으로 <<<< HEAD master 브랜치를 의미하고 ====뒤쪽 >>>>>.실험2 실험2 브랜치에 있었던 내용을 의미 한다.

여기서 필요한 부분만 삭제하고 다시 저장한 다시 깃으로 돌아가보면 다음과 같이 느낌표 표시가 난다.



느낌표가 파일에서 오른쪽 버튼을 누르면 Resolve Conflicts 메뉴에서 Mark Resolved 누르면

사용자가 충돌을 해결했다고 깃에게 알리게 된다.

누르면 다음메뉴에서 OK 누른다.


다음과 같이 Staged files에서 보면 느김표가 사라지고 ...으로 되었다.


커밋으로 가면 자동적으로 충돌을 해결한 것에 대한 내용이 자동으로 작성된다.






이로써 충돌이 해결되었고 커밋 또한 완료 되었다.



출처 : https://opentutorials.org/course/1492

 


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git
생활코딩 Git 정리 – Branch 합치기


9. Branch 합치기


이번에는 실험 브랜치를 master 브랜치로 합쳐보자


먼저 master 브랜치를 변경해둔뒤


Merge 실험 into current branch 클릭한다.


합친 다음과 같이 Merge branch실험이 생긴다.



출처 : https://opentutorials.org/course/1492

 


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git
8. Branch 나누기
브랜치란 독립적으로 어떤 작업을 하기 위한 개념이다. 각각의 브랜치는 다른 브랜치에 영향을
주지 않기 때문에 여러 작업을 동시에 진행할 수 있다.
그리고 이렇게 만들어진 브랜치는 다른 브랜치와 병합해서 작업한 내용을 하나의 브랜치로 모을
수 있다.
브랜치를 만들기 위해서 Branch 버튼을 누른다.

브랜치명을 쓰고 Create Branch를 누른다

실험 브랜치가 추가 됬다. 앞에 동그라미가 있어야 마스터 브랜치가 된다.

그리고 마스터에서 일상적인 작업을 3번 커밋해보자(현재 master가 마스터 브랜치이다)

그 후 실험 브랜치를 더블클릭해보면 아까 추가했던 일상적인 작업 커밋들이 없어진 상태가 된다.

그 다음 실험적인 작업을 1번 커밋해보자 그 후 그래프를 보면
브랜치가 2개로 갈린다. 한 개의 부모에서 2개로 갈라짐을 알 수 있다.

여기서 다시 master를 더블클릭하면 일상적인 작업을 한 것으로 돌아감을 알 수 있다.
(이때 유의할점을 브랜치를 변경할 때 반드시 변경사항은 커밋한 상태여야한다.)


출처 : https://opentutorials.org/course/1492

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

7. Revert(Reverse commit) 사용법

commit 상태를 삭제하지않고 바로 이전상태로 돌아가고 싶다면 Reverse commit 사용하면 된다.


다음과 같이 Revert 수정 추가2 뜨고 body tag 추가 상태로 되돌아간다.


다음 아래를 보면 – readme –복사본.txt 것을 있다.

한번 Revert 하면 body tag 추가가 취소되서 index.html 파일 수정함으로 돌아갈 있다.

주의 해야 점은 Revert 반드시 순차적으로 취소해야한다. 순차적으로 하지않으면 Confilct 발생할 있다.


출처 : https://opentutorials.org/course/1492


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

6. 되돌리기(Reset)

다음 body tag추가로 돌아가고 이후 커밋한 것들을 모두 삭제하고 싶다면?

Reset current branch to this commit 클릭후

Hard – discard all working copy changes 클릭하고 OK 누르면


body tag 추가 상태로 돌아가고 이후 상태들은 모두 삭제된다.

여기서 Mixed – keep working copy but reset index 제가 하던 작업은(uncommit 작업) 유지하면서 master 위치를 옮기는 것이다.

다시 말해서 해당 버전 이후에 적용되었던 것과 변경사항은 모두 합쳐져서 변경사항이 된다.



출처 : https://opentutorials.org/course/1492


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

5. 커밋전에 수정사항 취소하기

다음과 같이 readme.txt 수정 이전 최종 커밋상태로 되돌리고 싶다면?


파일에서 오른쪽 클릭 Discard 누른다


팝업에서 ok 누르면


다음과 같이 이전상태로 돌아갔음을 있다.


출처 : https://opentutorials.org/course/1492


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

4. 한개만 커밋해보기

아래에서 readme.txt앞쪽 노란색 ... 이미 커밋이 파일중에 수정된 파일을 의미하고

? 아직 커밋이 되지 않은 파일을 의미한다.



파일을 클릭하면 위와 같이 수정된 부분이 출력된다.



만약 다음과 같이 2개만 선택 커밋을 하면 다음과 같이 된다.



그러면 다음과 같이 나머지는 커밋되지 않은 상태로 바뀐다.


여기서 Unstaged fileds에서 파일을 선택하는 것을 working copy라고 하고


Unstaged files에서 staged files 옮기는 것을 add라고 한다.


그리고 다음의 공간을 repository(저장소)라고 부른다.



readme.txt add 상태에서 수정을 하게되면 다음과 같이 readme.txt 곳에 존재한다.

상태에서 커밋하면 staged files 있는 readme.txt 커밋된다.


출처 : https://opentutorials.org/course/1492


블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

3. 버전 만들기(commit)

stage all버튼을 눌러서 수정된 작업을 위로 올리고 commit 누른다

 


tool에서 options 가면 다음과 같은 화면이 있다.


 


Full name 이메일 주소가 커밋하는 자신의 이름과 이메일주소이다.


다음과 같이 뜨는것이 바로 commit 작업이다.

 



만약 소스를 수정하는 작업을 했다면 다음과 같이 uncommited changes라는 내용이 뜬다.


 


다음과 같이 수정된 파일이 나온다.

 




그럼 다시 commit 해보자. 다음 버튼을 눌러서 staged files 올리고


 


File Status 탭을 누르고 글을 써준 commit 버튼을 눌러보자


 


그럼 다음과 같이 또하나의 버전이 생긴 것을 있다.


 


한번 반복하면 다음과 같이 3개가 된다.


 


출처 : https://opentutorials.org/course/1492

 
블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

2. 저장소 만들기 (init)

- Add repository 클릭

 

- Create New Repository 클릭 후 아래와 같이 폴더 선택 및 프로젝트명을 작성한다

 

다음과 같이 화면이 나온다

 

 

출처 : https://opentutorials.org/course/1492

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git

1. Git 설치하기

 

https://git-scm.com에서 설치파일을 다운로드 받는다.

 

다음과 같이 세팅후 쭉 NEXT를 누른다

 

 

 

 

 

설치 후 Git Bash 프로그램을 실행시켜본다. 그리고 git 명령어를 쳐서 다음과 같이 나오면 설치에 성공한 것이다.

 

 

그 다음 GUI환경에서 GIT을 제어하기위해서 SourceTree를 설치한다.

https://www.sourcetreeapp.com에 접속해서 설치파일을 다운 받는다.

 

소스트리 설치하기


쭉 Next를 눌러준다.

 

이런게 뜨면 계속을 누른다.

 

회원가입을 해주고 Use an existing account를 눌러준다

 

로그인 후 실행 화면

 

 

출처 : https://opentutorials.org/course/1492

블로그 이미지

가카리

소프트웨어와 하드웨어 프로그래밍, 취업 및 직장생활 전문 블로그

Tag git