Git test

15554 단어 gitgit

Q1.

  1. git log: 다음 그림 git_test_Q01.png 와 완전히 동일한 log를 출력하시오.

A1.

주도권을 가지고 다른 브랜치를 merge할 것이다!

  1. 주도권을 가진 브랜치로 checkout
  • $ git checkout master
  1. merge할 브랜치를 merge
  • $ git merge server

  • 만약 (master) $ git merge server에서 conflict 발생 시!
  1. merge abort 하려면 $ git merge --abort

  1. conflict 발생한 file 수정

  1. modify & save

  1. conflict 발생한 file 다시 $ git add <conflicted file>

  1. 계속 merge 수행

    • 다시 commit $ git commit -m"COMMIT MESSAGE"
    • merge 완료


bonus

  1. 완전히 merged 브랜치 지우고 싶다: $ git branch -d [BRANCH]
  2. merge되지 않았더라도 그 브랜치를 지울 것이다.: $ git branch -D [BRANCH]
  • 브랜치 지우기
$ git branch -d server
$ git branch -d client


Q2.

  1. git log: 2012년 8월 18일에 작성된(Author date) commit의 목록을 출력하시오.

A2.

  • git log [OPTION]
    • --since= 해당 일 이상
    • --until= 해당 일 미만 (공식 문서에는 '이하'로 되어있지만 실제로 써보면 '미만'임)

$ git log --since=2012-08-18 --until=2012-08-19


Q3.

  1. git log: 가장 최근 10개의 commit log를 다음 형식으로 출력하시오.
    2458a4 Sat Aug 18 11:47:08 2012 -0400 Reenable copy/rename detection in the status view

A3.

$ git log --all --pretty="%h %cd %s" -10


Q4.

  1. git log: tig의 수정 내역을 검토하던 중 중간에 Copyright 문구가 여러 번 바뀐 것이 발견되었다.
    4-1) io.h 파일의 Copyright가 가장 최근에 변경된 것은 어떤 commit인가?
    4-2) io.h 파일의 Copyright가 2006-2010에서 2006-2012으로 변경된 commit은 어떤 것인가?

A4-1.

$ git log --all -p -S "Copyright" --follow io.h

그런데 그냥..
$ git log --all -p --follow io.h 해서 안에서 /Copyright 하는 것도 괜찮음

더 다양한 정보가 나옴. -S 옵션으로는 못보던거임

  • A4-1: $ git log --all -p --follow io.h -> /Copyright로 구한 0609a8 커밋

A4-2.

$ git log --all -p --follow io.h -> /Copyright로 수동으로 찾았음
-S Copyright, --grep "Copyright"로는 안잡힘


Q5.

git commit: graph.c 의 indentation이 마음에 들지 않아 코드 정리를 하려고 한다.
git_devel 에는 이미 코드가 수정되어 있다.
다음 수정을 하나의 commit으로, 나머지 부분을 다른 하나의 commit으로하여 git_devel에 반영하시오.

A5.

??


Q6.

  1. tig_release git를 만드는 도중 이전 commit log message에서 오타가 발견되었다. 다음 오타를 수정하시오.
    e4f5f66 Reconsile tig-1.2
    d5812d1 Reconsier tig-1.1 <== 오타 수정
    f91cb9a Reconsile tig-1.0
    bc31be9 Reconsile tig-0.18

A6

  1. d5812d1 (Reconsider tig-1.1) 커밋으로 Checkout!
    1.1 $ git checkout d5812d1
    1.2 $ git checkout HEAD^

  1. commit --amend 로 이미 된 커밋 수정
$ git commit --amend

저장후 나감


새로운 커밋이 만들어짐


3-1. 방법 1. rebase

(fc3383a) $ git checkout master
(master) $ git rebase fc3383a

그런데 이렇게하면, 같은 remote의 repository를 쓰는 사람들한테 피해를 입힘


3-2. 방법 2. merge

$ git checkout master
$ git merge master

엄청 conflict난다.
수정하고 나서

$ git merge --continue

$ git branch master HEAD

$ git commit --amend

"Reconsile tig-1.2"


Q7.

  1. modify git history: 만들어진 tig_release git의 history를 검토하던 중, .gitignore 파일이 처음 추가된 것은 0.4와 0.5 사이였으나, tig_release git에는 Reconsile tig-0.10에 처음으로 포함된 오류가 발견되었다.
    tig_release git의 Reconsile tig-0.5 부터 0.9의 각 commit에 정확히 맞는 버젼의 .gitignore 파일을 추가하여 문제를 해결하시오


A7-1. tig_release에서 작업

  1. $ git checkout to tig-0.5

    .gitignore 없음

  1. .gitignore 추가
(tig-0.5) $ git add .gitignore	# .gitignore 추가
(tig-0.5) $ git commit --amend	# 커밋 수정

  • 커밋이 새로 만들어짐
  • original커밋의 부모(HEAD^) 커밋이 새로운 base가 됨

  1. rebase
(cd3bef5) $ git checkout master
(master) $ git rebase cd3bef5
충돌발생

  • conflict를 수정 후 git add -> git rebase --continue
$ git add .gitignore
$ git rebase --conitniue


  • 노가다 수행

Q8.

  1. migration: tig_release git의 관리 정책이 변경되었다.
    tig 1.2 이전에는 minor version change마다 tig_devel에서 tig_release로 변경된 내용을 이전하였으나, tig 1.2부터는 각각의 commit을 tig_devel에서 tig_release로 이전한다.
    (squash merge -> history 유지 로 정책 변경)
    tig_release과 tig_devel git을 비교하여 tig_release에 부족한 내용을 tig_devel에서 이전하라.
    Commiter 정보는 변경되어도 상관 없으나, Author 정보가 변경되어서는 안 된다.

A8.

  1. What is Author and Committer??

$ git log --all --oneline --pretty="Author name: %an Committer name: %cn"


1-1. Author

  • Author: 코드처음만듦 + 커밋도 한사람
  • 그냥 $ git log 하면 나오는게 Author Name, Author Date
  • how to fix author existing commit?
    • 해당 커밋으로 checkout해서
    • $ git commit --amend --author="작성자명 <email 주소>"
    • $ git commit --amend 후 직접 수정

1-2. Committer

  • Committer: Author 가 write하고 commit한 것을 기반으로 가장 최근에 Modify하고 커밋한 사람

  • How to check who is committer?

    • $ git config --list
      현재 시스템에서 git commit 하면 반영되는 committer 정보

    • $ git log --pretty="%cn"


1. squash를 시작할 커밋으로 checkout

$ git checkout 4c6fabc2

  1. 시작할 커밋HEADrebase -i [포함할 커밋의 부모(^ -1 커밋)]
(4c6fabc2) $ git rebase -i 800a900c
 ̄ ̄ ̄ ̄ ̄ ̄                  ̄ ̄ ̄ ̄ ̄ 포함할 커밋의 부모!!!!!!
포함 시작할 커밋에서!!!


  1. 아래와 같은 화면으로 바뀐다.

  1. 아래와 같이 골라서 수정한다.

  1. 커밋 메시지 수정 화면이 뜬다.

  1. 기존에 있던게 하나로 싹 합쳐져서 없어지는게 아닌 새로운 분기로 만들어짐

  1. checkout 해서 새 Tag 붙임
$ git checkout bdc97fef
(bdc97fef) $ git tag tig-0.1_new


  1. 또 tig-0.2를 squash
$ git checkout 6706b2b
(6706b2b) $ git rebase -i 4c6fabc2


커밋메시지 수정

$ git checkout cf734590
$ git tag tig-0.2_new


  • rebase는 (HEAD) $ git rebase <TARGET BRANCH>로 사용
$ git checkout bdc97fef
(bdc97fef) $ git rebase <tig-0.2의 직전 브랜치>

Q9.

그냥 메이저마다 $ git tag [TAG NAME]

좋은 웹페이지 즐겨찾기