Git & Tips



1. 일반 #

1.1. 알아두면 좋은 기능 #

1.1.1. alias g='git' #
예) .bashrc 에 alias 기록
alias gs='git status -s'
alias gp='git pull'
1.1.2. stashing #
현재 브랜치에서 작업중인 내용을 임시로 저장하고 다른 브랜치로 이동할 때 사용한다.
1.1.3. blame #
파일 라인 단위로 누가 마지막으로 수정했는지 보여준다.
http://git-scm.com/docs/git-blame

2. commit #

2.1. commit 메시지 수정 #

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

2.1.2. 커밋 메시지를 여러 개 수정하기 #
예를 들어 마지막 3번째에 있는 커밋 로그를 수정하고 싶다면 rebase -i를 사용해서 수정해야 한다. 주의할 점은 이미 서버에 push된 커밋은 SHA-1 값이 바뀌기 때문에 가능하면 수정하지 말아야 한다. 만약 rebase에 익숙하지 않다면 다음을 주의 깊게 봐야 한다. https://git-scm.com/book/ko/v1/Git-도구-히스토리-단장하기

$ 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

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

3. log #

3.1. commit 메시지의 첫 번째 줄만 출력 #

git log --pretty=short

3.2. 파일의 변경된 내용까지 출력 #

git log -p

3.3. 브랜치를 시각적으로 확인 #

git log --graph

4. branch #

4.1. 브랜치 확인 #

현재 브랜치
git branch
모든 브랜치
git branch -a

4.2. 브랜치를 만들고 변경 #

예) hotfix-A 브랜치로 변경
git checkout -b hotfix-A

checkout -bgit branch hotfix-A 브랜치를 만들고, git branch checkout hotfix-A hotfix-A 브랜치로 이동하는 것과 동일함.

4.3. 브랜치 제거 #

git branch -D hotfix-A

5. merge #

5.1. 머지하는 것을 기록으로 남김 #

예) hotfix-A 브랜치에서 master 브랜치로 이동하여 master에 hotfix-A 브랜치를 merge.
git checkout master 마스터로 이동
git merge --no-ff hotfix-A

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

Merge Branch 'hotfix-A'

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

5.2. 머지 conflict 해결 #

예)
1. 충돌 발생
<<<<<<< HEAD
...
=======
...
>>>>>>> hotfix-A

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

3. 문제를 해결하고 commit 한다.
git commit -m 'Fix conflict'

4. 다시 merge 한다.

6. stash #

6.1. How can I delete all of my Git stashes at once? #

It does what you need:
git stash clear
from git documentation

* 특정 stash만 제거할 때
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
$ git stash drop stash@{0}
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)

7. patch #

7.1. 생성 #

git diff > patchfile              # 패치파일 생성
git diff --no-prefix > patchfile    # 패치파일 생성

7.2. 적용 #

--no-prefix 옵션 없이 패치파일 생성한 경우 -p1 (diff의 a/ b/ path prefix 무시)
cd path/to/top                   # 패치하고자 하는 소스 위치
patch -p1 < patchfile            # 패치 적용
cd path/to/top                   # 패치하고자 하는 소스 위치
patch -p0 < patchfile            # 패치 적용

8. config #

8.1. git config 순서 및 위치 #

$ git config --system
## /etc/gitconfig

$ git config --global
## ~/.gitconfig

$ git config --local
## repo/.gitconfig
각 설정 파일에 중복된 설정이 있으면 system부터 순서대로 덮어 씌운다. 즉, git은 가장 먼저 /etc/gitconfig을 찾고, 다음으로 ~/.gitconfig 순서로 찾는다.

8.2. editor 변경 #

$ git config --global core.editor [editor경로]

ex)
$ git config --global core.editor vim

8.3. CRLF 문제 #


2줄 요약
  • CORE.EOL
    • core.eol = native 기본 설정. 시스템에서 line ending 을 처리하는 방법에 따른다. windows에서는 CRLF 를 사용하고 Linux, OS X 는 LF 만 사용한다.
    • core.eol = crlf CRLF 를 line ending 으로 사용한다.
    • core.eol = lf LF를 line ending 으로 사용한다.
  • CORE.AUTOCRLF
    • core.autocrlf = false 기본 설정이다. 파일에 CRLF 를 썼든 LF 를 썼든 git 은 상관하지 않고 파일 그대로 checkin, checkout 한다. 이 설정은 line ending 이 다른 OS 에서는 text file 이 변경되었다고 나오므로 위에서 언급한 여러 가지 문제가 발생할 수 있다.
    • core.autocrlf = true text file을 object database 에 넣기전에 CRLF 를 LF 로 변경한다.
    • core.autocrlf = input LF를 line ending 으로 사용한다.

## 설정
$  git config --global core.eol native
  
## 설정 확인
$  git config --global --list|grep core.eol

9. 기타 #

9.1. cherry-pick 중 conflicts 해결 #

1. conflict 발생 파일 수정

2. Merge 상태 제거(reset) 후 add
stash 하는 방법도 있지만 이 방법이 가장 쉬운 방법이다.
git reset [filename]
git add [filename]

9.2. gerrit에 push 할 때 unpacker error 발생 시 #

unpacker error는 --no-thin 옵션으로 packing을 하지 않고 push 하면 진행될 수 있다.

git push origin HEAD:refs/for/master --no-thin

9.3. .gitignore #

9.3.1. Visual Studio #

(※ .gitignore는 확장자가 아니다. 오직 .gitignore 파일만 적용 된다.)

9.4. Emoji for GitHub #

http://www.emoji-cheat-sheet.com/
Emoji emoticons listed on this page are supported on Campfire, GitHub, Basecamp, Redbooth, Trac, Flowdock, Sprint.ly, Kandan, Textbox.io, Kippt, Redmine, JabbR, Trello, Hall, Plug.dj, Qiita, Zendesk, Ruby China, Grove, Idobata, NodeBB Forums, Slack, Streamup, OrganisedMinds, Hackpad, Cryptbin, Kato, Reportedly, Cheerful Ghost, IRCCloud, Dashcube, MyVideoGameList, Subrosa, Sococo, Quip, And Bang, Bonusly, Discourse, Ello, Twemoji Awesome, Got Chosen, Flow, ReadMe.io, esa, DBook, Groups.io, TeamworkChat, Damn Bugs, Let's Chat, Buildkite, ChatGrape, Dokuwiki, Usersnap, Discord, Status Hero, Bitbucket, Gitter, and YouTube.

이 글에는 0 개의 댓글이 있습니다.