Git - branch / merge / cherrypick / revert

markyang92·2021년 4월 23일
0

git

목록 보기
4/14
post-thumbnail

git branch

새 branch 만들기

$ git branch <branch 이름>
  • 만약 temp 라는 브랜치를 만든다면
$ git branch temp

  • main, temp 브랜치가 Commit 2를 동시에 보고 있음
    • 방금 새로생긴 temp 브랜치는 remote server에서 모르고 있음

--merged/--no-merged

  • $ git branch --merged: 현재 브랜치의 기준으로 Merged된 브랜치인지? 필터링해 볼 수 있다.
(HEAD->new) $ git branch --merged
   main			# 
 * new			# 이 브랜치는 위의 'main'과 'poweraid'가 합쳐진 것입니다.
   poweraid		# 

  • git branch --no-merged: 현재 브랜치의 기준으로 병합 안된 다른 브랜치 있는지?

브랜치 제거

  • $ git branch -d [제거할 브랜치]
  • $ git branch -D [강제 제거할 브랜치]
$ git branch -d poweraid

  • 브랜치 제거됨

브랜치 포인트 옮기기

  • HEAD가 아닌, main 브랜치 포인트를 옮기기
    $ git branch -f [BRANCH] [어디로?]
    $ git branch -f main HEAD^2
  • 따라서 현재 mainorigin/main보다 뒤쳐 졌다면, 아래의 명령어로 local/main이 -> origin/main을 가르키게한다.
$ git branch main origin/main 

git merge

  1. 어떤 브랜치합칠 것인가?


  1. 병합 대장이 되는 대상에 checkout
$ git checkout main

  1. 병합 먹을 브랜치를 merge!!!
  • $ git merge <병합 먹을 브랜치>
$ git merge client
# 충돌 시, 충돌 파일 수정 후
$ git add [충돌 파일1[...]]
$ git commit -m"merge1"


$ git merge new
# 충돌 시, 충돌 파일 수정 후
$ git add [충돌 파일1[...]][
$ git commit -m"merge2"

merge conflict

# 현재 브랜치는 new
$ git merge poweraid
자동 병합: test.txt
충돌 (내용): test.txt에 병합 충돌
자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.


-> 수정

$ git add test.txt	# 다시 add
$ git commit -m "merge" or $ git commit --amend	# 재 커밋 해야함


git revert

  • git revertreset 처럼 commit을 되돌린다.
    • git revert <되돌아 가고 싶은 commit>

  • git reset과의 차이점은 무엇인가?
    • 되돌림 하는 것은 같지만 되돌리는 commit까지 이력이 남느냐?
  • git reset되돌리면 그 이전은 사라짐
  • git revert되돌린 것도 유지되고 revert된 것도 commit으로 남음

cherrypick

$ git cherry-pick [COMMIT]

  • 아래와 같은 상황
    • local/main-> argparse, subprocess update
    • origin/main -> dijkstra algorithm
  • 목표
    • origin/main에 있는 dijkstra algorithm '커밋'만 local/maincherrypick하고 싶다.

  1. HEAD를 '주도할' 브랜치로 옮긴다.
$ git checkout main # local/main
  • 결과

  1. 아래의 명령어로 cherry-pick 을 수행한다.
(HEAD -> main) $ git cherry-pick [cherry-pick할 커밋]
1. git cherry-pick origin/main
2. git cherry-pick e9e6c7c

  • 여기서 Conflict 발생 시, 2 가지 경우가 있음
    1. conflict파일을 수정 -> git add -> $ git cherry-pick --continue
    2. 이 패치를 넘기기: $ git cherry-pick --skip
    3. 체리픽 취소 : $ git cherry-pick --abort

conflict 수정 후, continue

  1. conflict가 날 수 있음
  • 메시지를 체크하자.
    • dijkstra/dijkstra.py에서 충돌

1-1. 문제가 난 파일을 수정하자

  • 본인은 dijkstra.py를 origin/main 기준으로 할거임
  • 다 수정 하면 $ git add conflicted_file
(HEAD -> main) $ git add dijkstra/dijkstra.py

  1. 다 수정 후엔 $ git cherry-pick --continue
(HEAD -> main) $ git cherry-pick --continue

  1. commit-message창이 뜸수정 후, 저장하고 나오면 커밋 완료


  1. remote 저장소에 push
(HEAD -> main) $ git push origin main [-f]
  • 아마, remote 저장소에서 보는 main은위와 같기 때문에 위와 같이 local 커밋이 생긴 것도 말이 안되서 Error 유발 할 수 있음, 왜냐하면 최종 올릴 커밋 모양은 아래와 같기 때문
  • 다른 사람과 이 저장소를 공유하지 않는다면 force push하자.
    • 결과:

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글