Programming and my thoughts

git 사용법을 매번 까먹어서 자주 쓰는 명령어를 정리해두고자 한다.


1. 현재 git branch 상태 확인


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cmd) git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
 
        modified:   config.ini
 
Untracked files:
  (use "git add <file>..." to include in what will be committed)
 
        dummy.txt
 
no changes added to commit (use "git add" and/or "git commit -a")
cs


2. 변경사항을 staged 로 만들어 보자.


1
2
3
4
5
6
7
8
9
10
cmd) git add .
 
cmd) git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
 
        modified:   config.ini
        new file:   dummy.txt
cs


commit 하기 위해서는 이렇게 변경사항을 staged 상태로 만들어 두어야 한다.


3. commit 을 해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cmd) git commit -"Add, dummy.txt"
[master 485a8cf] Add, dummy.txt
 2 files changed, 2 insertions(+), 1 deletion(-)
 create mode 100644 dummy.txt
 
cmd) git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working tree clean
 
cmd) git log -1
commit 485a8cfe05614c33c733ff473d457a381dda0140 (HEAD -> master)
Author: rubberduck <rubberduck@abc.com>
Date:   Tue Aug 22 13:19:00 2017 +0800
 
    Add, dummy.txt
cs


git commit -m "메세지" 를 하면 commit 이 됩니다.

메세지 외에 상세한 description 을 남기기 위해서는...


git commit 만 입력하면 vi 에디터가 나타나서 여기에서 description 을 남길 수 있습니다.


4. 마지막 commit 을 undo 하고 다시 commit 을 해보자.


1
2
3
4
5
6
7
cmd) git reset HEAD~
Unstaged changes after reset:
M       config.ini
 
cmd) git add .
 
cmd) git commit
cs



git reset 이 commit 을 undo 하는 명령어인데... 위 그림을 보면 git reset 에는 세가지 종류가 있다.


1) git reset --soft HEAD~1

마지막 commit 1 개를 되돌리는데... 이 때 상태를 staged 상태로 만든다.

즉... commit 만 되돌리는 것이고... 변경사항들은 staged 상태까지 업데이트가 되어있다.


2) git reset --mixed HEAD~1

마지막 commit 1 개를 되돌리는데... 이 때 상태를 unstaged 상태로 만든다.

이 명령어를 실행한 뒤 다시 변경사항을 commit 하려면 git add 명령어로 staged 상태를 만들어 두어야 한다.


3) git reset --hard HEAD~1

마지막 commit 1 개를 되돌리는데... 변경사항은 모두 버린다.

이 명령어를 실행한 뒤... git status 를 입력해보면 변경사항이 없는 깨끗한 상태가 된다.


--soft, --mixed, --hard 를 입력하지 않으면 default 값은 --mixed 이다.


----------------------------------------------------------------------------------


git reset 은 여기까지 하고... 다시 돌아가서 git commit 만 입력하면...

아래와 같은 vi 에디터가 나타난다.


1
2
3
4
5
6
7
8
9
10
11
 
 
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
#       modified:   config.ini
#       new file:   dummy.txt
#
cs

vi 에디터에서 아래와 같이 commit 메세지를 상세하게 입력할 수 있다.



노란색이 message 가 되고...

그 아래에 회색이 description 이 된다.


편집을 완료하고 :wq 를 입력하면 commit 이 완료된다.


5. commit 메세지만 수정해보자.


1
2
3
4
5
6
cmd) git commit --amend -"Fix, type in config.ini"
[master b508dea] Fix, type in config.ini
 Date: Tue Aug 22 13:22:57 2017 +0800
 2 files changed, 2 insertions(+), 1 deletion(-)
 create mode 100644 dummy.txt
 
cs


git commit --amend 를 하면 마지막 commit 메세지만 수정할 수 있다.


6. 최종 로그를 확인해 보자.


1
2
3
4
5
6
cmd) git log -1
commit b508dea6ad46d846b5cfcb68eeb56347a46328f4 (HEAD -> master)
Author: rubberduck <rubberduck@abc.com>
Date:   Tue Aug 22 13:22:57 2017 +0800
 
    Fix, type in config.ini
cs


7. 새로운 branch 를 만들어 보자.


1
2
3
4
5
6
7
8
9
10
11
cmd) git branch
* master
 
cmd) git branch chris/wip
 
cmd) git checkout chris/wip
Switched to branch 'chris/wip'
 
cmd) git branch
* chris/wip
  master
cs


master 에다 이런저런 수정을 하다보면 헷갈려서... 보통 이렇게 개인 branch 를 만들어서 작업하고 있다.

chris/wip ... wip 는 work in progress 현재 작업중 이라는 뜻이 되겠다.


8. remote git 에 merge request 를 해보자. (GitLab 이용)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cmd) git push origin chris/wip
*****************************************************************************
           This system is the property of Alphabet Inc.
*****************************************************************************
Enter passphrase for key '/c/Users/rubberduck/.ssh/id_rsa':
Counting objects: 3done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 273 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote:
remote: To create a merge request for chris/wip, visit:
remote:   https://git.gitserver.com/rubberduck/Istanbul/merge_requests/new?merge_request%5Bsource_branch%5D=chris%2Fwip
remote:
To git.gitserver.com:rubberduck/Istanbul.git
 * [new branch]      chris/wip -> chris/wip
cs


이 작업을 하고나면 대략 아래와 같은 상태가 된다.




origin 은 remote git 저장소를 가리킨다.

필자의 경우 remote master 에는 개인 개발자가 직접 commit 할 수 없으므로... 

개인 branch 를 올리고 이걸 merge request 하는 식으로 하여 최종적으로 프로젝트 관리자가 origin/master 에 병합하는 식으로 관리하고 있다. 



remote git 의 웹페이지로 이동하면 이렇게 직접 merge request 를 요청할 수 있다.

이 버튼을 누르면...



이렇게 merge 요청이 관리자에게 날아가게 된다.

관리자가 확인후 승인하면 merge 가 완료된다.


9. remote 반영사항을 local 로 가져오기.


1
2
3
4
5
6
7
8
9
10
cmd) git fetch
*****************************************************************************
           This system is the property of Hello company.
*****************************************************************************
Enter passphrase for key '/c/Users/rubberduck/.ssh/id_rsa':
remote: Counting objects: 1done.
remote: Total 1 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (1/1), done.
From git.gitserver.com:493015/Istanbul
   888f221..91b6bc4  master     -> origin/master
cs


간단히... git fetch 를 하면 remote 저장소에서 local 저장소로 최신 반영사항을 가져온다.

이 명령은 remote 관련된 사항만 읽어와서 local 쪽에서는 origin/master 등 remote branch 에만 업데이트 하므로.. master, chris/wip 같은 local branch 에는 영향을 주지 않는다.

만약 remote 저장소의 반영사항을 local branch 까지 가져오려면... git pull 명령어를 사용해야 한다.


예) git pull origin master

위 명령어를 입력하면 현재 작업중인 branch 인 chris/wip 에다가 origin/master 의 최신 반영사항을 업데이트 해준다.


나는 git pull 보다는 git fetch 하고 git rebase 하는 방법을 사용하고 있다.


* git pull 명령어 사용법

https://git-scm.com/docs/git-pull



아까 프로젝트 관리자가 merge 승인을 하여 origin/master 에는 내가 반영한 내용이 포함되어 있다.


1
2
3
4
5
6
7
cmd) git branch
* chris/wip
  master
 
cmd) git rebase origin/master
First, rewinding head to replay your work on top of it...
Fast-forwarded chris/wip to origin/master.
cs


여기까지 하고나면 아래와 같은 상태가 된다.



내가 작업중인 chris/wip 이 origin/master 와 같은 상태가 되었다.


10. (번외) git 에서 CR + LF 를 자동으로 반영하게끔 설정하자.


필자는 윈도우에서 작업하고 있어서 한 줄의 끝을 표시하는 기호는 CR + LF 를 사용하고 있다.


Windows : CR (Carriage Return \r) and LF (LineFeed \n) pair

OSX, Linux : LF (LineFeed \n)


위와 같이 OS 에 따라 한 줄의 끝을 CR + LF 인지... LF 인지 구분하게 된다.


1
2
3
4
5
# Linux, OSX : commit 할 때에 모든 CR + LF 는 LF 로 변환된다.
git config --global core.autocrlf input
 
# Windows : commit 할 때에 모든 LF 는 CR + LF 로 변환된다.
git config --global core.autocrlf true
cs


git config --global --edit


위 명령을 입력하면 vi 에디터에서 환경설정을 할 수 있다.


1
2
3
4
5
[user]
        name = John Smith
        email = john.smith@gmail.com
[core]
        autocrlf = true
cs


autocrlf = true 에 주목 ~


(계속해서 작성예정)