본문 바로가기

Git & Github

😃Git bash - Part 2 : Git 자주 쓰이는 명령어와 설명

728x90

Part 2에서는 Git 사용 시 자주 쓰이거나, 사용할 수 있는 명령어들에 대해서 알아보겠습니다.

 

명령어를 알아보기 전에 HEAD가 무엇인지 꼭 확인하고 넘어가셔야 합니다.

HEAD : branch의 마지막 커밋을 의미합니다.

 

👋 Git 기본 명령어

1. clone

Part 1.에서 Git 초기 설정과 로컬 저장소와 원격 저장소를 생성해 둘을 연결하는 방법을 알아보았는데, clone 명령어를 이용하면 원격 저장소의 프로젝트를 로컬 저장소로 복사해오는 작업을 합니다.

$ git clone https://github.com/GONI95/GitStudy.git
$ git clone [Git Repository web URL]

 

아래는 clone 명령어옵션로컬 저장소의 작업 트리 명을 설정하는 방법에 대해서 알아보겠습니다.

$ git clone --no-checkout https://github.com/GONI95/GitStudy.git GitStudy_Local
$ git clone [옵션] [Git Repository web URL] [작업 트리 명]

default     | 이력과 버전 정보 관리 파일, 기본 branch로 설정된 프로젝트가 working tree에 존재하게 됩니다.
no-checkout | 이력과 버전 정보 관리 파일을 가져오고, HEAD를 checkout 하지않습니다. 
            | working tree에 소스코드를 넣지놓지 않은 상태로 보이는데, git checkout master를 입력하면 파일들이 생깁니다.
bare        | 이력과 버전 정보 관리 파일만 가져옵니다.
mirror      | 이력과 버전 정보 관리 파일 뿐만 아니라 현재 원격 저장소의 모든 사항을 전부 가져옵니다.

 

 

2. pull / fetch

pull 명령어는 원격 저장소의 프로젝트를 로컬 저장소로 가져와 병합합니다.

fetch 명령어는 로컬 저장소와 원격 저장소의 변경 사항이 다를 때 이를 비교, 대조하고 merge 명령어와 함께 최신 데이터를 반영하거나 충돌 문제 등을 해결합니다.

 

두 명령어는 Git을 이용해 협업하는 과정에서 원격 저장소에 업데이트된 내용이 나의 로컬 저장소와 다른 경우 자주 쓰이는 명령어들 입니다.

$ git pull origin master
  git pull [원격 저장소] [로컬 저장소 branch]

$ git fetch origin master
  git fetch [원격 저장소] [로컬 저장소 branch]

$ git merge FETCH_HEAD
$ git diff HEAD origin/master
명령어로 병합하고 변경 사항을 수정하고 push하여 해결합니다.

 

 

3. branch / checkout

branch는 Software 개발 시 여버 개발자들이 동시에 다양한 작업을 할 수 있도록 하나의 프로젝트를 여러 갈래로 나누어 관리할 수 있습니다.

 

checkout은 로컬 저장소에서 작업하고자 하는 branch를 지정하여 전환할 수 있습니다.

 

옵션을 지정하지 않고 branch 명령어를 실행하면 브랜치 목록 전체를 확인할 수 있고 '*'가 붙어있는 명령어가 현재 선택된 branch를 의미합니다.

$ git branch

result =====================================
  
  Docs(add)_#005_readme
  Design_#006_layout_activity_home
  Feature_#007_presentation_HomeActivity
* master
    
=============================================

 

아래는 branch 생성 및 전환 방법 옵션을 알아보겠습니다.

$ git branch fix_#008_presentation_HomeViewModel
$ git branch feature_#009_util_sharedpreference Develop
  git branch [생성할 브랜치 명] [생성할 브랜치를 따올 브랜치 명]
  
$ git branch -d fix_#008_presentation_HomeViewModel
  -d 옵션 : branch 명령에 -d 옵션을 사용하면 지정된 브랜치를 삭제할 수 있습니다.

$ git checkout feature_#009_util_sharedpreference
  git checkout [전환하려는 브랜치 명]

$ git checkout -b feature_#009_util_sharedpreference
  -b 옵션 : checkout 명령에 -b 옵션을 사용하면 브랜치 생성과 전환을 한번에 할 수 있습니다.
  
$ git branch -m [기존의 branch] [새 branch]
기존의 branch 명을 변경합니다.

 

 

4. merge / rebase

병합이란 branch의 commit과 commit log 메시지를 함께 합치는 것을 의미하며, Git에서 하나의 branch를 다른 branch로 병합할 때 merge와 rebase 명령어를 사용할 수 있습니다.

 

merge는 자신이 작업하고 있는 branch에 다른 branch의 commit들을 가져와 시간 순서대로 병합하기 때문에 다른 branch들의 commit들과 순서가 섞이고, 병합에 대한 새 commit이 생성되어 commit history가 복잡해지는 단점이 있습니다.

$ git merge [병합시킬 branch 명] [병합 대상 branch 명]
checkout을 통해 branch 이동없이 바로 병합이 가능합니다.

$ git merge Feature
  git merge [현재 브랜치에 병합하려는 브랜치 명]  == --ff 옵션
  
$ git merge --no-ff Feature
  --no-ff 옵션 : 현재 브랜치와 병합 대상의 관계를 무시하고 무조건 병합됩니다.
  
$ git merge --ff-only Feature
--ff-only 옵션 : 현재 브랜치와 병합 대상의 관계가 Fast-Forward인 경우 병합되며, Merge 커밋이 생성되지 않습니다.
  
$ git merge --squash Feature
--squash 옵션 : 현재 브랜치와 병합 대상과의 차이나는 commit을 하나로 합쳐서 커밋합니다.

 

confilct(충돌)가 발생한 경우 충돌 파일들엔 "<<<", "===", ">>>"와 같은 표식이 남아있습니다. 이 표식들은 그대로 저장되기 때문에 모두 지우고 파일들에서 남기고 싶은 부분만 남겨 수정한 후에 add 명령어와 commit 명령어를 사용하면 됩니다.


 

rebase는 branch자신이 작업하고 있는 branch의 commit이 최상단으로 나타나고 다른 branch들의 commit들도 각각 자신의 branch로 묶여 병합하기 때문에 commit history가 깔끔합니다.

$ git rebase [다른 branch 명]
자신이 작업하고 있는 branch의 commit들이 최상단으로 나타나고 다른 branch들의 commit들도 
각각 자신의 branch로 묶여 병합

$ git rebase -i [다른 branch 명]
자신이 작업하고 있는 branch의 commit들을 수정한 후 최상단으로 나타나고 다른 branch들의
commit들도 각각 자신의 branch로 묶여 병합

$ git rebase -i HEAD~[commit 갯수]
자신이 작업하고 있는 branch의 commit들을 수정하여 재배치 합니다.

-i 옵션을 사용하면 vi 에디터를 통해 commit hystory를 보여주는데, 각 commit 앞에 pick이 
적힌 상태로 표시되어 있습니다.
여러 개의 commit 메시지를 합치기 위해 기준이 될 commit엔 pick을 유지하고 기준이 되는
commit과 합쳐 처리하려는 commit에는 s를 입력하여 vi 에디터를 저장하면 다시 vi 에디터가 
나오고 commit log를 수정한 후 저장하는 작업을 기준이 되는 commit 수 만큼 반복하면 됩니다.

 

confilct(충돌)가 발생한 경우 충돌 파일들엔 "<<<", "===", ">>>"와 같은 표식이 남아있습니다. 이 표식들은 그대로 저장되기 때문에 모두 지우고 파일들에서 남기고 싶은 부분만 남겨 수정한 후에 add 명령어와 rebase --continue 명령어를 통해 rebase 작업을 진행시키는 작업을 반복하며 충돌을 처리하면 됩니다.

$ git rebase --continue
충돌이 발생하면서 멈춰진 rebase가 진행됩니다.

$ git rebase --abort
만약 rebase 작업을 하기 전으로 돌아갑니다.

 


 

 

5. add

add는 다음 변경(commit)을 기록할 때까지 변경분을 모아놓기 위해서 사용합니다. 즉 commit 명령어를 통해 저장소에 명시적으로 기록을 남기기 전까지는 add 명령어로 Index 영역에 기록하기 때문에 변경 이력에는 영향을 주지는 않습니다.

$ git add test.txt

$ git add *
현재 디렉토리의 모든 변경 내용 중 .gitignore 파일에 있는 파일명들도 함께 Staging Area에 넘깁니다.

$ git add .
현재 디렉토리의 모든 변경 내용 중 .gitignore 파일에 있는 파일명들은 제외하고 Staging Area에 넘깁니다.

$ git add -A
작업 디렉토리 내의 모든 변경 내용을 몽땅 Staging Area에 넘깁니다.

$ git add -p
각 변경 사항을 직접 눈으로 하나씩 확인하면서 Staging Area에 넘기거나, 제외할 수 있습니다.
따라서 변경 내용이 많은 경우 여러 개의 변경 기록으로 나누어 남길 수 있도록 할 수 있습니다.

$ git reset HEAD test.txt
add 명령으로 Staging Area에 넘겨진 파일들을 꺼낼 수 있습니다. (add 취소)

 

 

만약 Git을 처음 사용하게되면 commit이 되지 않을 겁니다. 그런 경우 Part 1의 1️⃣ 사용자 정보 설정에서 "Git 사용자 이름과 이메일 주소를 설정"이라는 부분의 명령어를 사용해 본인의 정보를 등록하면 됩니다.

https://goni95.tistory.com/163

 

😃Git bash - Part 1 : 사전지식과 초기 설정 & Github와 Git 연결하기

😃 Git 컴퓨터 파일의 변경사항을 추적하고 여러 사용자들 간에 해당 파일 작업을 조율하기 위한 대표적인 버전 관리 시스템(VCS) 입니다. 😃 Github Git을 사용하는 프로젝트를 지원하는 웹호스팅

goni95.tistory.com

 

 

6. commit

commit은 Header 영역에 Index 영역의 현재 내용에 대한 변경 사항을 기록하고 HEAD는 이 commit을 가르키도록 합니다. 즉, 변경 사항을 명시적으로 기록합니다.

 

commit에 대한 기록을 확인하고 싶다면 git log 명령어를 통해 확인할 수 있습니다.

$ git commit -m "log 메시지"
HEADER 영역에 Index 영역의 현재 내용과 변경 사항을 설명하는 log 메시지를 포함하는 새 commit을 기록

$ git commit -c [변경위치: commit 개체]
HEADER 영역에 Index 영역의 현재 내용을 기록하면서 명시된 commit 개체를 가져와 
log 메시지, 작성자 정보, timeStamp를 재사용하여 log 메시지를 작성할 수 있습니다.

$ git commit --amend -m "log 메시지"
HEADER 영역에 기록된 가장 최근의 commit에 대한 log 메시지를 변경합니다.

 

변경 위치는 log 명령어를 사용하여 출력되는 commit 뒤의 hashCode를 사용합니다.

여기서 중요한 점은 hashCode가 중복되지 않는다면 "1345b" 까지만 입력해도 알아서 해당 위치의 commit을 찾아 되돌리니 hashCode를 전부 입력할 필요는 없습니다.

$ git log

commit a4409f6db3b3e63183ca839f27a9b3b363832fd3 (HEAD -> master)
Author: GONI95 <sanggoni009@gmail.com>
Date:   Fri Mar 25 10:24:14 2022 +0900

    두번째 커밋

commit 1345b51d623b836d7d42409c72f9753a420cd9d4
Author: GONI95 <sanggoni009@gmail.com>
Date:   Thu Mar 24 20:19:53 2022 +0900

    첫번째 커밋

 

 

7. push

git push -d origin 02_Main : 원격 저장소 브런치 삭제

 


 

 

8. status

status는 Index 영역의 현재 내용과 현재 HEAD가 가르키는 commit 사이에 차이 / Working Directory 영역와 Index 영역의 현재 내용 사이에 차이 / Git에 의해 추적되지 않는 Working Directory의 상태에 대한 내용을 표시합니다.

$ git status
위 설명 참고

$ git status -s
짧은 형식으로 표시됩니다.

$ git status -v
변경된 파일의 파일 명 외에도 Index 영역에 기록되어 있는 변경 사항의 내용도 표시됩니다.

$ git status -v -v
변경된 파일의 파일 명 외에도 Index 영역에 기록되어 있는 변경 사항의 내용과
Working directory 영역의 변경 사항도 표시됩니다.
결과 : $ touch ex01.txt ex02.txt 를 입력해 파일을 생성만 한 상태에서 명령어를 사용했을 경우

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        ex01.txt
        ex02.txt

nothing added to commit but untracked files present (use "git add" to track)
결과 : $ git add . 명령어를 통해 Index 영역에 등록한 경우

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   ex01.txt
        new file:   ex02.txt
결과 : $ vi ex01.txt 를 입력하고 파일 내용을 변경하고 $ git add . 를 입력해 Index 영역에 등록한 경우

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   ex01.txt

 

 

 9. log / reflog

log는 commit에 대한 변경 사항을 설명하는 log 메시지를 표시합니다.

 

log와 reflog의 차이점

만약 reset 명령어를 통해 commit log를 "세번째 커밋" -> "두번째 커밋"으로 변경한 경우 log 명령어는 "세번째 커밋"이라는 commit에 대한 이력이 출력되지않고 "두번째 커밋"이라는 commit에 대한 이력이 출력지만 reflog 명령어는 한번이라도 commit을 통해 기록한 모든 이력이 출력됩니다.

$ git log
commit log 표시

결과:
commit a8f9d97fd8e0c359ba1786b1f610af56e9e1b117 (HEAD -> master)
Author: GONI95 <sanggoni009@gmail.com>
Date:   Fri Mar 25 11:49:11 2022 +0900

    2. 두번째 커밋 [-c 시도 중]

commit 1345b51d623b836d7d42409c72f9753a420cd9d4
Author: GONI95 <sanggoni009@gmail.com>
Date:   Thu Mar 24 20:19:53 2022 +0900

    첫번째 커밋
$ git reflog
모든 commit log가 표시

결과 :
a8f9d97 (HEAD -> master) HEAD@{0}: commit: 2. 두번째 커밋 [-c 시도 중]
1345b51 HEAD@{1}: reset: moving to 1345b
c1a8624 HEAD@{2}: commit: 2. 두번째 커밋
1345b51 HEAD@{3}: reset: moving to 1345b
27e27c0 HEAD@{4}: commit: 2. 두번째 커밋
1345b51 HEAD@{5}: reset: moving to 1345b
09d1705 HEAD@{6}: reset: moving to 09d17
09d1705 HEAD@{7}: reset: moving to 09d17
09d1705 HEAD@{8}: commit: 두번째 커밋
1345b51 HEAD@{9}: reset: moving to 1345b
0a01bda HEAD@{10}: commit: 세번째 커밋
d31f420 HEAD@{11}: commit: 두번째 커밋
1345b51 HEAD@{12}: reset: moving to 1345b
1980640 HEAD@{13}: commit: 세번째 커밋
	... 아래로 갈수록 이전의 commit 이력입니다.

 

옵션

$ git 명령어 [파일 명]
특정 파일의 변경 commit 이력과 log를 표시

$ git 명령어 -p
commit 이력과 log 그리고 diff를 표시

$ git 명령어 --name-only
commit 정보 중 수정된 파일의 목록만을 표시

$ git 명령어 --pretty=[online, short, full, fuller, format 등]
지정한 형식으로 commit 이력과 log를 표시

$ git 명령어 --pretty=format: "%h - %an, %ar : %s"
원하는 format으로 commit 이력과 log를 표시


$ git 명령어 [브런치 명]
특정 branch의 reflog 표시

$ git 명령어 --all
더 디테일한 모든 commit log가 표시

$ git 명령어 delete
reflog를 삭제
format 옵션 format 설명
%H
커밋 해시
%h
짧은 길이 커밋 해시
%T
트리 해시
%t
짧은 길이 트리 해시
%P
부모 해시
%p
짧은 길이 부모 해시
%an
저자 이름
%ae
저자 메일
%ad
저자 시각 (형식은 –date= 옵션 참고)
%ar
저자 상대적 시각
%cn
커미터 이름
%ce
커미터 메일
%cd
커미터 시각
%cr
커미터 상대적 시각
%s
요약

 

 

10. reset

reset은 현재 HEAD를 지정된 상태로 재설정합니다. 

$git reset
add 명령어를 통해 Index 영역에 등록한 전체 파일의 등록을 취소
즉, add 명령어를 수행하기 전 상태로 되돌립니다.

$git reset HEAD [파일명]
add 명령어를 통해 Index 영역에 등록한 전체 파일 중 명시된 파일에 대한 등록을 취소
즉, 특정 파일에 대해 add 명령어를 수행하기 전 상태로 되돌립니다.

$ git reset --soft [변경 위치: commit 개체]
변경 위치로 commit을 되돌리지만, 변경 내용을 add 명령어를 통해 Index 영역에 등록한 상태로 되돌립니다.
즉, commit log를 변경하려는 경우 사용하기 좋습니다.


$ git reset --mixed [변경 위치: commit 개체]
변경 위치로 commit을 되돌리지만, 변경 내용을 Index 영역에 등록은 하지않고 Working Directory 영역에
변경 내용이 남아있는 상태로 되돌립니다.
즉, 변경 내용이 잘못되거나 수정하고 싶은 경우 사용하기 좋습니다.


$ git reset --hard [변경 위치: commit 개체]
변경 위치로 commit을 아예 되돌립니다. 
즉, Working Directory 영역에도 변경 내용이 남아있지 않는 상태로 되돌립니다.


$ git reset HEAD^
가장 최근의 커밋이 취소됩니다. (Default Option : mixed)


$ git reset HEAD~[취소할 commit 수]
현재로 부터 원하는 만큼의 commit이 취소됩니다. (Default Option : mixed)


$ git reset --hard ORIG_HEAD
reset 명령어가 실행되기 전으로 되돌릴 수 있습니다.
ORIG_HEAD : reset 전의 commit을 의미

$ git reset --merge
merge를 취소합니다.

 

변경 위치는 log 명령어를 사용하여 출력되는 commit 뒤의 hashCode를 사용합니다.

여기서 중요한 점은 hashCode가 중복되지 않는다면 "1345b" 까지만 입력해도 알아서 해당 위치의 commit을 찾아 되돌리니 hashCode를 전부 입력할 필요는 없습니다.

$ git log
commit a4409f6db3b3e63183ca839f27a9b3b363832fd3 (HEAD -> master)
Author: GONI95 <sanggoni009@gmail.com>
Date:   Fri Mar 25 10:24:14 2022 +0900

    두번째 커밋

commit 1345b51d623b836d7d42409c72f9753a420cd9d4
Author: GONI95 <sanggoni009@gmail.com>
Date:   Thu Mar 24 20:19:53 2022 +0900

    첫번째 커밋

 

 

11. 브랜치와 스태시

 

 

 


 

Stash

일반적인 wd > index > header 영역과는 별개의 임시영역

임시적으로 작업 사항을 저장해놓고 나중에 꺼낼 수 있다.