이번 포스팅에서는 터미널에서 사용할 수 있는 Git 기본 명령어,  Branch 만들기 합치기, 원격 repository에 push 하고 pull 하는 Git 명령어 사용법을 알아보겠습니다. 



  1. Git 기본 사용법


  • git init : repository 초기화


ihongdon-ui-MacBook-Pro:GitHub ihongdon$ mkdir git-test

ihongdon-ui-MacBook-Pro:GitHub ihongdon$ cd git-test

ihongdon-ui-MacBook-Pro:git-test ihongdon$ pwd

/Users/ihongdon/Documents/GitHub/git-test


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git init

Initialized empty Git repository in /Users/ihongdon/Documents/GitHub/git-test/.git/

 




  • git status : repository 상태 확인


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git status

On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

 




  • README.md 파일 생성


ihongdon-ui-MacBook-Pro:git-test ihongdon$ touch READMD.md

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git status

On branch master


No commits yet


Untracked files:

  (use "git add <file>..." to include in what will be committed)


READMD.md


nothing added to commit but untracked files present (use "git add" to track)

 




  • git add : stage 영역에 파일을 추가하여 git repository에서 파일을 관리하도록 해줌


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git status

On branch master


No commits yet


Changes to be committed:

  (use "git rm --cached <file>..." to unstage)


new file:   READMD.md

 




  • git commit : repository에 변경 내용을 기록 ( -m : 한줄의 commit 메시지 기록)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "commit of README.md file"

[master (root-commit) d337268] commit of README.md file

 1 file changed, 2 insertions(+)

 create mode 100644 READMD.md

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git status

On branch master

nothing to commit, working tree clean

 




  • git log : repository에 commite된 로그를 확인


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log

commit d337268ccec9ffcb3a19d6d1ec86304b791ae093 (HEAD -> master)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 16:51:55 2018 +0900


    commit of README.md file

 




  • git log --pretty=short : commit 메시지의 첫 번째 줄만 출력(여러 개의 commit 파악 용이)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log --pretty=short

commit d337268ccec9ffcb3a19d6d1ec86304b791ae093 (HEAD -> master)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>


    commit of README.md file

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git log filename : 선택한 폴더 혹은 파일의 로그만 출력하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log READMD.md 

commit d337268ccec9ffcb3a19d6d1ec86304b791ae093 (HEAD -> master)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 16:51:55 2018 +0900


    commit of README.md file

i-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git log -p filename : 파일의 변경된 내용을 출력하여 확인하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log -p READMD.md 

commit d337268ccec9ffcb3a19d6d1ec86304b791ae093 (HEAD -> master)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 16:51:55 2018 +0900


    commit of README.md file


diff --git a/READMD.md b/READMD.md

new file mode 100644

index 0000000..c90fe08

--- /dev/null

+++ b/READMD.md

@@ -0,0 +1,2 @@

+This is a git-test repository. 

+I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git diff : working tree, stage 영역, 최신 commit 사이의 변경 내역을 확인 
    => working tree와 stage 영역의 차이를 확인


git diffihongdon-ui-MacBook-Pro:git-test ihongdon$ git diff

diff --git a/READMD.md b/READMD.md

index c90fe08..2424cd6 100644

--- a/READMD.md

+++ b/READMD.md

@@ -1,2 +1,6 @@

+# Git Tutorial

+

+## version 1

+

 This is a git-test repository. 

 I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$

 




  • git add 명령어로 stage 영역에 README.md 파일을 추가한 후 git diff 명령어를 사용하면 working tree와 stage 영역 사이의 차이가 없으므로 아무것도 표시되지 않습니다. 


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git diff

ihongdon-ui-MacBook-Pro:git-test ihongdon$ # 아무것도 표시되지 않음

 




  • git diff HEAD : working tree에서 최신의 변경 부분을 확인하기 (HEAD는 현재 작업하고 있는 branch의 최신 commit을 참조하는 포인터)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git diff HEAD

diff --git a/READMD.md b/READMD.md

index c90fe08..2424cd6 100644

--- a/READMD.md

+++ b/READMD.md

@@ -1,2 +1,6 @@

+# Git Tutorial

+

+## version 1

+

 This is a git-test repository. 

 I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git commit -m : 수정사항 commit


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "Add title and version"

[master ea87d54] Add title and version

 1 file changed, 4 insertions(+)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git log : commit 확인


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log

commit ea87d546d8649ea000d071727c0b14e870bc714e (HEAD -> master)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 17:30:31 2018 +0900


    Add title and version


commit d337268ccec9ffcb3a19d6d1ec86304b791ae093

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 16:51:55 2018 +0900


    commit of README.md file

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  2. Branch 생성하고 합치기


  • git branch : 현재 사용하고 있는 branch 확인 하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git branch

* master

 




  • git checkout -b branch_name : 새로운 branch를 만들고, 새로운 branch로 변경하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout -b readme-edit-v2

Switched to a new branch 'readme-edit-v2'


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git branch # current branch check

  master

* readme-edit-v2

 





  • 'readme-edit-v2' branch 에서 date 추가하고 commit 하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ vi READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1


### date : as of 5th Aug.


This is a git-test repository. 

I'm writing README.md file as a test.


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "Add date"

[readme-edit-v2 8254c2e] Add date

 1 file changed, 2 insertions(+)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log

commit 8254c2e24c83e0e3f8e843228ca84fbba8998e54 (HEAD -> readme-edit-v2)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 19:30:04 2018 +0900


    Add date


commit ea87d546d8649ea000d071727c0b14e870bc714e (master)

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 17:30:31 2018 +0900


    Add title and version


commit d337268ccec9ffcb3a19d6d1ec86304b791ae093

Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

Date:   Sun Aug 5 16:51:55 2018 +0900


    commit of README.md file

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git checkout master : master branch로 변경


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout master

Switched to branch 'master'

 




>> 아직 master branch에 'readme-edit-v2' branch의 변경사항이 반영되지 않았음

 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1


This is a git-test repository. 

I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$





  • git merge --no-f topic_branch_name : Topic branch를 master branch에 통합하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git merge --no-ff readme-edit-v2


아래와 같은 에디터가 나타납니다. 


hint: Waiting for your editor to close the file... 

Merge branch 'readme-edit-v2'

  

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

# especially if it merges an updated upstream into a topic branch.

#

# Lines starting with '#' will be ignored, and an empty message aborts

# the commit.



에디터를 저장하고 종료(esc 후 :wq!)하면 아래와 같은 메시지가 나옵니다. 


Merge made by the 'recursive' strategy.

 READMD.md | 2 ++

 1 file changed, 2 insertions(+)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




>> date 통합 확인



ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1


### date : as of 5th Aug.


This is a git-test repository. 

I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git log --graph : branch 분기 또는 통합을 그래프로 표시


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log --graph

*   commit f36bf439021e2220a56c01e6bf7e20ea897c8598 (HEAD -> master)

|\  Merge: ea87d54 8254c2e

| | Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

| | Date:   Sun Aug 5 19:55:05 2018 +0900

| | 

| |     Merge branch 'readme-edit-v2'

| | 

| * commit 8254c2e24c83e0e3f8e843228ca84fbba8998e54 (readme-edit-v2)

|/  Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

|   Date:   Sun Aug 5 19:30:04 2018 +0900

|   

|       Add date

* commit ea87d546d8649ea000d071727c0b14e870bc714e

| Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

| Date:   Sun Aug 5 17:30:31 2018 +0900

|     Add title and version

* commit d337268ccec9ffcb3a19d6d1ec86304b791ae093

  Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

  Date:   Sun Aug 5 16:51:55 2018 +0900

  

      commit of README.md file

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




######################################################################


  • git reset : 과거 상태로 되돌리기 (다른 위치의 repository에는 영향 없음)   
    --> readme-edit-v2 통합하기 이전 상태로 되돌리기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git reset --hard ea87d546d8649ea000d071727c0b14e870bc714e

HEAD is now at ea87d54 Add title and version

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git branch

* master

  readme-edit-v2

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1


This is a git-test repository. 

I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 







  • git checkout -b readme-edit-v3 : readme-edit-v3라는 이름의 새로운 branch 생성


 ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout -b readme-edit-v3

Switched to a new branch 'readme-edit-v3'


ihongdon-ui-MacBook-Pro:git-test ihongdon$ vi READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 3


### new topic branch readme-edit-v3


This is a git-test repository. 

I'm writing README.md file as a test.





  • git reflog : 현재 repository에서 수행된 모든 commit 로그 확인 하기 
    (vs. git log 명령어는 현재 branch의 로그만 확인 가능)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git reflog

ea87d54 (HEAD -> readme-edit-v3, master) HEAD@{0}: checkout: moving from master to readme-edit-v3

ea87d54 (HEAD -> readme-edit-v3, master) HEAD@{1}: reset: moving to ea87d546d8649ea000d071727c0b14e870bc714e

f36bf43 HEAD@{2}: merge readme-edit-v2: Merge made by the 'recursive' strategy.

ea87d54 (HEAD -> readme-edit-v3, master) HEAD@{3}: checkout: moving from readme-edit-v2 to master

8254c2e (readme-edit-v2) HEAD@{4}: checkout: moving from master to readme-edit-v2

ea87d54 (HEAD -> readme-edit-v3, master) HEAD@{5}: checkout: moving from readme-edit-v2 to master

8254c2e (readme-edit-v2) HEAD@{6}: commit: Add date

ea87d54 (HEAD -> readme-edit-v3, master) HEAD@{7}: checkout: moving from master to readme-edit-v2

ea87d54 (HEAD -> readme-edit-v3, master) HEAD@{8}: commit: Add title and version

d337268 HEAD@{9}: commit (initial): commit of README.md file

 




  • git reset --hard log_hash : 다시 'readme-edit-v2' 분리 하기 이전 상태로 되돌리기 (reset)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout master

M READMD.md

Switched to branch 'master'

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git reset --hard f36bf43

HEAD is now at f36bf43 Merge branch 'readme-edit-v2'

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 


ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1


### date : as of 5th Aug.


This is a git-test repository. 

I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




>> git commit  



ihongdon-ui-MacBook-Pro:git-test ihongdon$ vi READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial

## version 3

## readme-edit-v3

i

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "readme edit version 3"

[readme-edit-v3 59e4132] readme edit version 3

 1 file changed, 2 insertions(+), 2 deletions(-)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git reflog : 현재 repository에서 수행된 모든 commit 로그 확인 하기


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git reflog

59e4132 (HEAD -> readme-edit-v3) HEAD@{0}: commit: readme edit version 3

ea87d54 HEAD@{1}: checkout: moving from master to readme-edit-v3

f36bf43 (master) HEAD@{2}: reset: moving to f36bf43

ea87d54 HEAD@{3}: checkout: moving from readme-edit-v3 to master

ea87d54 HEAD@{4}: checkout: moving from master to readme-edit-v3

ea87d54 HEAD@{5}: reset: moving to ea87d546d8649ea000d071727c0b14e870bc714e

f36bf43 (master) HEAD@{6}: merge readme-edit-v2: Merge made by the 'recursive' strategy.

ea87d54 HEAD@{7}: checkout: moving from readme-edit-v2 to master

8254c2e (readme-edit-v2) HEAD@{8}: checkout: moving from master to readme-edit-v2

ea87d54 HEAD@{9}: checkout: moving from readme-edit-v2 to master

8254c2e (readme-edit-v2) HEAD@{10}: commit: Add date

ea87d54 HEAD@{11}: checkout: moving from master to readme-edit-v2

ea87d54 HEAD@{12}: commit: Add title and version

d337268 HEAD@{13}: commit (initial): commit of README.md file

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git commit --amend : 직전에 작성했던 commit 메시지 수정


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit --amend

hint: Waiting for your editor to close the file... 

Merge branch 'readme-edit-v3'

  

# Please enter the commit message for your changes. Lines starting

# with '#' will be ignored, and an empty message aborts the commit.

#

# Date:      Sun Aug 5 20:26:01 2018 +0900

#

# On branch master

# Changes to be committed:

#       modified:   READMD.md


[master 7b45ed5] amend commit message by using git commit --amend Merge branch 'readme-edit-v3'

 Date: Sun Aug 5 20:26:01 2018 +0900

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git log graph : branch 분기 또는 통합을 그래프로 표시


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git log --graph

*   commit 7b45ed51381013214cddf19e02e4df38b83587e4 (HEAD -> master)

|\  Merge: f36bf43 59e4132

| | Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

| | Date:   Sun Aug 5 20:26:01 2018 +0900

| | 

| |     amend commit message by using git commit --amend

| |     Merge branch 'readme-edit-v3'

| | 

| * commit 59e4132d3928f580c3a26613b83220af04d13540 (readme-edit-v3)

| | Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

| | Date:   Sun Aug 5 20:23:47 2018 +0900

| | 

| |     readme edit version 3

| |   

* |   commit f36bf439021e2220a56c01e6bf7e20ea897c8598

|\ \  Merge: ea87d54 8254c2e

| |/  Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

|/|   Date:   Sun Aug 5 19:55:05 2018 +0900

| |   

| |       Merge branch 'readme-edit-v2'

| | 

| * commit 8254c2e24c83e0e3f8e843228ca84fbba8998e54 (readme-edit-v2)

|/  Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

|   Date:   Sun Aug 5 19:30:04 2018 +0900

|   

|       Add date

* commit ea87d546d8649ea000d071727c0b14e870bc714e

| Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

| Date:   Sun Aug 5 17:30:31 2018 +0900

|     Add title and version

* commit d337268ccec9ffcb3a19d6d1ec86304b791ae093

  Author: xxxxxx_xxx <xxxxxx@xxxxx.com>

  Date:   Sun Aug 5 16:51:55 2018 +0900

  

      commit of README.md file

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git rebase -i HEAD~2 : 코드를 수정하고 commit 한 뒤에, 바로 앞의 commit에 합치기 
    (간단한 오탈자 수정 시 자주 사용)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout -b readmd-edit-v4

Switched to a new branch 'readmd-edit-v4'

ihongdon-ui-MacBook-Pro:git-test ihongdon$ vi READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial

## version 3

## readme-edit-v3

## readyou-edit-v4. <- 오탈자


### date : as of 5th Aug.


This is a git-test repository. 

I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "readme-edit-v4"

[readmd-edit-v4 b2e7b0b] readme-edit-v4

 1 file changed, 1 insertion(+)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ vi READMD.md  # 오탈자 수정함

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git diff

diff --git a/READMD.md b/READMD.md

index 2b9a28f..91bda6a 100644

--- a/READMD.md

+++ b/READMD.md

@@ -1,7 +1,7 @@

 # Git Tutorial

 ## version 3

 ## readme-edit-v3

-## readyou-edit-v4

+## readme-edit-v4

 

 ### date : as of 5th Aug.

 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "Fix typo"

[readmd-edit-v4 71d869f] Fix typo

 1 file changed, 1 insertion(+), 1 deletion(-)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git rebase -i HEAD~2


pick b2e7b0b readme-edit-v4

pick 71d869f Fix typo


# Rebase 7b45ed5..71d869f onto 7b45ed5 (2 commands)

#

# Commands:

# p, pick <commit> = use commit

# r, reword <commit> = use commit, but edit the commit message

# e, edit <commit> = use commit, but stop for amending

# s, squash <commit> = use commit, but meld into previous commit

# f, fixup <commit> = like "squash", but discard this commit's log message

# x, exec <command> = run command (the rest of the line) using shell

# d, drop <commit> = remove commit

# l, label <label> = label current HEAD with a name

# t, reset <label> = reset HEAD to a label

# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]

# .       create a merge commit using the original merge commit's

# .       message (or the oneline, if no original merge commit was

# .       specified). Use -c <commit> to reword the commit message.

#

# 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



>> pick -> fixup 으로 수정하고 코드 편집기의 내용을 저장 후 종료

pick b2e7b0b readme-edit-v4

fixup 71d869f Fix typo


esc 후 :wq!



Successfully rebased and updated refs/heads/readmd-edit-v4.

(b2e7b0b readme-edit-v4 와 71d869f Fix typo 의 두 개의 commit이 하나로 합쳐졌음)



>> master branch 에 통합하기

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout master

Switched to branch 'master'

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git merge --no-ff readmd-edit-v4

Merge made by the 'recursive' strategy.

 READMD.md | 1 +

 1 file changed, 1 insertion(+)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 





  3. 원격 Repository 에 내보내기 (push)


pull, push, pull request 의 작업 흐름은 아래의 도식을 참고하세요. 





  • git remote add : 원격 repository 등록 
     (origin이라는 식별자가 git@github.com:hdlee4u/git-test.git 을 가리킴)


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git remote add origin git@github.com:hdlee4u/git-test.git

 




  • git push : 로컬 repository의 내용을 원격 repository에 전송


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git push -u origin master

Warning: Permanently added the RSA host key for IP address '192.30.255.113' to the list of known hosts.

Enter passphrase for key '/Users/ihongdon/.ssh/id_rsa': 

Enumerating objects: 20, done.

Counting objects: 100% (20/20), done.

Delta compression using up to 8 threads.

Compressing objects: 100% (14/14), done.

Writing objects: 100% (20/20), 1.86 KiB | 1.86 MiB/s, done.

Total 20 (delta 5), reused 0 (delta 0)

remote: Resolving deltas: 100% (5/5), done.

To github.com:hdlee4u/git-test.git

 * [new branch]      master -> master

Branch 'master' set up to track remote branch 'master' from 'origin'.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




로컬 repository에서 만들었던 내용들이 git push 로 원격 repository에 보내기를 한 결과, GitHub 페이지에 가보면 아래와 같이 'git-test' repository의 master branch 에 README.md 파일이 올라와 있습니다. 

 




>> 로컬 repository 의 master branch 이외의 'readme-edit-v2' branch를 원격 repositiory에 전송하기



ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout readme-edit-v2

Switched to branch 'readme-edit-v2'

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git push -u origin readme-edit-v2

Enter passphrase for key '/Users/ihongdon/.ssh/id_rsa': 

Total 0 (delta 0), reused 0 (delta 0)

To github.com:hdlee4u/git-test.git

 * [new branch]      readme-edit-v2 -> readme-edit-v2

Branch 'readme-edit-v2' set up to track remote branch 'readme-edit-v2' from 'origin'.

ihongdon-ui-MacBook-Pro:git-test ihongdon$

 




  4. 원격 repository 에서 가져오기 (clone)


여기서 부터는 같이 협업을 하는 '제 3의 개발자'가 있다고 가정하고, 저의 repository에 저장되어 있는 코드를 '제 3의 개발자'가 자신의 repository로 가져다가 작업을 한다고 가정을 하고 아래 글들을 읽으시길 바랍니다.  폴더를 새로 만들고, 폴더 사이를 왔다갔다 하는게 '제 3의 개발자'의 개발 환경으로 이동하는 것이라고 여기면 되겠습니다. 


>> 새로운 폴더 만들기



ihongdon-ui-MacBook-Pro:git-test ihongdon$ cd

ihongdon-ui-MacBook-Pro:~ ihongdon$ pwd

/Users/ihongdon

ihongdon-ui-MacBook-Pro:~ ihongdon$ cd Documents

ihongdon-ui-MacBook-Pro:Documents ihongdon$ cd GitHub

ihongdon-ui-MacBook-Pro:GitHub ihongdon$ mkdir git-test2

ihongdon-ui-MacBook-Pro:GitHub ihongdon$ cd git-test2

ihongdon-ui-MacBook-Pro:git-test2 ihongdon$ 

 




  • git clone remote_repository : 원격 repository 복사해서 가져오기


ihongdon-ui-MacBook-Pro:git-test2 ihongdon$ git clone git@github.com:hdlee4u/git-test.git

Cloning into 'git-test'...

Enter passphrase for key '/Users/ihongdon/.ssh/id_rsa': xxxxxxxx

remote: Counting objects: 20, done.

remote: Compressing objects: 100% (9/9), done.

Receiving objects: 100% (20/20), done.

Resolving deltas: 100% (5/5), done.

remote: Total 20 (delta 5), reused 20 (delta 5), pack-reused 0

ihongdon-ui-MacBook-Pro:git-test2 ihongdon$ 

ihongdon-ui-MacBook-Pro:git-test2 ihongdon$ cd git-test

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git branch -a  # -a 를 붙이면 로컬 repository와 원격 repository 정보를 함께 출력함

* master

  remotes/origin/HEAD -> origin/master

  remotes/origin/master

  remotes/origin/readme-edit-v2

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




  • git checkout -b branch_name origin/branch_name : 원격 repository의 origin branch 를 가져다가 로컬 repository에 branch 생성


ihongdon-ui-MacBook-Pro:git-test ihongdon$ git checkout -b readme-edit-v2 origin/readme-edit-v2

Branch 'readme-edit-v2' set up to track remote branch 'readme-edit-v2' from 'origin'.

Switched to a new branch 'readme-edit-v2'

ihongdon-ui-MacBook-Pro:git-test ihongdon$

 




>> readme-edit-v2 branch에 변경사항 commit



ihongdon-ui-MacBook-Pro:git-test ihongdon$ vi READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1

## version 2

### date : as of 5th Aug.

### test remote branch


This is a git-test repository. 

I'm writing README.md file as a test. 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git add READMD.md 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git commit -m "test remote repository with readme-edit-v2"

[readme-edit-v2 c147dbb] test remote repository with readme-edit-v2

 1 file changed, 2 insertions(+), 1 deletion(-)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




>> readme-edit-v2 commit 한 변경사항을 원격 repository에 전송하기 (push)



ihongdon-ui-MacBook-Pro:git-test ihongdon$ git push

Enter passphrase for key '/Users/ihongdon/.ssh/id_rsa': xxxxxxxx

Enumerating objects: 5, done.

Counting objects: 100% (5/5), done.

Delta compression using up to 8 threads.

Compressing objects: 100% (2/2), done.

Writing objects: 100% (3/3), 399 bytes | 399.00 KiB/s, done.

Total 3 (delta 0), reused 0 (delta 0)

To github.com:hdlee4u/git-test.git

   8254c2e..c147dbb  readme-edit-v2 -> readme-edit-v2

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 




>> 이전 작업 폴더로 돌아가서 방금 전에 수정한 readme-edit-v2 branch 가져오기 (pull)



ihongdon-ui-MacBook-Pro:git-test ihongdon$ cd

ihongdon-ui-MacBook-Pro:~ ihongdon$ cd Documents

ihongdon-ui-MacBook-Pro:Documents ihongdon$ cd GitHub

ihongdon-ui-MacBook-Pro:GitHub ihongdon$ cd git-test

ihongdon-ui-MacBook-Pro:git-test ihongdon$ ls -al

total 8

drwxr-xr-x   4 ihongdon  staff  128  8  5 21:35 .

drwxr-xr-x  10 ihongdon  staff  320  8  5 21:38 ..

drwxr-xr-x  14 ihongdon  staff  448  8  5 21:35 .git

-rw-r--r--   1 ihongdon  staff  127  8  5 21:35 READMD.md

ihongdon-ui-MacBook-Pro:git-test ihongdon$ git pull origin readme-edit-v2

Enter passphrase for key '/Users/ihongdon/.ssh/id_rsa': xxxxxxxx

remote: Counting objects: 3, done.

remote: Compressing objects: 100% (2/2), done.

Unpacking objects: 100% (3/3), done.

remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0

From github.com:hdlee4u/git-test

 * branch            readme-edit-v2 -> FETCH_HEAD

   8254c2e..c147dbb  readme-edit-v2 -> origin/readme-edit-v2

Updating 8254c2e..c147dbb

Fast-forward

 READMD.md | 3 ++-

 1 file changed, 2 insertions(+), 1 deletion(-)

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

ihongdon-ui-MacBook-Pro:git-test ihongdon$ cat READMD.md 

# Git Tutorial


## version 1

## version 2

### date : as of 5th Aug.

### test remote branch


This is a git-test repository. 

I'm writing README.md file as a test.

ihongdon-ui-MacBook-Pro:git-test ihongdon$ 

 



Git, GitHub 을 한번도 사용해보지 않은 분이 이번 포스팅을 보게 되면 '이게 다 무슨 얘기지?' 하고 어리둥절 할 것 같습니다. ^^;;;


아무래도 이번 포스팅을 Git 을 사용하시는 분들 중에서 Git 명령어가 잘 기억이 안날 때 참고할 수 있는 용도로 사용하는게 좋을 것 같습니다. 


많은 도움이 되었기를 바랍니다. 


Posted by R Friend R_Friend

댓글을 달아 주세요


이번 포스팅에서는 GitHub 간단 사용법에 대해서 소개하겠습니다.

 

GitHub은 여러 명의 개발자들이 언제 어디서나 협업을 하면서 코드를 공유하고 버전 관리를 할 수 있게 해주는 분산형 Git Repository 호스팅 서비스 플랫폼입니다.

 

GitGitHub은 다른 것인데요, Stackoverflow[1]에 둘을 비교 설명한 내용이 있어서 소개합니다.

 


Git은 버전 관리 시스템이며소스 코드 이력을 관리하는 툴입니다

(Git is a revision control system, a tool to manage your source code history.)


GitHub은 Git repositories를 위한 호스팅 서비스 입니다

(GitHub is a hosting service for Git repositories.)


따라서 Git과 GitHub은 똑같은 것이 아닙니다

Git 은 툴이며, GitHub은 Git을 사용하는 프로젝트를 위한 서비스입니다. 

(So they are not the same thing: Git is the toolGitHub is the service for projects that use Git.)

 



Git
은 리눅스의 창시자인 Linus Torvalds2005년에 기존의 리눅스 커널 개발에 사용하고 있던 버전 관리 시스템의 라이센스가 변경되면서 새로운 시스템을 찾는 과정에서 Git 
을 만들었다고 합니다. (진정 Linux Torvalds는 오픈소스계의 아버지인가 봅니다!)[2]

 

아이러니 한 것은 오픈소스에 적대적이었던 마이크로소프트가 세계 최대 오픈소스 공유 플랫폼인 GitHub2018 6월에 75억 달러(8조원)에 인수를 했다는 점입니다. 세상 참 오래 살고 볼 일입니다. (MS에 대한 불신 때문일까요? MSGitHub 인수 발표 이후에 GitHub과 같은 Git Repository 호스팅서비스인 GitLab으로 망명하는 개발자들도 있습니다)

 

만약 이 포스팅을 보고 있는 분이 팀으로 협업을 하는 개발자가 아니라면, 개인용 랩탑 컴퓨터로 R이나 Python, SAS, MATLAP 등으로 혼자 분석 업무 만 담당하는 분이라면 GitHub을 왜 써야 하나(Why GitHub?) 궁금증이 생길 것입니다. 아래의 그림은 Vincent Driessen 이라는 개발자께서 ‘A successful Git branching model’[3]이라는 제목으로 Why Git?, Decentralized but centralized, The main branches, Supporting branches 등에 대해서 블로그에 소개한 내용입니다. 시간의 흐름에 따라서 여러 명의 개발자가 협업하면서 코드 버전을 관리하는 과정을 볼 수 있을 텐데요, Git과 같은 버전관리 시스템이 없다면 무척 애를 먹을 것이라고 예상할 수 있습니다


비단 협업 뿐만이 아니더라도, 분석가가 여러 버전의 분석 코드를 작성하다 보면 그저께 코딩했던 데이터 전처리 R코드가 어디있더라?’, ‘어제 분석했던 Random Forest Hyperparameter 설정값을 수정하고 덮어써버렸네뭐였더라?’, ‘000로 부터 그저께 Python 코드를 이메일로 받았었는데 그게 어디있지?’와 같은 종류의 어려움에 처할 수 있는데요, 버전 관리 시스템이 있다면 이를 피할 수 있게됩니다.

 


[ 그림 1. A successful Git branching model (by Vincent Driessen) ]


* Source: https://nvie.com/posts/a-successful-git-branching-model/

 


코드 버전 관리를 도와주는 버전 관리 시스템은 크게 (1) 로컬 버전 관리 시스템 (Local Version Control System), (2) 중앙 집중식 버전 관리 시스템 (Centralized Version Control System), (3) 분산 버전 관리 시스템(Distributed Version Control System)으로 구분할 수 있으며, Git은 이중에서 분산 버전 관리 시스템에 해당합니다.

(* Reference: https://git-scm.com/book/ko/v1)

 

 

[ 그림 2. 버전 관리 시스템 (Version Control System) ]

 


 

중앙 집중식 버전 관리 시스템(Subversion, Perforce )은 사용 방법이 분산형 대비 상대적으로 쉽다는 장점이 있습니다. 하지만 코드가 저장되어 있는 중앙 서버에 장애가 발생했다 거나, 개발자 중에 한명이 코드 커밋을 완료하지 않고 퇴근을 해버린다거나 하면 버전 관리 기능이 마비가 되어 협업을 할 수가 없는 단점이 있습니다.

 

분산 버전 관리 시스템은 중앙 집중식 버전 관리 시스템과 장점과 단점이 정반대입니다. 장점으로는 클라이언트가 저장소 자체를 복제하게 되므로 중앙 서버에 장애가 발생해도 클라이언트에서 개발 작업을 진행하는데 문제가 없으며, 여러 그룹과 협업을 진행하는데도 문제가 없습니다. 반면에, 처음 분산형을 사용하는 분이라면 전체 구조와 흐름을 이해하고 능숙하게 사용하는데 (중앙 집중형 대비 상대적으로) 어렵다는 단점이 있습니다.

(저는 5년 전에 Coursera에서 처음으로 GitHub에 대해 20여분짜리 동영상 강의를 접하였었는데요, 뭐가 여기 저기를 왔다 갔다 하는데요, 강사가 무슨 얘기를 하는지 도통 이해할 수가 없었던 기억이 있습니다. ‘그냥 코드 카피해서 게시판에 페이스트 해서 숙제 제출하면 안되나?’ 라고 투덜거렸었습니다. ^^;)

 

아래의 그림3은 GitHub에서 여러 명의 개발자가 협업을 할 때, 소스 코드를 수정하고 이를 소스 코드에 반영해달라고 요청하는 Pull Request를 하는 절차를 도식화한 것입니다. [2] 클라우드 상의 GitHub에서 타인의 git과 자기의 git 사이의 흐름, 그리고 자신의 로컬 개발환경 사이의 전체 흐름에 대해서 살펴보면 GitHub의 사용 절차를 이해하는데 도움이 될 것이라고 생각합니다.


아래의 그림3 에서는 (1) 다른 사람의 master branch를 자신의 github으로 Fork 해서 (2) 로컬 개발환경으로 pull 하고, (3) topic branch를 만들어서 (4) 수정 작업을 한 후, (5) 자신의 github에 원격 branch 작성을 push하고, (6) original master branch를 가진 사람에게 pull request를 전송해서 피드백을 요청하면, (7) original master branch 주인이 pull request를 열고 차이점을 비교한 후 만족스러우면 merge 하는 절차입니다. 



[ 그림 3. Git Pull Request Workflow ]

 

 

 

최근 Mac 에는 Git이 기본으로 설치되어 있으며, 리눅스나 윈도우즈는 자신이 사용하는 종류에 맞게 다운받아서 설치를 해주어야 합니다. Git 설치는 https://git-scm.com/book/ko/v2/시작하기-Git-설치를 참고하세요. [4]

 

GitHub.com account 생성 및 SSH 인증(https://github.com/join)을 모두 끝마쳤다는 가정 하에 이제부터 GitHub의 간단한 사용을 예를 들어서 소개하겠습니다

 

아래의 예는 GitHub hello world (https://guides.github.com/activities/hello-world/) 튜토리얼을 한글로 번역한 내용입니다. [5]  위의 그림3은 다른 사람의 git을 fork 하는 것으로 시작하는데요, 아래의 예는 좀더 간단하게 다른 사람의 git이 아니라 자기 자신의 github 안의 repository 를 가지고 pull request 해보는 예입니다. pull request 는 Git의 꽃이므로 정확하게 이해하는게 좋겠습니다. 


  • Repository 생성하고 사용하기
  • 새로운 Branch 시작하고 관리하기
  • 파일에 변경사항 만들고 GitHubpush 하기 (commit)
  • Pull request 열고 합치기(merge)

 

[1 단계] Repository 생성


Repository는 보통 하나의 프로젝트를 구성하기 위해 사용합니다. Repository는 여러 개의 폴더, 파일, 이미지, 동영상, 데이터셋을 가질 수 있습니다. Repository에 코드를 저장하고, 다른 개발자와 코드를 공유하며, 의견도 나누고, 코드 수정도 같이 할 수 있습니다.

 

(1)   GitHub.com 의 우측 상단에 ‘+’ 메뉴를 클릭한 후,

(2)   ‘New repository’ 하위 메뉴를 선택하면 아래와 같은 화면이 나타납니다.

(3)   Repository name‘hello-world’라고 이름을 기입해주고,

(4)   ‘Public’ 외부 공개 모드를 선택해주세요. 참고로, Private은 비공개인 대신에 유료 서비스 입니다.

(5)   ‘Initialize this repository with a README’ 를 선택 후 ‘Create repository’ 단추를 눌러주세요.




 

짜잔~! ‘hello-world’ Repository가 생성되었습니다.



 

 

[2 단계] Branch 생성

 

Repository에 다른 버전의 작업을 할 때 새로운 Branch를 만듭니다. Repository를 처음 만들면 디폴트 설정으로 master 라는 이름의 최종적인 Branch가 만들어집니다. Branch에서 작업을 실험도 하고 수정을 한 후에 master에 커밋합니다.

 Master branch에서 새로운 branch를 만들게 되면 그 시점의 master를 그대로 복사합니다. 만약 당신이 당신의 branch에서 작업을 하는 동안 다른 누군가가 master branch에서 수정을 한 경우에 당신은 변경사항을 pull해서 가져올 수 있습니다.

 

아래의 다이어그램은 [5]

Ÿ   Master branch 에서

Ÿ   Feature라는 이름의 새로운 branch를 생성하고,

Ÿ   Pull request 와 변경했으면 하는 사항에 대한 토론을 진행한 후,

Ÿ   Master branch ‘feature branch’를 병합(merge)하는

작업 절차를 보여줍니다.

 

 

 

새로운 branch를 만드는 방법은

(1)   ‘hello-world’ repository로 가서

(2)   ‘branch: master’라는 파일 리스트의 제일 위에 있는 drop down 메뉴를 선택 후

(3)   Branch 텍스트 상자에 ‘readme-edits’이라는 이름의 Branch 이름을 입력하고,

(4)   파란색의 ‘Create branch’ 상자를 선택하거나 키보드의 ‘Enter’를 치면 됩니다.

 

이제 ‘hello-world’ repository 안에 ‘master’ branch 그리고 master branch를 복사한 ‘readme-edits’ branch의 두개 branch가 생겼습니다.

 

 


[3 단계] 수정 후 commit 하기

 

(1)   README.md 파일을 선택 후 우측 상단의 연필 모양 아이콘을 클릭

(2)   편집창에서 수정사항 쓰기

(3)   편집창 아래에 있는 ‘commit message’란에 수정사항에 대한 부연설명 쓰기
(
무엇을, 왜 수정했는가를 써서 다른 개발자가 쉽게 이해할 수 있도록)

(4)   ‘Commit changes’ 단추 클릭

하면 Master에서 복사한 ‘readme-edits’ branch를 수정할 수 있습니다. 이제 애초의 master branch와 방금 수정한 readme-edits branch는 서로 다른 branch가 되었습니다.

 



 

 

[4 단계] Pull Request 열기

 

Pull Request를 통해서 당신이 만든 수정사항을 제안하고 다른 사람이 검토해줄 것을 요청하며 수정사항을 master branch에 반영하도록 할 수 있습니다. Pull Request master branch와 새로 만든 branch 간의 다른 점(differences, diffs)을 녹색이나 빨간색으로 보여줍니다. 


GitHub @mention 시스템을 이용하여 특정 팀이나 사람에게 피드백을 요청할 수도 있습니다.


(1)   Pull Request 탭을 클릭하여 나타난 페이지에서 ‘New pull request’ 단추를 클릭



 

(2)   변경점 비교 창에서 비교를 하려고 하는 ‘readme-edits’ branch를 선택하면 master branch와 차이점을 비교하게 됩니다. 비교 페이지에서 추가(+), 삭제(-), 변경사항을 살펴봅니다.



 

(3)   비교한 변경사항이 원하는 내용임을 확인하였으면 Pull request의 제목과 설명을 추가한 후에 ‘Create pull request’ 단추를 누릅니다.

 


 

 

[5 단계] Pull Request 합치기 (merge)

 

마지막 단계로서, ‘readme-edits’ branch에서 수정한 사항을 원래의 master branch에 합쳐보겠습니다.

 

(1)   Master branch에 변경점을 반영하기 위해 ‘Merge pull request’ 녹색 단추 클릭

(2)   ‘Confirm merge’ 클릭

(3)   변경사항이 master branch에 모두 반영이 되었으므로 ‘Delete branch’ 자주색 단추를 눌러서 ‘readme-edits’ branch 삭제하기


 

드디어 pull requestoriginal master branch에 합치는 것을 끝마쳤습니다. ^^b

‘readme-edits’ branch에서 수정했던 사항들이 original ‘master’ branch에 합쳐진 것을 확인할 수 있습니다.



다음번 포스팅에서는 터미널에서 Git을 사용해서 GitHub Repository에 commit 하는 방법을 소개하겠습니다. 


많은 도움이 되었기를 바랍니다. 

 

* Reference

[1] https://stackoverflow.com/questions/13321556/difference-between-git-and-github

[2] ‘소셜 코딩으로 이끄는 GitHub 실천 기술’, 오오츠카 히로키 지음/윤인성 옮김, Jpub

[3] https://nvie.com/posts/a-successful-git-branching-model/

[4] Git 설치 및 명령어 참고: https://git-scm.com/

[5] GitHub hello world: https://guides.github.com/activities/hello-world/

 

Posted by R Friend R_Friend

댓글을 달아 주세요