#title Git & Tip

[[TableOfContents]]

=== 일반 ===
==== 알아두면 좋은 기능 ====
===== alias g='git' =====
===== stashing =====
현재 브랜치에서 작업중인 내용을 임시로 저장하고 다른 브랜치로 이동할 때 사용한다.
===== blame =====
파일 라인 단위로 누가 마지막으로 수정했는지 보여준다.
http://git-scm.com/docs/git-blame
==== 작업의 취소 ====
http://www.evernote.com/l/AMKuBFPL-uZItrAAGvEbqooTf52dvpkR1rQ/
==== push의 취소 ====
http://whiteship.me/?p=13516

=== commit ===
==== commit 메시지 수정 ====
===== 마지막 커밋을 수정하기 =====
[[Code($ git commit --amend)]]
마지막 커밋을 수정하는 방법은 매우 간단하다. 이 명령으로 텍스트 편집기가 열리고 메시지를 수정하면 된다.

===== 커밋 메시지를 여러 개 수정하기 =====
예를 들어 마지막 3번째에 있는 커밋 로그를 수정하고 싶다면 rebase -i를 사용해서 수정해야 한다. 주의할 점은 이미 서버에 push된 커밋은 SHA-1 값이 바뀌기 때문에 가능하면 수정하지 말아야 한다. 만약 rebase에 익숙하지 않다면 다음을 주의 깊게 봐야 한다. https://git-scm.com/book/ko/v1/Git-%EB%8F%84%EA%B5%AC-%ED%9E%88%EC%8A%A4%ED%86%A0%EB%A6%AC-%EB%8B%A8%EC%9E%A5%ED%95%98%EA%B8%B0

[[Code($ git rebase -i HEAD~3)]]

텍스트 편집기가 열리면 다음 같은 커밋 목록이 첨부되어 있다.

{{{
pick ...
pick ...
pick ...
}}}

여기서 커밋 목록 순서는 위쪽이 오래된 것이다. 마지막 3번째 커밋 메시지를 수정하려면 pick을 edit로 변경하고 저장 및 종료한다.

{{{
edit ...
pick ...
pick ...
}}}

저장하고 편집기를 종료하면 Git은 목록에 있는 커밋 중에서 가장 오래된 커밋으로 이동하고, 아래와 같이 다음은 어떻게 해야하는지 메시지를 보여준다.

{{{
$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

       git commit --amend

Once you’re satisfied with your changes, run

       git rebase --continue
}}}

마지막 커밋 메시지를 변경했을 때와 같이 [[code(git commit --amend)]] 으로 메시지를 변경하고 [[code(git rebase --continue)]]로 rebase를 계속한다. 이것을 반복하면 어떤 위치의 커밋 메시지도 수정할 수 있다. 다시 말하지만 주의할 점은 이미 서버에 push된 커밋은 SHA-1 값이 바뀌기 때문에 동료 개발자들을 혼란스럽게 할 가능성이 있으며 가능하면 수정하지 말아야 한다.

=== log ===
==== commit 메시지의 첫 번째 줄만 출력 ====
[[code(git log --pretty=short)]]

==== 파일의 변경된 내용까지 출력 ====
[[code(git log -p)]]

==== 브랜치를 시각적으로  확인 ====
[[code(git log --graph)]]

=== branch ===
==== 브랜치 확인 ====
현재 브랜치
[[code(git branch)]]
모든 브랜치
[[code(git branch -a)]]

==== 브랜치를 만들고 변경 ====
예) hotfix-A 브랜치로 변경
[[code(git checkout -b hotfix-A)]]

[[code(checkout -b)]]는 [[code(git branch hotfix-A)]] 브랜치를 만들고, [[code(git branch checkout hotfix-A)]] hotfix-A 브랜치로 이동하는 것과 동일함.

=== merge ===
==== 머지하는 것을 기록으로 남김 ====
예) hotfix-A 브랜치에서 master 브랜치로 이동하여 master에 hotfix-A 브랜치를 merge.
[[code(git checkout master)]] 마스터로 이동
[[code(git merge --no-ff hotfix-A)]]

[[code(--no-ff)]] 옵션을 주면 merge commit 메시지 작성을 위한 에디터가 실행됨.

{{{
Merge Branch 'hotfix-A'

# Please enter a commit message to explain why this merge is necessary,
# ...
}}}

==== 머지 conflict 해결 ====
예)
1. 충돌 발생
{{{
<<<<<<< HEAD
...
=======
...
>>>>>>> hotfix-A
}}}

2. ===, <<<,  >>> 표시를 삭제하고 충돌문제를 해결한 후 저장한다.

3. 문제를 해결하고 commit 한다.
[[code(git commit -m 'Fix conflict')]]

4. 다시 merge 한다.

=== 기타 ===
==== diff 패치 생성 및 적용 ====
{{{
git diff --no-prefix > patchfile # 패치 생성
cd path/to/top/                  # 이동
patch -p0 < patchfile            # 적용
}}}
--no-prefix 옵션 없이 생성된 patch 파일이 있다면,
{{{
patch -p1 < patchfile
}}}

==== gitignore ====
===== Visual Studio =====
https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

----
CategoryDev