해리의 데브로그

Django 02 - MTV Pattern, 템플릿 변수, Variable Routing

|

Django 기본 Process (MTV Pattern)

1. urls.py - url 패턴 정의

  • urlpatterns 라는 리스트안에 주소를 하나하나씩 쌓아 넣음.
    • 첫번째 인자: URL 주소를 입력
    • 두번째 인자: 해당 URL 주소로 요청이 들어올 때 views.py 내 연결할 함수를 입력함. 이 함수는 어플리케이션 폴더 내 views.py에 작성되어있으므로 import 해와야함 예) from pages import views

아래 코드에서 입력한 내용의 의미는 다음과 같다. index/ 라는 url로 요청이 들어온, 두번째 인자의 내용에 따라, views.py 내 index 함수를 실행함. views.py이 함수를 통해 return 되는 값을 반환하는데, 그 결과 값은 index.html을 render 하는 것임

from django.contrib import admin
from django.urls import path
from pages import views

urlpatterns = [
    path('index/', views.index),
    path('admin/', admin.site.urls),
]

2. views.py - 함수 정의

  • urls.py를 통해 정의된 urlpattern에 따라, 요청이 들어오면 어떤 것을 반환할건지에 대한 기본 로직을 작성하는 파일임. 함수로 정의되며, 함수의 인자로 request를 받음
  • 함수 render첫번째 인자로 request를 넘겨주고, 어떠한 html 을 보여줄건지를 설정함.
  • return 으로 반환되는 render 함수의 첫 번째 인자 request는 위 index 함수의 첫번째 인자와 동일함.
from django.shortcuts import render

def index(request):
    return render(request, 'index.html')

3. Template - 웹 페이지(html) 구현

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <h1>Index입니다!</h1>
</body>
</html>

Summary

  1. url.py에서 url의 pattern을 정의함. 사용자 또는 정해진 코드에 따라 특정 url이 요청되면, 정의된 url pattern에 따라 views.py내 특정 함수를 호출함.
  2. views.py 내에서 함수를 작성하여, 작성된 함수에 따라 return 값을 줌. 일반적으로는 render & redirect 함수를 이요하여 특정 html을 호출거나 다른 웹페이지로 연결시킴.
  3. render 된 html 파일을 열어서 사용자에게 보여줌


템플릿 변수

HTML 문서에 views.py 내 정의한 변수를 넘기는 것을 템플릿 변수라고 함.

예시로, 저녁 메뉴를 random으로 뽑혀서 보여주는 페이지를 생성해보자.

  • urls.py
    • 페이지를 접근하는 주소를 urls.py에 생성.
    • “기본주소/dinner” 이라는 url 주소를 사용자가 호출(요청;request)하면 views 폴더 내 dinner 함수가 실행됨.
from django.contrib import admin
from django.urls import path
from pages import views

urlpatterns = [
    path('dinner/', views.dinner),
    path('admin/', admin.site.urls),
]
  • view.py
    • random 함수를 쓰기 위해 함수를 import 해움
    • random,.choice의 결과 값을 pick 이라는 변수에 저장하여, render 의 3번째 인자로 넘김
    • Django에서는 템플릿변수를 넘길때, 딕셔너리의 형태로 넘겨야함.
      • 'dinner' : Dictkey 이며, 이 값이 html 문서로 넘김
      • 딕셔너리에서 key를 호출하면 value값이 반환되는 파이썬 문법의 매커니즘을 사용함.
from django.shortcuts import render
import random

def dinner(request):
    menu = ["족발","햄버거","치킨","초밥"]
    pick = random.choice(menu)
    return render(request, 'dinner.html', {'dinner': pick})    
  • dinner.html
    • 템플릿 변수를 html 파일에서 사용할 때는 반드시 이중 중괄호로 감싸줘야함.
    • views.py에서 지정한 render 함수의 3번째 인자 {'dinner': pick} 에서 key 값인 dinner를 이중 중괄호안에 넣으면, dictvalue값인 pick이 반환됨.
    • pickrandom.choice의 결과값이 저장된 변수임
<!-- 중략 -->
<body>
    <h1>오늘 저녁은 </h1>
</body>
<!-- 변수는 반드시 이중 중괄호로 감싸 줄 것! 변수는 의 형태임 -->


Variable routing

URL 주소자체를 변수로 사용하는것을 의미함. URL 주소로 들어오는 값을 변수로 지정하여, views.py 내 함수의 인자로 넘겨줌. 변수값에 따라 다른 페이지를 연결 시킬 수 있음.

  • urls.py
    • 페이지를 접근하는 주소를 urls.py에 생성.
    • 기본적으로 < > 의 형태로 variable routing을 정의함
      • <str:name> 은 자료의 형태를 string(문자열)으로 제한한다는 의미임.
      • <> 내 변수가 views.py 내 함수의 인자로 할당됨
    • 예를들어, 기본주소/hello/harry 와 같은 예시의 주소를 요청하면, name 변수의 값으로 harry가 할당되며, 이 값을 views.py 및 render 되는 html 파일에서 사용 할 수 있게 됨.
urlpatterns = [
    path('hello/<str:name>/', views.hello),
    path('admin/', admin.site.urls),
]
  • view.py
    • variable routing으로 할당된 변수를 인자로 넘기고, 그 인자가 다시 템플릿 변수로 사용함.
    • 여기서 템플릿 변수를 정의하는 render함수의 3번째 인자 {'name' : name} 를 유심히 살펴보자
      • key : html 파일에서 사용하는 변수 명
      • value : variable routing으로 들어오는, 제 주소창에 입력되는 hello/<str:name> 의 name이다 (hello함수의 2번째 인자)
def hello(request, name):
    return render(request, 'hello.html', {'name': name})
  • hello.html
<body>
    <h1>안녕, !</h1>
</body>

190211_TIL

|


방과후 집으로 돌아와 하루종일 github 블로그를 만지며 삽질을 거듭했는데, 그 중 아래의 2가지 문제점을 해결하느라 정말 고생했다.

코드박스 길이 & 블로그 Body space 문제

마크다운 - 코드박스에 작성된 내용이 길 경우, 블로그의 Body 공간이 초과되어 코드블럭 하단에 스크롤바가 생겨버렸다. body 부분의 space를 조절하는 css 파일을 찾는데 엄청난 시간이 소비 되었다.

  • github내에 다른 분들의 코드를 참조해서 이것저것 수정하여 다행히 고쳤긴한데.. 실제로 어떤 코드로 인해서 그부분이 수정되었는지 아직까지 감이 안온다.
  • 이 블로그는 codinfox 템플릿을 사용했는데, 이 테마를 사용한 유저나 개발자 분들이 많지 않아, 관련 정보를 찾는데 더 고생을 한 것 같다.
  • jekyll 템플릿에 대해 공부를 해야하겠다는 것이 절실히 느껴졌다.

jekyll 로컬 서버 실행 오류

(jekyll 3.8.5 Error: incompatible character encodings: CP949 and UTF- 8)

  • 어제, Typora로 작성한 Markdown을 블로그에 올렸을 때, Markdown style이 제대로 되지 않아 하나하나를 수정 & 커밋을 하는, 굉장히 비효율적인 과정을 겪었었다. 그래서 commit을 하기 전에 jekyll 로컬 서버로 업데이트된 화면을 실시간으로 보고 싶었으나 인코딩에러가 발생하였다.
  • 구글링을 통해 여러가지 해결방법이 있는걸 발견했지만 어떠한 방법도 나에겐 도움이 되지않았다 ㅠ
    1. _config.yml 파일에 UTF-8 인코딩 추가
    2. Ruby command prompt에서 서버 실행 전 “chcp 65001” 코드 입력
    3. Ruby 가 설치된 디렉토리 내 sass 파일에 “Encoding.default_external = Encoding.find(‘utf-8’)” 추가
  • 정말로 몇시간동안 삽질을 하다가 결국 윈도우에 저장된 사용자 계정 이름이 한글로 되어 있는 것이 문제라는 것을 알게 되었다. 게다가 한번 설정된 사용자 계정 이름은 변경되어도 컴퓨터 내 폴더 명은 변경되지 않았다.
  • 결국, 원격 저장소를 C드라이브에서 다시 clone하여 문제점을 해결하였다.. 윈도우에서 사용자 계정이름은 절대 한글로 지정하지 말자..

Github blog를 운영하는 것이 티스토리나 네이버 블로그에 비해 정말 많은 어려움이 있다는 것을 뼈저리 느끼고 있지만, 여기서 포기 하지 말고 하나하나직접 부딪히며 삽질하다보면 언젠가 빛을 볼 날이 오지 않을까 싶다.

수업시간에 배운 Django에 대한 필기노트를 정리하여 블로그에 포스팅을 하고 오늘을 마무리 해야겠다.

Django 01 - Introduction, 동작원리, 기본설정

|

What is Django?

  • Static Web : HTML & CSS 등으로만 구성된 정말 단순한 웹서비스
    • 이문서를 주세요 라고 요청하면, 어떠한 변형, 연산등도 없이, 단순히 문서를 보냄(응답). 서버의 파일이 도서관의 책처럼 적재되어 있고 클라이언트의 요청을 통해서해당 파일을 마치 책을 보는 것처럼 꺼 내 올 수만 있는 웹 서비스.
  • Dynamic Web(Web Application program)
    • Static Web과 상반되는 개념. 동적으로파일을 생성하여 뿌려주는 Web. 장고는 Dynamic web이라고 하는 내부적으로 연산도 가능하고, 사용자의 인풋마다 다른 아웃풋을 보여주는 동적웹임.

  • 웹 앱(웹 서비스) 를 만드는 것은 카페를 만드는 것과 매우 유사
    • 카페 창업의 두가지 방법
      • A-Z 모두 직접하기 “홍보 마케팅. 대출 점포인테리어, 레시피개발, 원자재 거래처 확보, 매출정산”
      • 프렌차이즈 창업 “ 기본적인 레시피나 필요한 재료는 알아서 제공해줄게. 넌 좋은 카페 만드는데 집중해!”
    • 웹서비스 제작의 두가지 방법
      • URL Parsing, DB setting, ORM, Security, Content Management Template, Caching, Web Server Settting
      • 웹 프레임워크 사용 “기본적인 구조나 필요한 코드들은 알아서 제공해줄게. 넌 그냥 좋은 웹 서비스 만드는데 집중해!” ex) Express JS, Ruby on Rails, Python django, JAVA Spring, PHP Laravel
  • 이미 다 차려놓은것에서 필요한 것만 가져다 쓰면 되기 때문에 편리함. 많은 웹사이트가 웹프레임워크 - 장고를 기반으로 제작이 되어있음 (인스타그램, NASA, 모질라, 빗버켓)

Django의 동작 원리(구조)

  • Django의 구조
    • Model (데이터 관리)
    • Template(사용자가 보는 화면)
    • View(중간 관리자)
  • Django의 동작 원리
    • 사용자가 1번 강의를 보겠다고 요청을 보냄 (URL 주소 입력)
    • View (중간관리자)는 받은 요청을 확인하고, Model (데이터 관리)에 1번강의를 찾아달라고 지시를 내림.
    • Model (데이터 관리)은 Database에서 1번 강의를 찾아서 View (중간관리자)에 전달
    • View (중간관리자)는 1번강의를 Template에 전달하여, HTML 파일과 조합하여 화면을 사용자에게 전달

    => django는 MTV Pattern으로 구조화 되어 있음.

구조 데이터 관리 사용자가 보는 화면 중간 관리자
Standard Model Template View
Django Model View Controller
  • C9 에 git ignore 설정하기
    • https://github.com/github/gitignore/blob/master/Python.gitignore
    • 해당 github의 파일을 raw 로 열어서 최상위 폴더 내에 .gitignore 이라는 이름으로 파일 생성 후 내용 붙임.

Django 기본 설정하기

Django 기본 설정은 cloud 기반의 웹서버를 대여해주는 c9 을 기반으로 작성되었습니다. Django를 사용하는 환경에 따라 기본 설정 방식이 조금씩 다를 수 있습니다.

1. 파이썬 가상환경 생성

#intro-venv 라는 가상환경 생성
$ pyenv virtualenv 3.6.7 intro-venv

#가상환경으로 만들고자 하는 디렉토리 접속 후 명령어 입력
$ pyenv local intro-venv

2. 장고 설치 및 프로젝트/어플리케이션 생성

  • pip install django : 장고 설치
  • django-admin startproject intro .
    • intro 라는 프로젝트를 장고 내에 생성
    • . 을 입력하면, 현재 디렉토리에 어플리케이션을 생성함.
  • python manage.py runserver $IP:$PORT : 서버실행
$ python manage.py runserver $IP:$PORT
Performing system checks...

System check identified no issues (0 silenced).

You have 15 unapplied migration(s). 
Your project may not work properly until you apply 
the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

January 24, 2019 - 01:35:48
Django version 2.1.5, using settings 'intro.settings'
Starting development server at http://0.0.0.0:8080/
Quit the server with CONTROL-C.

#서버 접속 시, 아래와 같이 에러
#setting.py - ALLOWED_HOST에 추가를 해줘야함.
DisallowedHost at /
Invalid HTTP_HOST header: 'playground-tothefullest08.c9users.io:8080'. 
You may need to add 'playground-tothefullest08.c9users.io' to ALLOWED_HOSTS.

#setting.py
ALLOWED_HOSTS = ['playground-harrylee0810.c9users.io']

#장고는 디버깅 모드가 기본으로 설정되어 있어서 저장하고 새로고침하면 소스 내용이 자동 적용됨.
  • 프로젝트 폴더 내 파일 종류
파일종류 내용
__init__.py Intro 라는 폴더(프로젝트로 지정한 폴더)를 하나의 패키지/모듈로 인식시킴. 이를 통해 intro.urls intro.settings 와 같은 기능을 사용 할 수 있음. 파이썬 파일을 불러오기 위해서는 __init___ 파일이 필요함.
setting.py Django 내 설정들을 모아놓는 파일
urls.py 프로젝트에 접근하기 위한 첫번째 문(문지기) 라는 개념임. 어떠한 요청이 Django 서버에 오면, 그 요청이 도착하는 곳이 urls.py이다. 요청을 urls.py에서 분석해서 어떠한 요청이 왔는지, 어떠한 주소로 왔는지를 보고 다른곳으로 전환하는 중개기(라우터)의 역할을 함.
wsgi.py 실제로 서비스를 하기 위해서, 완성을 해서 24시간 돌아가는 서버에다가 코드를 올려놓고 사람들이 access하고 수정을 할 수 있게 하는 파일
manage.py 서버를 실행하기 위한 명령어 등을 저장하는 파일
  • __init__.py 파일의 역할
    • intro.settings와 같이 . 으로 타고 들어갈 수 있게 해주는 파일이 _init__.py임.
    • 특정 폴더 내 파일에 접근하기 위해서는, __init__.py라는 파일이 있어야 그 폴더(intro; 프로젝트 명)를 하나의 모듈로 보고, 그 밑으로 들어갈 수 있게됨.
    • ex) intro.settings : intro라는 폴더(프로젝트로 지정된 폴더) 내에 settings.py라는 파일을 불러오겠다!
#manage.py
import os
import sys

if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'intro.settings')

3. 어플리케이션 생성

  • python manage.py startapp 어플명: 어플리케이션을 생성하는 명령어
  • 어플리케이션 기본 설정: [어플리케이션명].apps.[클래스명]
    • 어플리케이션을 생성하면, 어플리케이션을 생성했다는 것을 django 에게 알려서 등록을 해야함. 앱의 정보는 apps.py (pages 라는 어플명의 폴더 안에 위치)에 저장되어있으며, 해당 파일 안의 클래스 명인 Pages.Config를 settings.py에 등록해아함.
#apps.py
from django.apps import AppConfig

class PagesConfig(AppConfig):
    name = 'pages'

#settings.py의 33rd line
INSTALLED_APPS = [
    
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #추가
    'pages.apps.PagesConfig',
]
  • 추가 설정
    • 기본 시간대(time zone)와 기본 언어를 settings.py 파일 내에서 설정할 수 있음. tz의 값은 표준으로 정해진 List of tz database time zones을 기반으로함
#settings.py의 107~109th line
#변경전
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'

#변경후
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'
  • 어플리케이션 폴더(예. pages) 내 파일 종류
파일종류 내용
__init__.py 인트로라는 폴더가 하나의 패키지로 인식됨. intro.urls intro.settings 와 같은 기능을 사용 할 수 있음. 파이썬 파일을 불러오기 위해서는 __init___ 파일이 필요함.
apps.py 만든 어플리케이션의 정보가 담긴 파일
models.py DB 관련된 코드를 작성하는 곳. 어플리케이션(예; pages)에서 사용할 DB를 정의함. 어떠한 데이터베이스 테이블을 만들건지 등을 정의하는 곳.
tests.py 작성한 코드가 잘 동작하는지? 테스트하는곳. 테스트를 해주는 코드가 또 있음. 코드를 테스트하는 코드 (코드를 테스트하는 코드가 되려 더 많아질수도있음 - 주객전도)
views.py 어떠한 요청이 들어왔을 때, 무엇을 실행할건지? 우리가 보게될 페이지를 만드는 곳? 페이지들이 모여있는 곳임.

4. templates 폴더 생성

  • 사용자가 보는 화면에 해당 하는 html 파일을 어플리켓이션 내에 templates 라는 폴더내에 저장시킨다.

Django 기본 설정 명령어 정리

명령어 정의
pyenv virtualenv 3.6.7 [가상환경 명] 가상환경 생성
pyenv local [가상환경 명] 가상환경으로 설정
pip install django 장고 설치
django-admin startproject [프로젝트이름] . 프로젝트 생성(현재 폴더 내)
python manage.py startapp [앱이름] 어플리케이션 생성
python manage.py runserver $IP:$PORT 서버 실행

190210_TIL

|


  1. 수업시간에 배운 Django 의 Rest architecture으로 CRUD를 구현하고, 댓글을 생성하는 모델 클래스를 추가로 만들어 다시한번 연습을 해보았다. 원래 이번주의 계획은 초보몽키님의 Django 프로젝트를 참조하여 메모장 사이트를 만들고 싶었으나, 생각보다 시간이 많이 지연되었다.

  2. 복습겸 장고 걸스 튜토리얼강의를 한번 들어보려 했으나, Django 2.0 이전의 버젼으로 진행되어있어, 수업에 배운 부분과 상당히 상이한 부분이 많았다. 메모장 프로젝트는 내일부터 시작되는 django Form과 사용자 인증에 대한 수업을 끝낸 후, 다시 시작해보고자 한다.

  3. 오늘은 생활코딩 - 지옥에서 온 Git 강의를 들었다. 수업에 git을 간간히 사용하여, repository를 pull하고 push 해보았으나, 강의로 막상 들으니 내용이 매우 흥미로웠다. 특히 branch별로 내용을 수정하거나 생성하면, 실제 폴더에도 그 내용이 반영되는게 매우 신기했다.

  4. 생활 코딩 Git 강의를 typora를 통해 markdown을 작성하여 블로그에 직접 게시를 해보았는데 많은 시행착오를 겪었다. typora에서는 제대로 양식에 맞추어 노트북에 표시가 되었던 부분이, 직접 git을 통해 글을 올려보니, 줄 간격이 맞지 않다거나, 코드 에디터가 제대로 표시되지 않는 등 어려움을 겪었다. 이부분에 대해 좀더 개선 될 수 있는 방법을 살펴봐야할 듯 하다.

생활코딩 Git 03 - branch 만들기, 정보확인

|


brach 소개

  • 파일을 용도에 따라 나누고, 다시 합치는 경우는 매우 까다로우나 git을 사용하면 훨씬 쉽고 세련되게 관리를 할 수 있음.
    • 작업을 진행하다 분기되는 현상 : branch를 만든다
    • 위의 예시의 경우, 기존의 branch + 분기된 branch; 총2개의 branch를 갖게됨.
  • branch의 개념은 위험하며 어렵고, 용량이 많이 차지하여 타 프로그램에서 사용되어 오지 않았으나, git은 이 기능을 쓸만한 수준까지 올렸다는 것임.


brach 만들기

#master: 현재 master 이라는 branch 를 사용하고 있다는 의미
해리@DESKTOP-8D71JEB MINGW64 ~/gitfth (master)
  • git branch : 브랜치의 목록을 표시
  • git branch "새로운 브랜치 명" : 브랜치 생성
  • git branch -d "브랜치 명" : 브랜치 삭제
  • git branch -D "브랜치 명" : 병합하지 않은 브랜치를 강제 삭제
  • git checkout "전환하려는 브랜치 명" : 브랜치를 전환(체크아웃)

브랜치를 전환하면, 파일이 현재 어느 브랜치에 속해 있느냐에 따라 내용이 완전히 달라짐

브랜치 사용의 대표적 예시: 원래 소스코드는 그래로 두면서, 고객을 위한 customizing에 해당하는 기능을 추가해야할 경우


branch 정보확인

branch를 만들면 상당히 복잡해지고 어려워 지는데, 이는 효용에 대한 댓가라고 생각함. branch룰 만들었을 때, 현재 어떠한 상황인지 판단 할 수 있도록 여러가지 방법을 살펴보자

  • git log "비교할 브랜치명1".."비교할 브랜치명2" : 브랜치간에 비교
  • git log --branches --decorate : 좀 더 상세히 브랜치간 비교
    • exp branch의 최신 commit: “4”
    • master brancch의 최신 commit: “6”
    • HEAD: 현재 checkout 된 branch를 나타냄 (현재 checkout된 branch는 master)
$ git log --branches --decorate
commit 9b64d819b11d9dee601c5961f8172a592f5df9fa (HEAD -> master)
Author: Harry Lee <tothefullest08@gmail.com>
Date:   Sun Feb 10 21:21:49 2019 +0900

    6

commit 920d9826fcbe1556688e28247fe522a686607309 (exp)
Author: Harry Lee <tothefullest08@gmail.com>
Date:   Sun Feb 10 21:05:25 2019 +0900

    4

commit df422af85c3b6b17e190faaa77053b93247bced6
Author: Harry Lee <tothefullest08@gmail.com>
Date:   Sun Feb 10 21:02:34 2019 +0900

    3

commit ee6abf9bba1718690cd7968079c59467a6c753d3
Author: Harry Lee <tothefullest08@gmail.com>
Date:   Sun Feb 10 20:54:29 2019 +0900

    2

commit e4ba2b0b61cd8296d046ab19164e97844182c6a7
Author: Harry Lee <tothefullest08@gmail.com>
Date:   Sun Feb 10 20:53:50 2019 +0900

    1

  • git log --branches --decorate --graph : 로그에 모든 브랜치를 표시 + 그래프 + 브랜치명
$ git log --branches --decorate --graph
* commit 9b64d819b11d9dee601c5961f8172a592f5df9fa (HEAD -> master)
| Author: Harry Lee <tothefullest08@gmail.com>
| Date:   Sun Feb 10 21:21:49 2019 +0900
|
|     6
|
| * commit 920d9826fcbe1556688e28247fe522a686607309 (exp)
| | Author: Harry Lee <tothefullest08@gmail.com>
| | Date:   Sun Feb 10 21:05:25 2019 +0900
| |
| |     4
| |
| * commit df422af85c3b6b17e190faaa77053b93247bced6
|/  Author: Harry Lee <tothefullest08@gmail.com>
|   Date:   Sun Feb 10 21:02:34 2019 +0900
|
|       3
|
* commit ee6abf9bba1718690cd7968079c59467a6c753d3
| Author: Harry Lee <tothefullest08@gmail.com>
| Date:   Sun Feb 10 20:54:29 2019 +0900
|
|     2
|
* commit e4ba2b0b61cd8296d046ab19164e97844182c6a7
  Author: Harry Lee <tothefullest08@gmail.com>
  Date:   Sun Feb 10 20:53:50 2019 +0900

      1
  • git log --branches --decorate --graph : 한줄로 요약하여 현상태를 표시함
$ git log --branches --decorate --graph --oneline
* 9b64d81 (HEAD -> master) 6
| * 920d982 (exp) 4
| * df422af 3
|/
* ee6abf9 2
* e4ba2b0 1
  • git log "브랜치명1".."브랜치명2": 브랜치명 사이의 로그를 비교
  • git log -p "브랜치명1".."브랜치명2": 브랜치명 사이의 로그 + 소스코드까지 비교
#exp branch에는 없고, master branch에 있는 로그 표시
해리@DESKTOP-8D71JEB MINGW64 ~/gitfth (master)
$ git log exp..master
commit 9b64d819b11d9dee601c5961f8172a592f5df9fa (HEAD -> master)
Author: Harry Lee <tothefullest08@gmail.com>
Date:   Sun Feb 10 21:21:49 2019 +0900

    6

#exp branch에는 없고 master branch에 있는 로그 + 소스코드 표시
$ git log -p exp..master
commit 9b64d819b11d9dee601c5961f8172a592f5df9fa (HEAD -> master)
Author: Harry Lee <tothefullest08@gmail.com>
Date:   Sun Feb 10 21:21:49 2019 +0900

    6

diff --git a/f3.txt b/f3.txt
new file mode 100644
index 0000000..442406a
--- /dev/null
+++ b/f3.txt
@@ -0,0 +1,2 @@
+a
+

#master branch에는 없고, exp branch에 있는 로그 표시
해리@DESKTOP-8D71JEB MINGW64 ~/gitfth (master)
$ git log master..exp
commit 920d9826fcbe1556688e28247fe522a686607309 (exp)
Author: Harry Lee <tothefullest08@gmail.com>
Date:   Sun Feb 10 21:05:25 2019 +0900

    4

commit df422af85c3b6b17e190faaa77053b93247bced6
Author: Harry Lee <tothefullest08@gmail.com>
Date:   Sun Feb 10 21:02:34 2019 +0900

    3
  • git diff "브랜치명1".."브랜치명2"각 branch의 현재 상태를 비교
$ git diff master..exp
diff --git a/f1.txt b/f1.txt
index 422c2b7..de98044 100644
--- a/f1.txt #master branch
+++ b/f1.txt #exp branch
@@ -1,2 +1,3 @@
 a
 b
+c 			#exp brancch의 경우, C 라는 내용이 추가되어있음을 의미