단축키/Git & Github

Git 자주 사용하는 명령어 모음

오늘도출근하는다람쥐 2023. 12. 9. 22:22

 Git 자주 사용하는 명령어 모음

 

명령어예시

Git 초기화 하기 git init
Git 초기화 + 디렉토리 생성 git init [디렉토리이름]
Git 설정 확인 git config --list
Git 설정 변경(NAME) - 해당프로젝트 git config user.name “user이름”
Git 설정 변경(NAME) - 전체 git config --global user.name “user이름”
Git 설정 변경(EMAIL) - 해당프로젝트 git config user.email “유저 이메일”
Git 설정 변경(EMAIL) - 전체 git config --global user.email “유저 이메일”
Git 설정 삭제(NAME) git config --unset user.name
Git 설정 삭제(EMAIL) git config --unset user.email
Git 클론 git clone <저장소 url>
Git 상태확인 git status
Git 커밋 이력 확인 git log
Git 커밋 이력 확인 [한줄표시] git log --oneline
Git 커밋 이력 확인 [branch표시] git log --branches
Git 커밋 이력 확인 [Graph] git log --graph
Git 커밋 이력 확인 [종합] git log --oneline --branches --graph
Git 커밋 이력 확인 [변경 파일 포함] git log --stat
Git 스테이지 올리기 git add 파일명 [→ 전체 목록 올리기 명령어 : git add . ]
Git 커밋 git commit -m “커밋 메시지”
Git 스테이징 업로드 + 커밋 동시에 git coomit -am “커밋 메시지”
Git 커밋 메시지 수정하기 git commit --amend
변경 사항 확인 git diif
ignore 등록 vim .gitignore
작업 트리에서 수정한 파일 되돌리기 git checkout -- [파일 이름(hello.txt)]
스테이징 되돌리기 git reset HEAD [파일 이름(hello.txt)]
최신 커밋 되돌리기 git reset HEAD^
특정 커밋으로 되돌리기 git reset [되돌아갈 커밋해시]
특정 커밋으로 되돌리기 git revert [취소할 커밋해시]
브랜치 목록 조회(현재 사용 *표시) git branch
새 브랜치 만들기 git branch [브랜치 이름]
브랜치 사이 이동하기 git checkout [브랜치 이름]
브랜치 사이의 차이점 알아보기 git log [a브랜치]..[b브랜치]
브랜치 병합하기 git merge [브랜치 이름]
브랜치 삭제하기 git branch -d [브랜치 이름]
다른 브랜치 커밋 되돌리기 git reset [되돌아갈 다른 브랜치 커밋해시]
수정 중인 파일 감추기 git statsh
수정 중인 파일 목록 보기 git statsh list
수정 중인 파일 되돌리기 git statsh pop
원격 저장소 연결하기(HTTPS) git remote add origin [원격 저장소 HTTPS 주소]
원격 저장소 연결 확인(정상 동작 체크) git remote -v
원격 저장소에 파일 올리기(최초) git push -u origin master
원격 저장소에 파일 올리기(연결 이후) git push
원격 저장소에서 내려받기(최초 / 이후) git pull origin master / git pull
ssh-key 생성방법 ssh-keygen -t ed25519 -C “이메일주소”
원격 저장소 복제하기 git clone [원격 저장소 주소]
원격 브랜치 정보 가져오기 git fetch
브랜치 병합하기(커밋기록 남기기) git merge —no-if —log [브랜치 이름]
마스터 브랜치의 이력 깔끔하게 관리 git rebase —continue

 

 

호돌맨의 요절복통 개발쇼 Git 정리

-SSH 키를 생성해서 원격 접속을 해야한다(아래 내용 정리)

🔽 git push 재실행(발급 받은 토큰 사용)

그 다음 github 페이지로 들어가서 New Repository를 클릭

⭐ 여기서 레퍼지토리 생성시 README, gitignore 파일 생성 X

→ 파일 생성을 하면 바로 커밋이 된 상태로 시작하기 때문에 우리 로컬 프로젝트랑 싱크가 안맞아서 한번 POOL을 받고 진행해야 하기 때문

레퍼지토리 생성하면 아래와 같은 화면이 나온다

터미널로 프로젝트 경로에 들어가서 echo 명령어로 README 파일을 만들어보자

giyeonpak@Giyeonui-MacBookPro brawl % pwd
/Users/giyeonpak/Desktop/B.DEVELOPER/02.Back-End/01.SpringBoot/24.brawl/brawl
giyeonpak@Giyeonui-MacBookPro brawl % echo "# infrean-blog" >> README.md 
giyeonpak@Giyeonui-MacBookPro brawl % cat README.md
# infrean-blog

그 다음 git init으로 초기화를 진행하고 README.md를 스테이징에 올린다음 커밋 진행

giyeonpak@Giyeonui-MacBookPro brawl % git init
/Users/giyeonpak/Desktop/B.DEVELOPER/02.Back-End/01.SpringBoot/24.brawl/brawl/.git/ 안의 기존 깃 저장소를 다시 초기화했습니다
giyeonpak@Giyeonui-MacBookPro brawl % git config --local user.name "Giyeon Pak"
giyeonpak@Giyeonui-MacBookPro brawl % git config --local user.email "qkrrldus93g@gmail.com"
giyeonpak@Giyeonui-MacBookPro brawl % git add README.md
giyeonpak@Giyeonui-MacBookPro brawl % git commit -m "first commit"
[master 9e913c4] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
giyeonpak@Giyeonui-MacBookPro brawl % **git branch -M main**
giyeonpak@Giyeonui-MacBookPro brawl % **git remote add origin git@github.com:ihchoco/infrean-blog.git**
giyeonpak@Giyeonui-MacBookPro brawl % git remote -v
origin	git@github.com:ihchoco/infrean-blog.git (fetch)
origin	git@github.com:ihchoco/infrean-blog.git (push)
giyeonpak@Giyeonui-MacBookPro brawl % **git push -u origin main**
오브젝트 나열하는 중: 3, 완료.
오브젝트 개수 세는 중: 100% (3/3), 완료.
오브젝트 쓰는 중: 100% (3/3), 230 bytes | 230.00 KiB/s, 완료.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:ihchoco/infrean-blog.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.

현재 사용하고 있는 git branch 이름 변경 → git branch -M [이름]

<aside> 💡 git branch -M main

</aside>

초기에 Master라는 이름을 기본으로 사용했지만, 요즘에는 main으로 바꿔서 사용하기에 우리도 변경해주자

git init 할때 기본 브랜치명(default branch name)을 main 으로 설정하기

위에 처리를 한 다음 gitignore 파일을 만들어서 필요없는 부분들을 붙여넣어 주자

giyeonpak@Giyeonui-MacBookPro brawl % vim .gitignore
giyeonpak@Giyeonui-MacBookPro brawl % cat .gitignore
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

.gitignore파일을 등록해주면 자동으로 git status에 추적대상에서 제외가 되며 git add .(전체)를 등록해도 포함되지 않는다

git add .을 해보자

giyeonpak@Giyeonui-MacBookPro brawl % git add .
warning: in the working copy of 'gradlew.bat', CRLF will be replaced by LF the next time Git touches it

🤭 그런데 갑자기 에러가 발생하였다?

[Git 경고 메세지] LF will be replaced by CRLF in 해결 방안

해결방법

giyeonpak@Giyeonui-MacBookPro brawl % git config --global core.autocrlf input

이렇게 입력해주고 git add . 하면 정상적으로 동작 + 커밋 & 푸시

giyeonpak@Giyeonui-MacBookPro brawl % git add .
giyeonpak@Giyeonui-MacBookPro brawl % git status
giyeonpak@Giyeonui-MacBookPro brawl % git commit -m "project commit"
giyeonpak@Giyeonui-MacBookPro brawl % git push
오브젝트 나열하는 중: 143, 완료.
오브젝트 개수 세는 중: 100% (143/143), 완료.
Delta compression using up to 8 threads
오브젝트 압축하는 중: 100% (117/117), 완료.
오브젝트 쓰는 중: 100% (142/142), 177.29 KiB | 729.00 KiB/s, 완료.
Total 142 (delta 10), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (10/10), done.
To github.com:ihchoco/infrean-blog.git
   f083a0d..9c95cdd  main -> main

정상적으로 commit & push 완료

만약 다른 PC에서 해당 프로젝트를 다운받고 싶으면 아래 명령어를 입력하면 된다**(먼저 SSH 키를 등록하고 나서 작업해야한다)**

git clone git@github.com:ihchoco/infrean-blog.git

호돌맨이 자주 쓰는 GIT 명령어

//git 상태확인
git status

//git 변경 확인
git diff //터미널 보다는 소스트리와 같은 도구를 사용 추천

//스테이지 올리기
git add [파일명]

//스테이지 내리기
git reset

//git 커밋
git commit -m "회사마다 다름(정책)"

//git log 확인
git log

//git config 설정
git config --local user.name "Giyeon Pak"
git config --global user.name "Giyeon Pak"

//원격지에 반영
git push

//신규 기능을 만들 때 -> 브랜치를 새로 만들어야 함(만들고 브랜치 이동)
git checkout -b [브랜치명]  

//깃 브랜치 확인
git branch

//git push 헬프 보기
git push --help

**//git push (origin에 mybranch라는 곳에 업로드)**
**git push -u origin mybranch**

git push -upstream은 git push -u 명령어와 동일

여기서 master를 했는데 does not match any라고 나오는 이유는 github 원격 레퍼지터리에 master라는 브랜치가 없기 때문

⭐ 오직 main 브랜치만 있음

giyeonpak@Giyeonui-MacBookPro brawl % git checkout -b mybranch
새로 만든 'mybranch' 브랜치로 전환합니다

//중요(새로운 브랜치 만든걸로 원격 레포지터리 업로드)
giyeonpak@Giyeonui-MacBookPro brawl % **git push -u origin mybranch**
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: Create a pull request for 'mybranch' on GitHub by visiting:
remote:      <https://github.com/ihchoco/infrean-blog/pull/new/mybranch>
remote:
To github.com:ihchoco/infrean-blog.git
 * [new branch]      mybranch -> mybranch
branch 'mybranch' set up to track 'origin/mybranch'.

여기보면 기존에 없었던 mybranch라는게 새로 생겼음

테스트로 MyBranch에 있는 PostService 소스에 System.out.println 내용 추가

다시 커밋 & 푸시 해보자

giyeonpak@Giyeonui-MacBookPro brawl % git commit -m "mybranch hello2 change"
[mybranch 64f5d93] mybranch hello2 change
 1 file changed, 1 insertion(+)
giyeonpak@Giyeonui-MacBookPro brawl % **git push**
오브젝트 나열하는 중: 17, 완료.
오브젝트 개수 세는 중: 100% (17/17), 완료.
Delta compression using up to 8 threads
오브젝트 압축하는 중: 100% (6/6), 완료.
오브젝트 쓰는 중: 100% (9/9), 729 bytes | 66.00 KiB/s, 완료.
Total 9 (delta 3), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
To github.com:ihchoco/infrean-blog.git
   9c95cdd..64f5d93  mybranch -> mybranch

mybranch로 들어가면 아까 수정했던 내용이 반영되어 있음 → 그렇다면 혹시 main은 어떻게 되어있을까?

main 브랜치에는 아까 수정한 내용이 반영되어 있지 않음(즉, mybranch에만 내용이 수정되었음 GOOD)

깃 체크아웃 & merge 방법

git checkout main //mybranch -> main 브랜치 이동
git merge mybranch //main브랜치가 mybranch 병합 (System.out.println("hello2 ~") 반영

giyeonpak@Giyeonui-MacBookPro brawl % **git checkout main**
'main' 브랜치로 전환합니다
브랜치가 'origin/main'에 맞게 업데이트된 상태입니다.
giyeonpak@Giyeonui-MacBookPro brawl % **git merge mybranch**
업데이트 중 9c95cdd..64f5d93
Fast-forward
 src/main/java/com/brawl/service/PostService.java | 1 +
 1 file changed, 1 insertion(+)

giyeonpak@Giyeonui-MacBookPro brawl % **git log**
commit 64f5d937fecee15155d1e46a00c06d708240b4d7 (HEAD -> main, origin/mybranch, mybranch)
Author: Giyeon Pak <qkrrldus93g@gmail.com>
Date:   Fri Oct 20 12:27:01 2023 +0900

    mybranch hello2 change

commit 9c95cdd1fa2040d9f64cd4a5ade6351a5f4af603 (origin/main)
Author: Giyeon Pak <qkrrldus93g@gmail.com>
Date:   Thu Oct 19 22:29:05 2023 +0900

    project commit

깃 커밋 되돌리기

git reset --hard 커밋 해시코드

before 커밋 로그

giyeonpak@Giyeonui-MacBookPro brawl % git log
commit 64f5d937fecee15155d1e46a00c06d708240b4d7 (HEAD -> main, origin/mybranch, mybranch)
Author: Giyeon Pak <qkrrldus93g@gmail.com>
Date:   Fri Oct 20 12:27:01 2023 +0900

    mybranch hello2 change

commit 9c95cdd1fa2040d9f64cd4a5ade6351a5f4af603 (origin/main)
Author: Giyeon Pak <qkrrldus93g@gmail.com>
Date:   Thu Oct 19 22:29:05 2023 +0900

    project commit

현재 mybranche hello2 change로 병합되어 있는데, 병합 전으로 되돌리자

after 커밋 로그

giyeonpak@Giyeonui-MacBookPro brawl % git reset --hard 9c95cdd1fa2040d9f64cd4a5ade6351a5f4af603
HEAD의 현재 위치는 9c95cdd입니다 project commit
giyeonpak@Giyeonui-MacBookPro brawl % git log
commit 9c95cdd1fa2040d9f64cd4a5ade6351a5f4af603 (HEAD -> main, origin/main)
Author: Giyeon Pak <qkrrldus93g@gmail.com>
Date:   Thu Oct 19 22:29:05 2023 +0900

    project commit

다시 merge를 해보자

git merge --no-ff --log mybranch //merge 할 때 메시지도 같이 남기는 방법
giyeonpak@Giyeonui-MacBookPro brawl % **git merge --no-ff --log mybranch**

Merge branch 'mybranch'

* mybranch:
  mybranch hello2 change
# 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.
~
~

로그를 확인해보자

commit b18667b8493bd6bebafbc9e896babeccbd2f4b54 (HEAD -> main)
Merge: 9c95cdd 64f5d93
Author: Giyeon Pak <qkrrldus93g@gmail.com>
Date:   Fri Oct 20 21:51:03 2023 +0900

    **Merge branch 'mybranch'

    * mybranch:
      mybranch hello2 change**

commit 64f5d937fecee15155d1e46a00c06d708240b4d7 (origin/mybranch, mybranch)
Author: Giyeon Pak <qkrrldus93g@gmail.com>
Date:   Fri Oct 20 12:27:01 2023 +0900

    mybranch hello2 change

commit 9c95cdd1fa2040d9f64cd4a5ade6351a5f4af603 (origin/main)
Author: Giyeon Pak <qkrrldus93g@gmail.com>
Date:   Thu Oct 19 22:29:05 2023 +0900

    project commit

giyeonpak@Giyeonui-MacBookPro brawl % git log --oneline --branches --graph
*   b18667b (HEAD -> main) Merge branch 'mybranch'
|\\
| * 64f5d93 (origin/mybranch, mybranch) mybranch hello2 change
|/
* 9c95cdd (origin/main) project commit
* f083a0d first commit

그 다음 git push

giyeonpak@Giyeonui-MacBookPro brawl % git push
오브젝트 나열하는 중: 1, 완료.
오브젝트 개수 세는 중: 100% (1/1), 완료.
오브젝트 쓰는 중: 100% (1/1), 248 bytes | 248.00 KiB/s, 완료.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:ihchoco/infrean-blog.git
   9c95cdd..b18667b  main -> main

⭐ 충돌 발생할 때

만약 내가 main브랜치에서 pull해서 mybranch에서 작업을 하고 있었는데 그 사이 누군가 똑같은 파일에 똑같은 라인 수정을 하고 main 브랜치 push 했다

그럴경우에는 conflict(충돌)이 발생한다

giyeonpak@Giyeonui-MacBookPro brawl % git merge --no-ff --log mybranch
자동 병합: src/main/java/com/brawl/service/PostService.java
충돌 (내용): src/main/java/com/brawl/service/PostService.java에 병합 충돌
자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.

//그리고 파일을 보면 아래와 같이 나와있다
<<<<<<< HEAD
        System.out.println("hello3 <<여기 newbranch에서 변경(충돌발생)>>");
=======
        System.out.println("hello4 <<여기 mybranch에서 변경(충돌발생하기)>>");
>>>>>>> mybranch

//여기서 원하는 부분만 남기고 나머지 삭제(나는 mybranch를 작업했으니 mybranch를 살리겠다)
System.out.println("hello4 <<여기 mybranch에서 변경(충돌발생하기)>>");

git rebase는 실무에서 가장 많이 쓰이는 명령어이기 떄문에 꼭 알아두자

git rebase --continue // main브랜치 마지막 커밋을 현재 내 브랜치로 가져온다