2020년 4월 8일 수요일

Sony HDR-CX450 캠코더 스트리밍 방법

요즘 코로나 바이러스로 인해 유튜브 온라인 강의 및 방송 필요성이 늘어나고 있다. 이 글은 Sony 캠코더 스트리밍 레퍼런스를 소개한다.


2020년 4월 3일 금요일

파이썬 pdb 디버깅 명령 요약

이 글은 파이썬 디버깅 명령을 요약한 것이다.

PDB 디버거 사용 방법
파이썬을 설치하면, pdb 란 디버거가 함께 설치된다. 이를 이용해 코드 실행 순서를 디버깅할 수 있다.
l: 주변 소스코드 출력
ll: 모든 소스코드 출력
n: 다음 문장으로 이동.
s: ‘Step Into’로 함수 내부 들어감.
c: 다음줄부터 중단점을 만날때까지 코드를 실행. 중단점이 없다면 끝까지 실행.
r: 현재 함수의 return이 나올때까지 실행.
w: 함수의 call stack을 보여줌.
cl: 모든 중단점들을 삭제.unt(il) [lineno]: line no까지 실행
b [lineno | function]: 특정파일이나 패키지의 줄번호나 함수명으로 중단점을 만듬. 예) b 20
a: 현재 함수의 매개변수들을 출력
p: 변수값 확인
pp: 변수값 확인
!변수명=값: 변수에 값 재설정
q: quit
h: 도움말
restart: 디버그 재시작함
다음과 같이 실행하면 된다. 주로 사용하는 명령은 b, c, n, l, p, pp, ll, restart 이다.
python -m pdb train.py

사용 예시
디버깅을 GUI로 하려면 다음 프로그램을 설치해 사용해 본다.
Debug in PyCharm

참고 -  파이참 임포트 에러
PyCharm 사용시 import 에러가 발생하면, 몇 가지 원인이 있다. 다음 같은 방법을 사용한다. 
1. 직접 터미널에서 PyCharm.sh를 실행한다.
2. 다음과 같이 경로를 추가한다.
import os
print(os.environ['PATH'])  # 경로 확인
PATH environment variable를 Run/Debug Configuration에 설정한다.

2020년 4월 2일 목요일

우분투 apt-get update Packages 404 Not Found 에러 해결 방법

우분투 apt-get update 명령 시 다음과 같은 Packages 404 Not Found (403) 에러가 발생하는 경우가 있다.

apt-get update Err:10 http://archive.ubuntu.com/ubuntu xenial/main arm64 Packages   404  Not Found gen cpu

오래된 패키지에 대한 지원은 old-release로 이동되어 있을 수 있다. 이 경우, 다음과 같이 처리해 본다.
sudo sed -i -re 's/([a-z]{2}\.)?archive.ubuntu.com|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
sudo apt-get update && sudo apt-get dist-upgrade
sudo do-release-upgrade

2020년 4월 1일 수요일

포인트 클라우드 라벨링 도구 소개 및 사용방법

이 글은 무료 포인트 클라우드 라벨링 도구를 소개한다. 딥러닝에 필요한 데이터를 라벨링하는 작업은 노가다다.

일반적으로 하나의 이미지에 여러 객체를 라벨링하는 작업은 2~5분 정도 걸린다.평균 3분인 경우, 한시간에 20장을 라벨링할 수 있고, 하루에 160장을 라벨링할 수 있다. 딥러닝을 위해서는 수천장의 데이터가 필요하므로, 3000장을 준비하려면 약 20일 정도 시간이 필요하다. 2차원 이미지에 비해 3차원 점군은 훨씬 더 많은 작업 시간이 필요하다. 이런 노가다에 사용하는 도구를 소개한다.


점군 입력 자료를 만들기 위해서는 3차원 점들을 그룹화할 수 있는 라벨링 도구를 이용해야 한다. 점군 라벨링 도구는 다음 링크를 참고한다.
편집할 점군은 S건물 지하이며, 점군 LoD를 낮추어 180만 포인트 수준으로 처리했다. 처리에 사용된 소프트웨어는 Realworks와 Cloudcompare이다. 

파일 포맷은 PTS이며, 데이터 구조 XYZRGBI로 다음과 같다.
-8.14260960 3.62140012 56.08124161 200 163 144 1694.000000 
-8.13253975 3.60634995 56.08150864 194 164 136 1678.000000 
-8.12275028 3.59173012 56.08126068 197 168 136 1614.000000 

Semantic Segmentation Editor 를 설치하고, 다음과 같이 실행해 본다.

private/samples 폴더 아래에 있는 이미지나 점군을 다음과 같이 라벨링할 수 있다.

2020년 3월 19일 목요일

딥러닝 기반 이미지 시멘틱 세그먼테이션

이 글은 딥러닝 기반 이미지 세그먼테이션 관련 내용을 간단히 소개한다.

개별 이미지에 대한 딥러닝 기법은 정확도가 많이 높아져, 사람이 인식하는 수준을 넘었으나, 전체 그림에서 객체의 시멘틱 정보를 인식하는 딥러닝 기법은 현재 정확도 수준이 그에 미치지 못하고 있다.

시멘틱 기법은 데이터 종류에 따라, 2차원 이미지, 3차원 포인트 클라우드로 구분할 수 있다. 

포인트 클라우드 시멘틱 세그먼테이션의 최신 기법은 다음과 같다.

이미지 기반 시멘틱 세그먼테이션의 최신 기법은 다음과 같다.
Semantic segmentation mAP, FPS
레퍼런스



2020년 3월 16일 월요일

빅데이터를 고려한 카프카 기반 Raspberry Pi IoT 시스템 개발

이 글은 빅데이터를 고려한 카프카 기반 Raspberry Pi(RPi) IoT 시스템을 개발하는 방법을 간단히 다루어 본다. 카프카는 대용량 메시지 처리, IoT 센서 데이터, 빅데이터 처리 등에 MongoDB와 함께 사용되는 경우가 많다. 참고로, 카프카 개발팀은 스타트업 Confluent 사를 설립했는 데, 시리즈 D에서 1억 2500만달러를 투자받았고, 자산가치는 25억달러로 평가받고 있다(참고). 현재, 카카오, 네이버 라인 등 많은 회사에서 카프카를 메시지 미들웨어 핵심 엔진으로 사용하고 있다.
이 내용은 다음 목적에 유용하다.
  • 저렴한 IoT 데이터 분산처리 시스템 개발
  • 라즈베리파이 기반 IoT 클러스터 구축
라즈베리파이는 임베디드 보드라 메모리 제약이 심하다. 이런 이유로 기대한 만큼 카프카 성능과 안전성이 좋지 않을 수도 있다. 만약, 라즈베리파이를 단지 IoT 데이터 취득 목적으로만 사용하고, 별도 서버(IBM 호환 PC, 엔비디아 보드 등)에 카프카와 주키퍼를 서비스한다면 파이썬의 카프카 라이브러리 함수인 KafkaProducer, KafkaConsumer를 사용하면 된다. 이 내용은 아래 부록이나 링크를 참고한다. 
준비
하드웨어를 다음과 같이 준비한다.
  • Raspberry Pi 3 Model B 이상
  • 32 GB 이상 Micro SD 메모리 
  • EDiMAX 등 WiFi USB 동글
  • 라즈베리파이 전원 아답터
  • DHT11 온습도 및 초음파 거리센서 HC-SR04

소프트웨어를 다음과 같이 준비한다.
  • RPi NOOBS(New Out Of the Box Software) 다운로드 후 압축 풀고, 파일들을 Micro SD에 복사함
  • RPi 에 Micro SD를 넣고, 키보드, 마우스, 전원을 연결함
  • RPi 가 켜지면 WiFi 설정 후 운영체제 설치 명령을 따라 Raspbian OS를 설치(Lite 버전은 설치하지 말것) 

다음과 같이 hostname을 local IP 주소와 함께 설정한다.
vim /etc/hostname # and set a name like raspberry-8.
vim /etc/hosts # Replace raspberry with your new name.

아파치 주키퍼와 카프카를 다운로드 한 후 RPi 에 복사해 넣는다.

주키퍼 및 카프카 서버 실행
설정
라즈베리파이 메모리 부족 에러 방지를 위해 압축해제한 카프카 폴더 내 bin의 kafka-server-start.sh 에 서버 실행 전 아래 내용을 추가한다.
export JMX_PORT=${JMX_PORT:-9999}
export KAFKA_HEAP_OPTS="-Xmx256M -Xms128M"

카프카 LEADER_NOT_AVAILABLE 에러를 방지하기 위해 /config/server.properties에 아래를 추가한다.
advertised.listeners = PLAINTEXT://localhost:9092
delete.topic.enable=true

서버 실행
주피커와 카프카 서버를 터미널에서 차례대로 실행한다.
kafka\bin\zookeeper-server-start.sh ../config/zookeeper.properties
kafka\bin\kafka-server-start.sh ../config/server.properties

그리고, producer와 consumer를 터미널에서 실행한다.
kafka\bin\kafka-console-producer.sh --broker-list localhost:9092 --topic IoT
kafka\bin\kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic IoT

producer에서 키보드로 메시지 입력하면, 다음과 같이 consumer에 보일 것이다. 그럼 성공한 것이다.
카프카 서버 실행 화면

좀더 자세한 내용은 아래를 참고한다.
센서 설치 및 개발
이 글에서 개발할 센서는 온습도, 거리 센서이다. 센서 회로 연결 시 아래 RPi 보드 핀 레이아웃을 참고한다. 빅데이터 분산 처리 메시지 스트리밍 개발의 목적이므로, 간단한 회로 작성을 위해 저항 등은 연결하지 않았다. 다음 예시의 회로 연결은 실습용이니 참고하길 바란다.
RPi 핀 번호

개발 환경 설치
우선 아래와 같이 파이선 라이브러리를 설치한다.
sudo apt-get update
sudo apt-get install python-pip
sudo python -m pip install --upgrade pip setuptools wheel
sudo pip install kafka-python
sudo pip install Adafruit_DHT

데이터 분석, 비전을 개발한다면, 다음 패키지도 함께 설치한다(설치가 안된다면, 해당 패키지 github에서 설치방법을 확인한 후 수동으로 설치해야 한다).
sudo pip install scikit-learn numpy
sudo pip install opencv-python imageio Pandas Pillow

아두이노 개발하려면 아래를 설치한다.
sudo apt-get install arduino

온습도센서 설치 및 코딩
DHT11을 라즈베리파이와 다음과 같이 연결한다.
DHT11 Vcc - RPi 5V
DHT11 GND - RPi GND
DHT11 Data - RPi GPIO No 2
DHT11 온습도 센서 핀 배치

다음과 같이 코딩한다. 카프카로 IoT 주제로 데이터를 생성한다.
from kafka import KafkaProducer
from json import dumps
import RPi.GPIO as GPIO                    
import Adafruit_DHT as ada
import time               

producer = kafkaProducer(bootstrap_servers=['localhost:9092'], value_serializer=lambda x: dumps(x).encode('utf-8'))

dht = ada.DHT11
pin = 2    # GPIO No 2

print("start")
while True:
  h, t = ada.read_retry(dht. pin)
  data = {'temp': [h, t]}
  if h is not None and t is not None:
    producer.send("safety", value = data)
    print("T={0}, H={1}".format(t, h))
  else:
    print("none")
  time.sleep(0.5)  

다음과 같이 실행되면 카프카로 센서 메시지 발행이 성공한 것이다.
RPi기반 카프카 분산 메시지 스트리밍 실행 결과

네트웍 IP 주소가 있다면, 다른 컴퓨터에서 연결한 카프카 CONSUMER에서 라즈베리파이에서 발생한 센서 데이터 메시지를 스트리밍받아 볼 수 있다.

라즈베리파이 작업관리자를 확인해 보면, 카프카 실행상태에서 리소스 사용은 CPU 5-20%, 메모리 662MB/874MB이였으며, 다음과 같았다.

거리센서 설치 및 코딩
거리센서 HC-SR04를 아래와 같이 연결한다. 카프카 safety 주제(토픽)으로 data를 생성해본다.
회로 연결

RPi의 GPIO 라이브러리를 이용해 아래와 같이 dist.py파일을 코딩한다.
from kafka import KafkaProducer
from json import dumps
import RPi.GPIO as GPIO                    
import time                       
  
producer = kafkaProducer(bootstrap_servers=['localhost:9092'], value_serializer=lambda x: dumps(x).encode('utf-8'))
       
GPIO.setmode(GPIO.BCM)     #Set GPIO pin numbering 

trig = 23                                  
echo = 24                                  

GPIO.setup(trig,GPIO.OUT)                 
GPIO.setup(echo,GPIO.IN)                   

while True:
  GPIO.output(trig, False)                 
  time.sleep(1)                            

  GPIO.output(trig, True)                  
  time.sleep(0.00001)                      
  GPIO.output(trig, False)       
     
  while GPIO.input(echo)==0:          
    start = time.time()          
  while GPIO.input(echo)==1:            
    end = time.time()               

  travelTime = end - start 
  distance = travelTime * 17150        
  distance = round(distance, 2)            
  
  data = {'dist': distance}
  producer.send("safety", value = data)
     print "D = ", distance,"cm"

그리고, dist.py를 실행한다.
python dist.py

정상 실행되면 아래와 같은 데이터 출력을 확인할 수 있다. 같은 방식으로 카프카 CONSUMER에서 데이터를 확인할 수 있다.

부록: 별도 카프카 서버 구축, 라즈베리파이 IoT 센서 데이터 스트리밍 및 성능 테스트
카프카 환경 설정
무선이나 유선 네트워크가 가능한 환경에서, 별도 컴퓨터에 카프카를 앞의 내용을 참고해 설치한다. 시스템 구조는 다음과 같다.
카프카를 설치한 컴퓨터에, 앞서 설명한 server.properties 파일의 아래 내용을 해당 컴퓨터 IP주소에 맞게 수정한다.
listeners=PLAINTEXT://IP주소:9092
advertised.listeners=PLAINTEXT://IP주소:9092

주키퍼와 카프카 서버를 각각 터미널에서 실행한다.
c:\kafka\bin\windows\zookeeper-server-start.bat ../../config/zookeeper.properties
c:\kafka\bin\windows\kafka-server-start.bat ../../config/server.properties

센서 데이터 획득 및 빅데이터 생성 코딩
라즈베리파이에서 앞에 설명한 초음파 거리센서 예제를 참고해, 파이썬으로 다음과 같이 코딩한다. 카프카 서버 IP주소는 앞의 IP주소와 동일해야 한다.
from kafka import KafkaProducer
from json import dumps
import RPi.GPIO as gpio
import time

producer = KafkaProducer(bootstrap_servers=['카프카 컴퓨터 서버 IP주소:9092'],
value_serializer=lambda x: dumps(x).encode('utf-8'))

gpio.setmode(gpio.BCM)
trig = 23
echo = 24

gpio.setup(trig, gpio.OUT)
gpio.setup(echo, gpio.IN)

index = 0
while True:
  gpio.output(trig, 0)      # 0.01초 마다 센서 데이터 생성 및 전송
  time.sleep(0.01)
  gpio.output(trig, 1)
  time.sleep(0.00001)
  gpio.output(trig, 0)

  while gpio.input(echo) == 0:
    start = time.time()
  while gpio.input(echo) == 1:
    end = time.time()

  travelTime = end - start
  distance = travelTime * 17150 # / 58.0
  index = index + 1
  data = {'dist': [index, distance]}
  producer.send("IoT", value = data)
  print index, 'D = ', round(distance, 2), 'cm'

코딩 후 이 파이썬 프로그램을 실행한다. 

카프카 서버에서 consumer를 실행해 네트워크를 통해 데이터가 제대로 전달되는 지를 확인한다. 다음과 같이 카프카 서버와 라즈베리파에서 실행되면 성공한 것이다.
카프카 서버 실행 모습
라즈베리파이 센서 데이터 획득 및 카프카 서버에 센서 데이터 스트림 네트워크 전송 모습

카프카 데이터 스트리밍 성능 테스트
카프카 메시지 스트리밍 성능 테스트를 위해 센서 데이터 전송을 초당 100개로 설정해 다음과 같이 확인해 보았다. 
라즈베리파이 센서 값

인터넷 네트워크 회선에 큰 문제가 없다면, 카프카 서버에서 실시간 수준으로 데이터 스트리밍 처리하는 것을 확인할 수 있다. 데이터 패킷 크기가 50 bytes 인 경우, 초당 5K가 처리되는 수준이다. 좀 더 부하를 주기위해 초당 1000개 토픽을 생성해 전송하였고, 이때도 큰 무리 없이 실시간 수준으로 스트리밍처리되었다. 이 경우, 초당 50K가 처리되는 수준이다.

좀 더 명확한 성능 측정을 위해서는 다음 링크의 성능 분석 매트릭스 및 데쉬보드 도구를 설치해 확인할 수 있다.
카프카 데이터 패킷 구조에 대해 궁금하다면 다음 링크를 참고한다.
부록: 카프카, 스파크, NoSQL 빅데이터 처리 아키텍처
카프카 서버에 전송된 데이터는 스트리밍되어 다른 어플리케이션이나 컴퓨터에서 고속으로 데이터를 전송받을 수 있다. 이 데이터를 Mongo DB같은 NoSQL DB에 저장하고, 스파크 등으로 빅데이터 분석을 수행할 수 있다. 이에 대한 내용은 아래를 참고한다.
다음은 이를 고려한 빅데이터 처리 아키텍처 예시이다.
Big data process architecture framework(Data Science: Third International Conference of Pioneering Computer, Springer, 2017)


부록: RPi 카메라 설치
라즈베리파이 카메라를 RPi와 연결하고, 다음과 같이 카메라 설정한다.
sudo raspi-config

UI메뉴에서 5번 setting interfaces, 1번 Setting camera 를 선택해 카메라를 활성화한다. 이제 다음 명령을 입력한다.
raspivid -o video.h264 -t 10000 -w 640 -h 480 -p 0,0,640,480

그럼 다음과 같이 카메라 화면이 나타난다.

파이썬 OPENCV를 이용해 객체 감지 후 해당 메시지를 앞에서 설명한 것과 같은 방식으로 카프카 메시지로 스트리밍 서비스할 수 있다.

부록: 라즈베리파이 기반 카프카 클러스터 서버 생성
주키퍼 설정
다음과 같이 주키퍼 클러스터 설정용 conf/zoo.cfg을 수정한다.
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/zookeeper # Don't put under /tmp, it will be deleted.
clientPort=2181
server.1=192.168.0.18:2888:3888
server.2=192.168.0.15:2888:3888
server.3=192.168.0.16:2888:3888

각 RPi의 /var/zookeeper 아래 myid 파일에 설정 파일을 복사한다.
그리고 zookeeper 루트 폴더아래 ./bin/zkServer.sh start 를 입력해 주키퍼 서비스를 시작한다. 주키퍼가 적절히 실행된다면, 다음처럼 프롬프트에 보일 것이다.
pi@raspberrypi-16:~/apache/zookeeper-3.4.11 $ ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/pi/apache/zookeeper-3.4.11/bin/../conf/zoo.cfg
Mode: follower # (or leader)

카프카 설정
주키퍼 클러스터가 실행 되고 있으면, 이제 아파치 카프카를 RPi에 배포한다.

다음 같이, config/server.properties 파일을 수정한다.
broker.id=1 # 1/2/3 for each card
port=9092
host.name=192.168.0.16 # IP address
zookeeper.connect=192.168.0.18:2181,192.168.0.15:2181,192.168.0.16:2181

bin/kafka-server-start.sh 를 갱신한다.
export JMX_PORT=${JMX_PORT:-9999}
export KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" # Otherwise, JVM would complain not able to allocate the specified memory.

bin/kafka-run-class.sh 를 갱신한다.
KAFKA_JVM_PERFORMANCE_OPTS="-client -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -Djava.awt.headless=true" # change -server to -client

카프카를 시작한다.
./bin/kafka-server-start.sh config/server.properties &

카프카가 적절히 시작되고 있다면, 다음과 같이 다른 콘솔 터미널에서 producer 를 실행해 본다.
./bin/kafka-console-producer.sh — broker-list 192.168.0.15:9092,192.168.0.16:9092,192.168.0.18:9092 — topic v-topic # create a topic
./bin/kafka-console-producer.sh --broker-list 192.168.0.15:9092,192.168.0.16:9092,192.168.0.18:9092 --topic v-topic # kick off a producer

카프카 consumer를 실행한다.
./bin/kafka-console-consumer.sh — zookeeper 192.168.0.16 — topic v-topic from-beginning

레퍼런스

2020년 3월 8일 일요일

깃허브(github) 개념 및 사용법 정리

이 글은 협업을 통한 개발 시 많이 사용되는 깃허브(github) 명령어 기록 겸 사용법 간단히 정리한다. github는 2018년 6월 마이크로소프트에 8조원(75억 달러)으로 인수된 개발자 협업 및 형상관리(configuration management) 플랫폼이다. 톰, 크리스, 피제이 개발자 3명이 2007년부터 개발을 시작해 전세계에 서비스되었다(상세).

깃허브 가입 및 설치
깃허브는 명령행 인터페이스 프로그램과 깃허브 웹사이트를 통해 형상 관리를 지원한다.

깃허브 사용을 위해 다음 링크 클릭해 가입하고, 깃허브 프로그램을 설치한다.
깃허브 형상관리 개념
형상관리는 소프트웨어나 문서의 변경사항을 체계적으로 추적 관리하는 것이다. 깃은 형상관리 플랫폼이다. 다음 그림은 새 소스파일을 생성해 깃(git) 저장소에 저장하고 협업하는 과정을 보여준다. git은 크게 4개 git 관리 파일 DB를 가진다. git은 각 DB들을 갱신하며 파일 형상을 관리한다.
  • workspace: 컴퓨터 로컬 작업 폴더
  • staging: 컴퓨터 로컬 폴더 내 파일 인덱스 DB
  • local repository: 컴퓨터 로컬 폴더 내 파일 저장소
  • remote repository: 협업용 원격 깃 저장소
git process(Diego C Martin)

깃 프로세스는 다음과 같다. 이 과정에서 파일이 추가, 변경, 삭제된 이력과 내용은 모두 깃허브에 기록된다. 이를 통해, 파일 내용을 특정 버전으로 되돌리거나(roll back), 다른 사람이 만든 파일과 병합(merge)하는 형상관리가 가능해진다. 앞의 그림은 이 과정을 잘 보여준다.
  1. 로컬 폴더 생성: 프로젝트 파일이 저장될 폴더를 생성한다.
  2. 깃 저장소 생성: 온라인 협업 작업을 위한 원격 작업할 깃 저장소를 생성한다.
  3. 로컬과 깃 저장소 연동: 원격 협업 작업을 위해 깃 저장소 연동 정보를 생성한다. 
  4. 파일 생성 및 깃 저장소 추가(add): 파일 작업 후 해당 파일을 로컬 폴더 인덱스에 추가한다.
  5. 파일 커밋(commit)/푸시(push): 작업한 파일들을 커밋해 깃 저장소에 추가하고, 실제 파일 내용을 푸시하여 깃 저장소에 저장한다.
  6. 로컬 폴더 파일 갱신(PULL): 다른 사람들이 푸시한 깃 저장소 최신 버전 파일들을 로컬 폴더에 다운로드 받아 동기화한다.
저장소 생성, 파일 형상관리
깃허브 로긴 후 개발 프로젝트 폴더에 해당하는 저장소(repository)를 생성한다.
  • Repository 생성. README 생성 옵션은 체크하지 않음
  • 로컬에 개발 폴더 생성
  • 로컬 개발 폴더 내에 source.py 파일 생성 및 내용 입력
  • git init 로 로컬 폴더 git 설정
  • git add source.py 로 파일 인덱스를 추가함
  • git commit -m "source.py" 로 파일 정보를 github에 저장
  • git status 로 상태 확인
  • 저장소 주소를 다음과 같이 이름과 연결. 주소와 이름은 적절히 수정할 것.
git remote add remoteName https://github.com/username/repositoryName
  • git push remoteName master 로 현재 커밋 파일을 저장소에 저장
git push 시 아이디 및 암호 입력 화면
git push 화면
다시 source.py를 수정하하면, 다음 과정을 다시 거쳐야 한다.
  • git add source.py
  • git commit -m "source.py"
git 저장소가 달라졌으면, 로컬을 동기화하기 위해 다시 git pull origin master 수행해야 한다.

브랜치 생성 및 사용
브랜치는 일정 기간 동안만 유지되는 개발 시 사용한다. 브랜치 사용법은 다음과 같다.
  • git branch 로 브랜치 목록 보기
  • git branch sub1 브랜치 만들기
  • git checkout sub1 로컬 저장소의 브랜치 전환
  • git branch
  • git add source.py
  • git commit -m "source.py"
  • git push remoteName sub1
  • git checkout sub1
  • git pull
브랜치 병합은 다음과 같다. 
  • git checkout master 로컬 저장소 브랜치 전환
  • git merge sub1 병합
  • git push remoteName master 저장
브랜치 삭제는 다음과 같다. 
  • git branch -d sub1 
  • git branch
Rollback 하기
현재 파일을 수정하다, 깃 저장소에 최신 파일로 되돌리고 싶을 때 다음 명령어를 사용한다.
  • git reset --hard {commit번호} : 특정 커밋으로 되돌리고, 이후 버전은 히스토리에서 삭제됨
  • git reverse {commit번호}: 특정 커밋으로 되돌리고, 이후 버전 이력은 히스토리에 남아 있음
  • git checkout . : 로컬 작업 폴더에서 수정한 모든 파일을 git add 이전의 현재 버전으로 되돌림
깃허브 에러 대처 방법
git 진행 시 에러는 다음과 같이 해결한다.
  • Updates were rejected because the remote contains work that you do not have locally: 저장소 생성 시 README를 체크하지 말거나, git pull 로 해결. 예) git pull origin master
  • Updates were rejected because the tip of your current branch is behind: git pull 할 때 --allow-unrelated-histories 옵션을 추가.
git 에러 화면 예시

레퍼런스