Github과 협업 2

2016-10-02

.gitignore

   .gitignore는 git에 push할 때 올라가지 않는 파일들을 지정하는 것이다. gitignore.io에서 쉽게 만들 수 있으며 PyCharm의 경우에는 .ignore라는 별도의 플러그인을 설치하면 편리하게 쓸 수 있다.

    그냥 파일 추가만 한다고해서 이미 push된 파일들이 지워지지않는다. 만약 PyCharm의 .idea 디렉토리를 지우고 싶으면 아래와 같은 명령어를 사용하면 된다.

$ git rm -r --cached .idea
[...]
$ git commit -m "remove PyCharm .idea/"
[...]
$ git push
[...]

커밋 합치기(rebase)

    jekyll 블로그만 해도 작은 오타 수정 할 때 마다 커밋을 한다. 이를 합쳐보자.

$ git log --oneline
cc5cbe1 3
55828ce 2
7963fd8 1
38bb9e0 rebase New Commit
5a133bf commit 03
0bc0b56 commit 02
d07bd6e commit 01
bcf5524 first commit

    최상위 3개(HEAD~3)의 커밋을 합칠 것이다.

$ git rebase -i HEAD~3

    위의 명령어를 입력하면 아래와 같이 편집 할 수 있는 화면이 나온다.

pick 7963fd8 1
pick 55828ce 2
pick cc5cbe1 3

# Rebase 38bb9e0..cc5cbe1 onto 38bb9e0 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
~
~
~

    Commands라고 적힌 부분을 읽어보자. 수정하고자 하는 commit index 앞에 있는 picksquash로 바꿔준다.

pick 7963fd8 1
squash 55828ce 2
squash cc5cbe1 3

# Rebase 38bb9e0..cc5cbe1 onto 38bb9e0 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
~
~
~

    위와 같이 변경 한 뒤에 저장(:wq)을 하면 또 다른 텍스트 편집하는 화면이 나온다. 3개의 커밋을 합치고 새로운 커밋 메세지를 입력 하는 것이다.

# This is a combination of 3 commits.
# This is the 1st commit message:
1

# This is the commit message #2:

2

# This is the commit message #3:

3

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Mon Oct 3 12:49:53 2016 +0900
#
# interactive rebase in progress; onto 38bb9e0
# Last commands done (3 commands done):
#    squash 55828ce 2
#    squash cc5cbe1 3
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on '38bb9e0'.
#
# Changes to be committed:
#       new file:   abab
#       new file:   asdf
#       new file:   dadfs
#
~
~
~
~

    여기서 편집을 하지않고 이대로 저장(:wq)하면 3개의 커밋이 사라진다. 나는 아래와 같이 커밋메세지를 입력했다.

Rebase commit: 1,2,3
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Mon Oct 3 12:49:53 2016 +0900
#
# interactive rebase in progress; onto 38bb9e0
# Last commands done (3 commands done):
#    squash 55828ce 2
#    squash cc5cbe1 3
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on '38bb9e0'.
#
# Changes to be committed:
#       new file:   abab
#       new file:   asdf
#       new file:   dadfs
#
~
~
~
~

    git log를 다시 확인해보자.

$ git log --oneline
36714b6 Rebase commit: 1,2,3
38bb9e0 rebase New Commit
5a133bf commit 03
0bc0b56 commit 02
d07bd6e commit 01
bcf5524 first commit

    push할 때 -f 옵션을 줘야한다.

$ git push -f

참고자료