⭐ 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 키를 생성해서 원격 접속을 해야한다(아래 내용 정리)
그 다음 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브랜치 마지막 커밋을 현재 내 브랜치로 가져온다