<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>취미가 좋다</title>
    <link>https://benlee73.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 04:13:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>benlee73</managingEditor>
    <item>
      <title>kafka 카프카 쉬운 간단 정리</title>
      <link>https://benlee73.tistory.com/207</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;카프카&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실시간으로 대용량 스트리밍 데이터를 처리하는 메시지 큐 플랫폼&lt;/li&gt;
&lt;li&gt;풀어서 설명
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 주고받는 굉장히 많은 어플리케이션과 DB 들이 있다.&lt;/li&gt;
&lt;li&gt;이 많은 데이터 파이프라인을 관리하기란 어렵다.&lt;/li&gt;
&lt;li&gt;파이프라인의 중간 통로로 카프카를 사용해서 데이터를 카프카에 넣고 데이터를 카프카로부터 꺼내가도록 한다.&lt;/li&gt;
&lt;li&gt;높은 처리량, 확장성, 영속성, 고가용성의 장점을 통해 데이터 파이프라인을 안전하고 확장성 높게 운영할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;브로커&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 저장하고 관리하는 서버&lt;/li&gt;
&lt;li&gt;주로 여러 서버를 묶어서 클러스터로 운영한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컨트롤러&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클러스터 내 브로커 중 한 대가 수행&lt;/li&gt;
&lt;li&gt;클러스터 내 브로커가 죽으면 그 브로커가 가진 리더 파티션을 재분배한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코디네이터&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클러스터 내 브로커 중 한 대가 수행&lt;/li&gt;
&lt;li&gt;컨슈머 그룹의 상태를 체크하고 파티션과 컨슈머를 매칭하는 리밸런싱을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;토픽&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 구분하는 단위
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RDB 의 테이블이라고 어렴풋이 생각하자&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;레코드&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토픽에 들어가고 나오는 데이터 하나하나의 단위는 레코드라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 56.5116%; height: 29px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;타임스탬프&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;메시지 키&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;메시지 값&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;오프셋&lt;/td&gt;
&lt;td style=&quot;width: 20%;&quot;&gt;헤더&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파티션&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토픽의 레코드를 여러 브로커에 분포되어 저장되도록 한다.&lt;/li&gt;
&lt;li&gt;카프카 병렬처리의 핵심이다.&lt;/li&gt;
&lt;li&gt;적절한 파티션 개수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로듀서 전송 데이터양 &amp;lt; 컨슈머 데이터 처리량 x 파티션 개수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;토픽 삭제 정책&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간 or 용량을 기준으로 삭제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간 : retention.ms 설정&lt;/li&gt;
&lt;li&gt;용량 : retention.bytes 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;세그먼트 단위로 토픽을 삭제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세그먼트 : 토픽 데이터를 저장하는 파일 시스템 단위&lt;/li&gt;
&lt;li&gt;세그먼트의 이름은 가진 레코드의 오프셋 중 가장 작은 값 (ex. 04.log)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;토픽 압축 정책&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;zip, snappy 의 압축과는 다르다.&lt;/li&gt;
&lt;li&gt;같은 메시지 키를 가진 여러 레코드 중 최신 레코드만 남기고 삭제하는 정책&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;카프카 클러스터&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj62Kt/btsuG4MPyrv/LwEkPKs0KFK0pIysZX2KRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj62Kt/btsuG4MPyrv/LwEkPKs0KFK0pIysZX2KRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj62Kt/btsuG4MPyrv/LwEkPKs0KFK0pIysZX2KRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj62Kt%2FbtsuG4MPyrv%2FLwEkPKs0KFK0pIysZX2KRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1894&quot; height=&quot;842&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클러스터에 4대의 broker 가 있다.&lt;/li&gt;
&lt;li&gt;클러스터에 4개의 topic 이 있다.&lt;/li&gt;
&lt;li&gt;각 토픽에는 2개의 partition 이 있다. 토픽의 레코드는 이 partition 에 나뉘어 저장된다.&lt;/li&gt;
&lt;li&gt;partition 은 broker 에 분포되어 있다.&lt;/li&gt;
&lt;li&gt;토픽의 replication 값에 따라 같은 레코드가 여러 partition 에 저장될 수도 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;프로듀서&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로듀서는 내부적으로 partitioner, accumulator 가 있다.&lt;/li&gt;
&lt;li&gt;send() 를 호출하면 partiitioner가 어느 파티션으로 레코드를 전송할지 결정한다.&lt;/li&gt;
&lt;li&gt;파티셔너로 구분된 레코드는 accumulator 에서 버퍼로 쌓이고 배치 단위로 브로커로 전송된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;acks&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;얼마나 신뢰성 높게 저장할지 결정하는 옵션&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 94.5349%; height: 134px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.1747%;&quot;&gt;acks&lt;/td&gt;
&lt;td style=&quot;width: 80.8253%;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.1747%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 80.8253%;&quot;&gt;프로듀서는 데이터가 잘 저장됐는지 확인하지 않는다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.1747%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 80.8253%;&quot;&gt;프로듀서는 데이터가 '리더 파티션'에 저장됐는지 확인한다. 팔로워 파티션에 저장됐는지는 알 수 없다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.1747%;&quot;&gt;-1 (all)&lt;/td&gt;
&lt;td style=&quot;width: 80.8253%;&quot;&gt;프로듀서는 데이터가 '모든 파티션'에 저장됐는지 확인한다. (여기서 모든 파티션은 ISR 로 묶인 파티션들)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;컨슈머&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;poll() 메서드 호출 시점에 카프카 클러스터에서 데이터를 가져오는 게 아니다.&lt;/li&gt;
&lt;li&gt;컨슈머 어플리케이션이 실행되면 내부에서 fetcher 를 생성하고 미리 레코드를 내부 큐로 가져온다.&lt;/li&gt;
&lt;li&gt;poll() 을 호출하면 내부 큐에서 레코드를 가져온다.&lt;/li&gt;
&lt;li&gt;(이건 java 의 경우고 다른 언어의 라이브러리에서는 확인이 필요하다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;리밸런싱&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨슈머 그룹에 컨슈머가 추가되거나 제거될 때 각 컨슈머에 파티션을 재분배하는 동작&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;커밋&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨슈머는 어떤 토픽을 어느 오프셋까지 읽었는지 기록한다.&lt;/li&gt;
&lt;li&gt;로컬에도 기록하겠지만 브로커에도 기록해야 한다.&lt;/li&gt;
&lt;li&gt;브로커에 어디까지 읽었다고 오프셋을 보내 기록하는 것을 커밋이라고 한다.&lt;/li&gt;
&lt;li&gt;default 로 5초마다 커밋을 수행한다. (enable.auto.commit=true)&lt;/li&gt;
&lt;li&gt;만약 커밋하기 전에 리밸런싱이 수행되거나 컨슈머 강제종료가 일어난다면 데이터가 재처리되거나 유실될 수 있다.&lt;/li&gt;
&lt;li&gt;auto.commit 대신 동기/비동기로 직접 커밋을 수행할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;버로우&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨슈머의 컨슈머 랙을 파악하는 방법은 여러 가지가 있지만 버로우를 사용해서 모니터링하는 것이 가장 좋다.&lt;/li&gt;
&lt;li&gt;하나 이상의 카프카 클러스터에 버로우를 붙이면 REST API 로 컨슈머그룹, 토픽 별 컨슈머 랙을 쉽게 확인할 수 있다.&lt;/li&gt;
&lt;li&gt;다만 데이터를 저장하는 기능은 없기 때문에 telegraf 로 저장소(ES, prometheus)에 저장하고 대시보드(그라파나, 키바나)로 보는 게 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;기타&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISR (In-Sync-Replicas)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISR 로 리더 파티션과 팔로워 파티션을 묶으면 데이터를 동기화해서 일관성이 유지된다.&lt;/li&gt;
&lt;li&gt;기본적으로 레코드마다 다른 파티션에 저장되지만 replication 을 사용할 경우 한 레코드가 여러 파티션에 저장된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;카프카 스트림즈&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토픽의 데이터를 실시간으로 변환하여 다른 토픽에 적재하는 라이브러리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스파크, 플링크로도 비슷한 동작 수행 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스트림즈 어플리케이션에는 1개 이상의 스레드가 있고 스레드는 1개 이상의 태스크(task)가 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;태스크는 사용하는 토픽의 파티션 개수만큼 생성된다.&lt;/li&gt;
&lt;li&gt;토픽의 파티션과 task 를 늘려서 처리량을 높일 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림즈에서는 토픽으로부터 가져온 데이터를 KStream, KTable, GlobalKTable 의 형태로 다르게 바라볼 수 있다.&lt;/li&gt;
&lt;li&gt;카프카 스트림즈는 스트림즈DSL 과 프로세서 API 2가지 방법으로 구현할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림즈DSL 은 자주 사용될 기능들을 자체 API 로 만들어서 쉽게 개발할 수 있다.&lt;/li&gt;
&lt;li&gt;프로세서 API 는 스트림즈DSL 이 제공하지 않는 기능들이 필요할 때 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.4186%;&quot;&gt;KStream&lt;/td&gt;
&lt;td style=&quot;width: 85.5814%;&quot;&gt;토픽에 있는 모든 레코드가 조회된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.4186%;&quot;&gt;KTable&lt;/td&gt;
&lt;td style=&quot;width: 85.5814%;&quot;&gt;토픽에 있는 모든 레코드가 조회되고 메시지 키를 기준으로 최신 메시지 값으로 덮어 씌워진다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.4186%;&quot;&gt;GlobalKTable&lt;/td&gt;
&lt;td style=&quot;width: 85.5814%;&quot;&gt;KTable 과 동일하다. 다만 KTable 은 1개의 파티션이 1개의 task 에 할당되지만 이건 모든 파티션이 각 task에 할당된다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코파티셔닝&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조인을 하는 2개 데이터의 파티션 개수가 동일&lt;/li&gt;
&lt;li&gt;파티셔닝 전략이 동일&lt;/li&gt;
&lt;li&gt;GlobalKTable 이 아닌 이상 코파티셔닝이 되어야 두 토픽을 조인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조인 예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694667374448&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 토폴로지 정의

StreamsBuilder builder = new StreamsBuilder();
KStream&amp;lt;String, String&amp;gt; stream1 = builder.stream(Topic1);
KStream&amp;lt;String, String&amp;gt; stream2 = builder.stream(Topic2);
KStream&amp;lt;String, String&amp;gt; stream3 = stream1.join(
    stream2,
    (val1, val2) -&amp;gt; val1 + &quot; and &quot; + val1
)
streams3.to(Topic3);

// config 정의

Properties configs = new Properties();
configs.put(APPLICATION_ID_CONFIG, APPLICATION_NAME);
...

// kafka streams 실행

KafkaStreams streams = new KafkaStreams(builder.build(), configs);
streams.start();&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Topic1 과 Topic2 를 메시지 키 기준으로 조인하는 예제&lt;/li&gt;
&lt;li&gt;조인된 레코드의 값을 and 로 이어서 Topic3 에 적재한다.&lt;/li&gt;
&lt;li&gt;KStream-KStream 뿐 아니라 KStream-KTable, KStream-GloabalKTable 조인도 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;카프카 커넥트&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커넥트는 카프카 클러스터와 연동되어 미리 정해놓은 동작을 수행하는 파이프라인들을 반복적으로 쉽게 생성할 수 있는 도구다.&lt;/li&gt;
&lt;li&gt;커넥트는 하나의 프로세스고 여러 프로세스로 운영되는 분산 모드 커넥트가 주로 사용된다.&lt;/li&gt;
&lt;li&gt;커넥트는 커넥터 생성, 조회, 수정, 삭제 등을 할 수 있는 REST API 를 제공한다.&lt;/li&gt;
&lt;li&gt;파이프라인에는 소스 커넥터와 싱크 커넥터가 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소스 커넥터 : 어플리케이션(DB) 으로부터 데이터를 가져와서 처리한 후 카프카 토픽에 저장&lt;/li&gt;
&lt;li&gt;싱크 커넥터 : 카프카 토픽으로부터 데이터를 가져와서 처리한 후 어플리케이션(DB)에 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커넥터는 직접 구현할 수도 있고 공개된 오픈소스 커넥터를 가져와서 사용할 수도 있다.&lt;/li&gt;
&lt;li&gt;jar 파일 형태로 제공되고 jar 파일이 있는 경로를 커넥트에게 알려주면 커넥트는 해당 커넥터 파이프라인을 생성할 수 있게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시나리오&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;카프카 커넥트(프로세스)를 실행한다.&lt;/li&gt;
&lt;li&gt;REST API 를 통해 커넥트에 파이프라인 생성을 요청한다.&lt;/li&gt;
&lt;li&gt;커넥트가 커넥터를 생성해서 파이프라인을 만든다.&lt;/li&gt;
&lt;li&gt;지정한 task 개수만큼 커넥트에 새로운 task(스레드) 를 띄운다.&lt;/li&gt;
&lt;li&gt;그 쓰레드들은 여러 커넥트(프로세스)에 띄워지게 된다.&lt;/li&gt;
&lt;li&gt;파이프라인 용도에 맞게 데이터를 ETL 한다.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Data Engineer/데이터 인프라</category>
      <author>benlee73</author>
      <guid isPermaLink="true">https://benlee73.tistory.com/207</guid>
      <comments>https://benlee73.tistory.com/207#entry207comment</comments>
      <pubDate>Thu, 21 Sep 2023 12:49:55 +0900</pubDate>
    </item>
    <item>
      <title>[git] 깃허브에 push 하기 전에 다른 커밋이 쌓였을 때</title>
      <link>https://benlee73.tistory.com/206</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 상황&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIpGDG/btrX4ZPMFiW/QE5JhMolDtTZgRASKmJd9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIpGDG/btrX4ZPMFiW/QE5JhMolDtTZgRASKmJd9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIpGDG/btrX4ZPMFiW/QE5JhMolDtTZgRASKmJd9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIpGDG%2FbtrX4ZPMFiW%2FQE5JhMolDtTZgRASKmJd9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;324&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로컬 : C1 에서 작업해서 C3 커밋을 푸시하고 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 원격 : C1 뒤에 누가 C2 커밋을 푸시했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 따라서 현재 C3 가 push 되지 않는 상황&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로컬로 C2 를 가져와서 merge/rebase 한 후 push 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;rebase 후 push&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cp65Ok/btrX6n3UZ49/zoVPfQ4Kj6Wy6uaLP29Dl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cp65Ok/btrX6n3UZ49/zoVPfQ4Kj6Wy6uaLP29Dl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cp65Ok/btrX6n3UZ49/zoVPfQ4Kj6Wy6uaLP29Dl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcp65Ok%2FbtrX6n3UZ49%2FzoVPfQ4Kj6Wy6uaLP29Dl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;335&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675498755743&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1번 방법
git pull --rebase
git push

// 2번 방법
git fetch
git rebase o/main
git push&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;merge 후 push&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp3Jam/btrX3uwgUeU/psVIiBeFFd3ziNcKz1Yj41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp3Jam/btrX3uwgUeU/psVIiBeFFd3ziNcKz1Yj41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp3Jam/btrX3uwgUeU/psVIiBeFFd3ziNcKz1Yj41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp3Jam%2FbtrX3uwgUeU%2FpsVIiBeFFd3ziNcKz1Yj41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;407&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;706&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675498689894&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1번 방법
git pull
git push

// 2번 방법
git fetch
git merge o/main
git push&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 기타/git</category>
      <author>benlee73</author>
      <guid isPermaLink="true">https://benlee73.tistory.com/206</guid>
      <comments>https://benlee73.tistory.com/206#entry206comment</comments>
      <pubDate>Sat, 4 Feb 2023 17:20:18 +0900</pubDate>
    </item>
    <item>
      <title>git fetch / pull</title>
      <link>https://benlee73.tistory.com/205</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git fetch&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원격 저장소에는 있고 로컬 저장소에 없는 커밋을 다운로드 한다.&lt;/li&gt;
&lt;li&gt;원격 브랜치들이 가리키는 곳들을 업데이트한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 즉, 원격 저장소의 상태를 로컬에 있는 원격 브랜치들에 반영한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 로컬 저장소의 상태(브랜치)를 변경하진 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7bDzG/btrX8iab5dU/4T006js6tJyGvlfukZvMaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7bDzG/btrX8iab5dU/4T006js6tJyGvlfukZvMaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7bDzG/btrX8iab5dU/4T006js6tJyGvlfukZvMaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7bDzG%2FbtrX8iab5dU%2F4T006js6tJyGvlfukZvMaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;355&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675497149041&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git fetch&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 원격 저장소에서 데이터를 가져오는 명령어다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 왼쪽의 상태에서 오른쪽 상태가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 커밋 C2, C3 를 로컬 저장소로 다운로드하고 o/main 브랜치를 업데이트한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git pull&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git fetch 후 원격 브랜치와 로컬 브랜치들의 merge 까지 진행하는 명령&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQ9SPD/btrX4kfw8xP/sIcw6OSXMYIo8i51aMU4v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQ9SPD/btrX4kfw8xP/sIcw6OSXMYIo8i51aMU4v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQ9SPD/btrX4kfw8xP/sIcw6OSXMYIo8i51aMU4v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQ9SPD%2FbtrX4kfw8xP%2FsIcw6OSXMYIo8i51aMU4v1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;307&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675497597861&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git fetch
git merge o/main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 과정은 pull 명령어와 동일하다.&lt;/p&gt;
&lt;pre id=&quot;code_1675497656620&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git pull&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 기타/git</category>
      <category>git</category>
      <category>git fetch</category>
      <category>git pull</category>
      <author>benlee73</author>
      <guid isPermaLink="true">https://benlee73.tistory.com/205</guid>
      <comments>https://benlee73.tistory.com/205#entry205comment</comments>
      <pubDate>Sat, 4 Feb 2023 17:03:36 +0900</pubDate>
    </item>
    <item>
      <title>git 원격 저장소/브랜치</title>
      <link>https://benlee73.tistory.com/204</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git 원격 저장소 / 브랜치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git 을 사용할 때는 github 와 같은 원격 저장소를 주로 사용한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점 1 : 백업의 역할을 한다. 로컬에서 코드가 실수로 삭제되어도 원격 저장소에 저장되어있다.&lt;/li&gt;
&lt;li&gt;장점 2 : 공동 작업, 공유의 역할을 한다. 여러 명이 동시에 프로젝트를 하거나 코드를 공유할 때 유용하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬에서 원격 브랜치는 &amp;lt;remote name&amp;gt;/&amp;lt;branch name&amp;gt; 으로 표현된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/70FfQ/btrX1POSbJK/pKoPnbsTNUQBEFS9KEIQG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/70FfQ/btrX1POSbJK/pKoPnbsTNUQBEFS9KEIQG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/70FfQ/btrX1POSbJK/pKoPnbsTNUQBEFS9KEIQG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F70FfQ%2FbtrX1POSbJK%2FpKoPnbsTNUQBEFS9KEIQG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;69&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git 은 원격 저장소를 clone 해 오면 원격 저장소의 이름을 자동으로 origin 으로 설정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HEAD 는 origin 브랜치를 가리킬 수 없다.&lt;/li&gt;
&lt;li&gt;git 원격 작업들은 두 저장소 간의 데이터를 주고 받는 행위다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발 기타/git</category>
      <category>git</category>
      <author>benlee73</author>
      <guid isPermaLink="true">https://benlee73.tistory.com/204</guid>
      <comments>https://benlee73.tistory.com/204#entry204comment</comments>
      <pubDate>Sat, 4 Feb 2023 16:52:42 +0900</pubDate>
    </item>
    <item>
      <title>git tag (태그) 간단 설명</title>
      <link>https://benlee73.tistory.com/203</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git tag&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 깃의 branch 는 유동적으로 커밋을 가리킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중요한 커밋을 영구적으로 가리키기 위해서는 태그를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qvxsj/btrX4lZPQCy/whbdbaO4laejQvz980cFe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qvxsj/btrX4lZPQCy/whbdbaO4laejQvz980cFe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qvxsj/btrX4lZPQCy/whbdbaO4laejQvz980cFe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqvxsj%2FbtrX4lZPQCy%2FwhbdbaO4laejQvz980cFe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;310&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1675493204317&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git tag v1 C1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &quot;v1&quot; 이라는 이름의 태그를 C1 커밋에 붙였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 커밋 이름을 지정하지 않으면 현재 HEAD 가 가리키는 커밋에 태그가 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 만약 생성한 v1 태그로 switch / checkout 을 하게 되면 HEAD 가 분리되어 커밋에 붙는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 태그 자체에 HEAD 가 붙을 수는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot;&gt;https://learngitbranching.js.org/?locale=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1675493006363&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Learn Git Branching&quot; data-og-description=&quot;An interactive Git visualization tool to educate and challenge!&quot; data-og-host=&quot;learngitbranching.js.org&quot; data-og-source-url=&quot;https://learngitbranching.js.org/?locale=ko&quot; data-og-url=&quot;https://pcottle.github.io/learnGitBranching/index.html?demo&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TXDgn/hyRvd0LAX7/lw7AnfcrfbTMeR1vWe9m01/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learngitbranching.js.org/?locale=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TXDgn/hyRvd0LAX7/lw7AnfcrfbTMeR1vWe9m01/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Learn Git Branching&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An interactive Git visualization tool to educate and challenge!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learngitbranching.js.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 기타/git</category>
      <category>git</category>
      <category>tag</category>
      <author>benlee73</author>
      <guid isPermaLink="true">https://benlee73.tistory.com/203</guid>
      <comments>https://benlee73.tistory.com/203#entry203comment</comments>
      <pubDate>Sat, 4 Feb 2023 15:51:04 +0900</pubDate>
    </item>
    <item>
      <title>git cherry-pick(체리픽) 간단 설명</title>
      <link>https://benlee73.tistory.com/202</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git cherry-pick&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 브랜치에서 필요한 커밋들을 가져와서 뒤로 붙인다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6ppmP/btrXn72MY77/s07BlzkALATofOHYWpWTzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6ppmP/btrXn72MY77/s07BlzkALATofOHYWpWTzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6ppmP/btrXn72MY77/s07BlzkALATofOHYWpWTzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6ppmP%2FbtrXn72MY77%2Fs07BlzkALATofOHYWpWTzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;299&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 왼쪽 main 에서 c2, c4 커밋을 가져와서 붙이려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- rebase 와 비슷한 방법으로 붙는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 충돌이 날 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rHM7b/btrXn6bLcH6/mt2k8fVAdnWrYkmZeze3Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rHM7b/btrXn6bLcH6/mt2k8fVAdnWrYkmZeze3Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rHM7b/btrXn6bLcH6/mt2k8fVAdnWrYkmZeze3Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrHM7b%2FbtrXn6bLcH6%2Fmt2k8fVAdnWrYkmZeze3Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;736&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1674956960653&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git cherry-pick c2 c4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(main 에서 c4 를 체리픽 했을 때 충돌을 보면 c4 만의 변경 사항을 가져오는 것이 아니라 현재 브랜치와 c4 브랜치와 차이를 비교하는 것 같다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그러나 실제로 테스트를 해봤을 때는 충돌이 발생한다.&lt;/li&gt;
&lt;li&gt;예를 들어 c2, c3, c4 가 아래와 같이 수정 변화를 가지고 있다고 하자.&lt;/li&gt;
&lt;li&gt;(1) 충돌이 발생하는 경우 : c2, c3, c4 가 같은 곳을 수정했을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1675488670963&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// c2
a

// c3
a
b

// c4
a
b
c&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(2) 충돌이 발생하지 않는 경우 : c2, c3, c4 가 다른 곳을 수정했을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1675488824271&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// c2
a
b
c

// c3
aaa
b
c

// c4
aaa
b
ccc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(1) 의 경우는 같은 부분을 수정했다. c4의 변경사항인 &quot;c 문자 추가&quot;를 체리픽으로 가져오지 못하고 충돌이 발생한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 줄을 변경했다고 인식하는 것 같다. (충돌은 수정한 부분의 위치가 같으면 발생한다.)&lt;/li&gt;
&lt;li&gt;c2 의 &quot;아무것도 변경하지 않음&quot;의 상태와 &quot;b, c를 추가한 상태&quot; 를 같은 줄을 변경했다고 해서 어느 쪽을 선택할 것인지에 대한 충돌로 보인다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(2) 의 경우는 &quot;aaa&quot; 변화와 &quot;ccc&quot; 변화가 따로 저장되는지 &quot;ccc&quot; 변화를 체리픽으로 가져올 수 있다.&lt;/li&gt;
&lt;li&gt;혹여나 문제가 발생하면 --abort 옵션(or --skip)으로 되돌리면 된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git cherry-pick --abort&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot;&gt;https://learngitbranching.js.org/?locale=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1674956891677&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Learn Git Branching&quot; data-og-description=&quot;An interactive Git visualization tool to educate and challenge!&quot; data-og-host=&quot;learngitbranching.js.org&quot; data-og-source-url=&quot;https://learngitbranching.js.org/?locale=ko&quot; data-og-url=&quot;https://pcottle.github.io/learnGitBranching/index.html?demo&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/D6JQf/hyRra3DS5k/w1i3CnJP9g4MKOiLRIwHkk/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learngitbranching.js.org/?locale=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/D6JQf/hyRra3DS5k/w1i3CnJP9g4MKOiLRIwHkk/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Learn Git Branching&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An interactive Git visualization tool to educate and challenge!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learngitbranching.js.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 기타/git</category>
      <category>Cherry-pick</category>
      <category>git</category>
      <author>benlee73</author>
      <guid isPermaLink="true">https://benlee73.tistory.com/202</guid>
      <comments>https://benlee73.tistory.com/202#entry202comment</comments>
      <pubDate>Sun, 29 Jan 2023 11:08:29 +0900</pubDate>
    </item>
    <item>
      <title>git 되돌리기(reset, revert) 간단 설명</title>
      <link>https://benlee73.tistory.com/201</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git reset&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜치를 지정한 커밋으로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정한 커밋은 부모쪽 커밋일수도 자식쪽 커밋일수도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEOeb/btrWVLlwWQp/WAHHciWMhUB9nsh5vrjRF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEOeb/btrWVLlwWQp/WAHHciWMhUB9nsh5vrjRF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEOeb/btrWVLlwWQp/WAHHciWMhUB9nsh5vrjRF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEOeb%2FbtrWVLlwWQp%2FWAHHciWMhUB9nsh5vrjRF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;348&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- hard : 돌아가려는 커밋 이후의 모든 내용들이 사라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- soft : 돌아가려는 커밋으로 돌아가고 이후의 모든 내용들이 stage 상태로 남아있다. (git add 된 상태) 커밋을 다시 할 수 있는 상태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- mixed : 돌아가려는 커밋으로 돌아가고 이후의 모든 내용들이 unstage 상태로 남아있다. (git add 이전 상태) (default)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(hard 옵션은 git branch -f main main~1 와 같은 것 같다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(hard 옵션은 변경사항 다 무시하고 해당 브랜치, 커밋으로 이동시킨다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR6zR0/btrWYMYvMZe/eLWgLmpG5BU7UnjfzUykhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR6zR0/btrWYMYvMZe/eLWgLmpG5BU7UnjfzUykhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR6zR0/btrWYMYvMZe/eLWgLmpG5BU7UnjfzUykhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR6zR0%2FbtrWYMYvMZe%2FeLWgLmpG5BU7UnjfzUykhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;347&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1674528879271&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git reset main~1
git reset main^

git reset HEAD~1
git reset HEAD^

git reset c1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 돌아가고 싶은 커밋이나 브랜치를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- reset 은 git push 을 하기 전에 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git revert&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CWp40/btrWTJIu1Ur/pLkyeOxAI8i3jKJDHhscQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CWp40/btrWTJIu1Ur/pLkyeOxAI8i3jKJDHhscQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CWp40/btrWTJIu1Ur/pLkyeOxAI8i3jKJDHhscQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCWp40%2FbtrWTJIu1Ur%2FpLkyeOxAI8i3jKJDHhscQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;362&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- git revert 는 입력한 버전의 이전 버전으로 되돌리는 명령어다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력한 버전에 적용된 변경사항만 적용되는 것을 주의해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 따라서 여러 커밋을 건너 뛰기 위해서는 git revert 를 여러번 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mE8bI/btrWS3mFyPr/QBu05ooRKffSKNHVkCE6F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mE8bI/btrWS3mFyPr/QBu05ooRKffSKNHVkCE6F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mE8bI/btrWS3mFyPr/QBu05ooRKffSKNHVkCE6F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmE8bI%2FbtrWS3mFyPr%2FQBu05ooRKffSKNHVkCE6F1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;357&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1674528966396&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git revert HEAD
git revert main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 되돌리고 싶은 커밋을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- c2 를 입력하면 c2 에 저장된 c1 으로부터 변경 사항들을 되돌려서 c2' 커밋을 만드는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- c1 처럼 중간에 껴있는 커밋을 제거할 수 있다. (충돌이 날 수 있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 제거했다는 이력이 남는 것이 reset 과의 차이점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot;&gt;https://learngitbranching.js.org/?locale=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1674528649440&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Learn Git Branching&quot; data-og-description=&quot;An interactive Git visualization tool to educate and challenge!&quot; data-og-host=&quot;learngitbranching.js.org&quot; data-og-source-url=&quot;https://learngitbranching.js.org/?locale=ko&quot; data-og-url=&quot;https://pcottle.github.io/learnGitBranching/index.html?demo&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LBVaf/hyRncaostj/kvPqMkCtm3OAp2FqD08Iu0/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learngitbranching.js.org/?locale=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LBVaf/hyRncaostj/kvPqMkCtm3OAp2FqD08Iu0/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Learn Git Branching&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An interactive Git visualization tool to educate and challenge!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learngitbranching.js.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 기타/git</category>
      <author>benlee73</author>
      <guid isPermaLink="true">https://benlee73.tistory.com/201</guid>
      <comments>https://benlee73.tistory.com/201#entry201comment</comments>
      <pubDate>Sun, 29 Jan 2023 10:41:40 +0900</pubDate>
    </item>
    <item>
      <title>git HEAD 간단 설명</title>
      <link>https://benlee73.tistory.com/200</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;HEAD&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 작업중인 커밋을 가리킨다.&lt;/li&gt;
&lt;li&gt;커밋을 직접 가리킬 수도 있지만 일반적으로 커밋을 가리키는 브랜치를 가리킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnrjl0/btrW1NJoDOJ/7fBIMLP26SLrexaoKGrKh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnrjl0/btrW1NJoDOJ/7fBIMLP26SLrexaoKGrKh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnrjl0/btrW1NJoDOJ/7fBIMLP26SLrexaoKGrKh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnrjl0%2FbtrW1NJoDOJ%2F7fBIMLP26SLrexaoKGrKh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;234&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HEAD &amp;rarr; main &amp;rarr; c1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HEAD 는 * 표시로 표현된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 HEAD 는 main 브랜치를 가리킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 main 브랜치는 c1 커밋을 가리킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbMn5C/btrWX5KyRvU/rLcp8COXRh1KiPTWPC8OE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbMn5C/btrWX5KyRvU/rLcp8COXRh1KiPTWPC8OE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbMn5C/btrWX5KyRvU/rLcp8COXRh1KiPTWPC8OE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbMn5C%2FbtrWX5KyRvU%2FrLcp8COXRh1KiPTWPC8OE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;454&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1674526574265&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git checkout c1
or
git switch c1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HEAD &amp;rarr; c1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main&amp;nbsp; &amp;nbsp;&amp;rarr; c1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HEAD 가 브랜치가 아니라 커밋을 직접 가리키도록 분리됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;HEAD 이동&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5YG32/btrWWslIRPQ/yWHbe3ywnhZt8wQNPLuZG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5YG32/btrWWslIRPQ/yWHbe3ywnhZt8wQNPLuZG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5YG32/btrWWslIRPQ/yWHbe3ywnhZt8wQNPLuZG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5YG32%2FbtrWWslIRPQ%2FyWHbe3ywnhZt8wQNPLuZG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;367&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HEAD 를 옮기기 위해서는 캐럿(^) 과 틸드(~) 를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이를 &lt;b&gt;상대 참조&lt;/b&gt; 라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 커밋의 해시를 직접 작성하기엔 어렵기 때문에 많이 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- switch 나 checkout 명령어를 사용하면 된다. (둘의 차이는 나중에 살펴보자.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 HEAD 는 c3 커밋의 main 브랜치를 가리킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- c0 커밋을 가리키도록 수정해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btiRLr/btrWS2H5UAP/rKr6Szrzan0F59rwnXR4i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btiRLr/btrWS2H5UAP/rKr6Szrzan0F59rwnXR4i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btiRLr/btrWS2H5UAP/rKr6Szrzan0F59rwnXR4i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtiRLr%2FbtrWS2H5UAP%2FrKr6Szrzan0F59rwnXR4i1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;353&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1674527310618&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git switch HEAD^^^
git switch main^^^
git switch HEAD~3
git switch main~3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;브랜치 옮기기&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEn9a5/btrW1Pf9t7m/Pqgjse0kSVnZNLe3PEIJB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEn9a5/btrW1Pf9t7m/Pqgjse0kSVnZNLe3PEIJB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEn9a5/btrW1Pf9t7m/Pqgjse0kSVnZNLe3PEIJB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEn9a5%2FbtrW1Pf9t7m%2FPqgjse0kSVnZNLe3PEIJB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;330&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- main 브랜치가 c1 을 가리키도록 만들어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- branch -f 명령어를 사용한다. (강제로 옮긴다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상대 참조를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- (HEAD 가 가리키는 현재 브랜치가 아닌 브랜치만 강제 이동이 가능한 것 같다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buCc0p/btrWRWn2081/iESJYK2YAjPQrX8t0hrKUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buCc0p/btrWRWn2081/iESJYK2YAjPQrX8t0hrKUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buCc0p/btrWRWn2081/iESJYK2YAjPQrX8t0hrKUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuCc0p%2FbtrWRWn2081%2FiESJYK2YAjPQrX8t0hrKUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;326&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1674527631142&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git branch -f main HEAD^^^
git branch -f main main^^^
git branch -f main bugFix^^^

git branch -f main HEAD~3
git branch -f main main~3
git branch -f main bugFix~3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- switch 나 checkout 은 브랜치의 변화 없이 HEAD 만 변경하는 작업이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HEAD 가 특정 커밋을 가리키게 하거나 특정 브랜치를 가리키도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 브랜치를 이동하고 싶으면 branch -f 명령어를 사용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot;&gt;https://learngitbranching.js.org/?locale=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1674526279210&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Learn Git Branching&quot; data-og-description=&quot;An interactive Git visualization tool to educate and challenge!&quot; data-og-host=&quot;learngitbranching.js.org&quot; data-og-source-url=&quot;https://learngitbranching.js.org/?locale=ko&quot; data-og-url=&quot;https://pcottle.github.io/learnGitBranching/index.html?demo&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LBVaf/hyRncaostj/kvPqMkCtm3OAp2FqD08Iu0/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learngitbranching.js.org/?locale=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LBVaf/hyRncaostj/kvPqMkCtm3OAp2FqD08Iu0/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Learn Git Branching&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An interactive Git visualization tool to educate and challenge!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learngitbranching.js.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>개발 기타/git</category>
      <category>git</category>
      <category>git head</category>
      <category>Head</category>
      <author>benlee73</author>
      <guid isPermaLink="true">https://benlee73.tistory.com/200</guid>
      <comments>https://benlee73.tistory.com/200#entry200comment</comments>
      <pubDate>Tue, 24 Jan 2023 11:17:54 +0900</pubDate>
    </item>
    <item>
      <title>git rebase 간단 설명</title>
      <link>https://benlee73.tistory.com/199</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git rebase&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git merge 와 같이 두 커밋을 합치는 작업이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git rebase 는 커밋들을 한 줄로 깔끔하게 만들고 커밋의 순서를 만들어준다는 특징이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예시를 보며 쉽게 이해해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4HYu3/btrWU7a4p8d/vBB7PbkhBScXhIUOXbLhjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4HYu3/btrWU7a4p8d/vBB7PbkhBScXhIUOXbLhjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4HYu3/btrWU7a4p8d/vBB7PbkhBScXhIUOXbLhjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4HYu3%2FbtrWU7a4p8d%2FvBB7PbkhBScXhIUOXbLhjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;337&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;왼쪽&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;처럼 c2, c3 커밋을 각각 가리키는 bugFix, main 브랜치가 있다고 하자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;- 현재 가리키고 있는 브랜치는 bugFix 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;- git rebase 명령어로 2개를 합쳐보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VSzYM/btrWXjCelaF/XkYCkUwqhVeKk6bF95Nf91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VSzYM/btrWXjCelaF/XkYCkUwqhVeKk6bF95Nf91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VSzYM/btrWXjCelaF/XkYCkUwqhVeKk6bF95Nf91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVSzYM%2FbtrWXjCelaF%2FXkYCkUwqhVeKk6bF95Nf91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;301&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1674525582442&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git rebase main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- main 과 bugFix 는 따로 작업했지만 순서대로 작업한 것처럼 보이게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존에 있던 c3 커밋은 없어지지 않았지만 가리키는 브랜치가 없어서 흐릿해진 상황이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 같은 방법으로 main 을 c3' 커밋으로 옮겨보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lWMlr/btrWS2nMsMJ/ueA2Kn0rObvvbIjrlC9Zck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lWMlr/btrWS2nMsMJ/ueA2Kn0rObvvbIjrlC9Zck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lWMlr/btrWS2nMsMJ/ueA2Kn0rObvvbIjrlC9Zck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlWMlr%2FbtrWS2nMsMJ%2FueA2Kn0rObvvbIjrlC9Zck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;289&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1674525747521&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git switch main
git rebase bugFix&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- main 이 bugFix 의 부모에 있는 상황에서는 rebase 했을 때 자식 커밋으로 이동하는 것이 전부다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- merge 는 어느쪽으로 머지해도 결국 같은 커밋이 만들어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하지만 rebase 는 순서에 따라 만들어지는 브랜치가 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 더 최근에 작업한 것처럼 보여지고 싶은 커밋이 있다면 그 커밋을 가리킨 상태에서 rebase 를 해야한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git rebase -i&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBfjCa/btrX8iVvvsr/cbHkAIRICjZwHlFEK2zbJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBfjCa/btrX8iVvvsr/cbHkAIRICjZwHlFEK2zbJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBfjCa/btrX8iVvvsr/cbHkAIRICjZwHlFEK2zbJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBfjCa%2FbtrX8iVvvsr%2FcbHkAIRICjZwHlFEK2zbJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;561&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 왼쪽을 오른쪽으로 바꾸는 방법이다.&lt;/p&gt;
&lt;pre id=&quot;code_1675490925440&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git rebase -i main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &quot;-i&quot; 옵션이 없을 때는 &lt;i&gt;Current branch b1 is up to date.&lt;/i&gt; 라고 나올 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &quot;-i&quot; 옵션을 붙이면 b1 과 main 사이의 커밋들의 순서를 바꾸거나 커밋을 제거할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위 명령어의 의미는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 현재 브랜치(b1)를 지정한 브랜치(main) 뒤에 붙일 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 그러면 c2, c3, c4 를 붙여야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 이 커밋들을 그대로 붙일 수도 있지만 수정할 수 도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 제거하고 싶은 커밋은 제거하고 순서를 변경해서 붙인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 만약 c2, c3, c4 를 그대로 붙인다면 &quot;-i&quot; 옵션이 붙지 않았을 때와 동일하며 변경 사항 없이 현재 상태가 유지된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;- &lt;/span&gt;예시 하나만 더 보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tXkCi/btrX2YYEYKi/L8hfbvbYXkyMefVR1jANZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tXkCi/btrX2YYEYKi/L8hfbvbYXkyMefVR1jANZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tXkCi/btrX2YYEYKi/L8hfbvbYXkyMefVR1jANZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtXkCi%2FbtrX2YYEYKi%2FL8hfbvbYXkyMefVR1jANZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;1080&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1675492526754&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git rebase -i main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; b1 브랜치를 main 뒤에 붙이자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 두 브랜치의 가장 가까운 공통 부모는 c1 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; c1 부터 b1 까지의 커밋 c2, c3, c4 를 main 뒤에 붙이자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 제거하고 싶은 커밋 c3 를 제거한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; c2, c4 의 순서를 바꿔서 붙이자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot;&gt;https://learngitbranching.js.org/?locale=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1674525997333&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Learn Git Branching&quot; data-og-description=&quot;An interactive Git visualization tool to educate and challenge!&quot; data-og-host=&quot;learngitbranching.js.org&quot; data-og-source-url=&quot;https://learngitbranching.js.org/?locale=ko&quot; data-og-url=&quot;https://pcottle.github.io/learnGitBranching/index.html?demo&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LBVaf/hyRncaostj/kvPqMkCtm3OAp2FqD08Iu0/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learngitbranching.js.org/?locale=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LBVaf/hyRncaostj/kvPqMkCtm3OAp2FqD08Iu0/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Learn Git Branching&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An interactive Git visualization tool to educate and challenge!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learngitbranching.js.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 기타/git</category>
      <category>git</category>
      <category>Git Rebase</category>
      <category>rebase</category>
      <author>benlee73</author>
      <guid isPermaLink="true">https://benlee73.tistory.com/199</guid>
      <comments>https://benlee73.tistory.com/199#entry199comment</comments>
      <pubDate>Tue, 24 Jan 2023 11:08:28 +0900</pubDate>
    </item>
    <item>
      <title>git merge 간단 설명</title>
      <link>https://benlee73.tistory.com/198</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;git merge&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개의 커밋을 부모로 갖는 새로운 커밋을 만드는 작업이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개의 커밋을 합친다고 생각해도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFhcbo/btrWUbShG8S/FUI7ALEHAPKNZuvxBPssF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFhcbo/btrWUbShG8S/FUI7ALEHAPKNZuvxBPssF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFhcbo/btrWUbShG8S/FUI7ALEHAPKNZuvxBPssF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFhcbo%2FbtrWUbShG8S%2FFUI7ALEHAPKNZuvxBPssF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;230&quot; height=&quot;750&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 왼쪽&lt;/span&gt;처럼 c2, c3 커밋을 각각 가리키는 bugFix, main 브랜치가 있다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 가리키고 있는 브랜치는 main 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- git merge 명령어로 2개를 합쳐보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cODP2Y/btrWRXtFPSP/FmBo6v2dtqKwIJDDQCwKWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cODP2Y/btrWRXtFPSP/FmBo6v2dtqKwIJDDQCwKWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cODP2Y/btrWRXtFPSP/FmBo6v2dtqKwIJDDQCwKWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcODP2Y%2FbtrWRXtFPSP%2FFmBo6v2dtqKwIJDDQCwKWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;230&quot; height=&quot;746&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674524799004&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git merge bugFix&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- c2, c3 를 부모로 갖는 새로운 커밋 c4 가 생성됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존에 가리키고 있던 main 브랜치가 c4 를 가리키게 됐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 같은 방법으로 git merge 로 bugFix 도 c4 를 가리키게 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5oSd8/btrWSwihO0a/mFOiENfEDJRMvj7izjkwb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5oSd8/btrWSwihO0a/mFOiENfEDJRMvj7izjkwb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5oSd8/btrWSwihO0a/mFOiENfEDJRMvj7izjkwb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5oSd8%2FbtrWSwihO0a%2FmFOiENfEDJRMvj7izjkwb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;230&quot; height=&quot;776&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1674524975834&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git switch bugFix
git merge main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이를 통해 알 수 있는 것은 &lt;b&gt;어디서 어디로 merge 하든 결국 같은 커밋이 만들어진다는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot;&gt;https://learngitbranching.js.org/?locale=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1674525324200&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Learn Git Branching&quot; data-og-description=&quot;An interactive Git visualization tool to educate and challenge!&quot; data-og-host=&quot;learngitbranching.js.org&quot; data-og-source-url=&quot;https://learngitbranching.js.org/?locale=ko&quot; data-og-url=&quot;https://pcottle.github.io/learnGitBranching/index.html?demo&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LBVaf/hyRncaostj/kvPqMkCtm3OAp2FqD08Iu0/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647&quot;&gt;&lt;a href=&quot;https://learngitbranching.js.org/?locale=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learngitbranching.js.org/?locale=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LBVaf/hyRncaostj/kvPqMkCtm3OAp2FqD08Iu0/img.png?width=959&amp;amp;height=647&amp;amp;face=0_0_959_647');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Learn Git Branching&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An interactive Git visualization tool to educate and challenge!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learngitbranching.js.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발 기타/git</category>
      <category>git</category>
      <category>git merge</category>
      <category>Merge</category>
      <author>benlee73</author>
      <guid isPermaLink="true">https://benlee73.tistory.com/198</guid>
      <comments>https://benlee73.tistory.com/198#entry198comment</comments>
      <pubDate>Tue, 24 Jan 2023 10:54:58 +0900</pubDate>
    </item>
  </channel>
</rss>