개발 환경/GitㆍGitHub

git 명령어

은선은 2022. 4. 19. 15:50

사용자 설정

working directory (untracked, tracked) -> staging area -> .git directory(repository) -> remote

 

공통

명령어 옵션 설명 예시 비고
  --global 글로벌적으로    
rm -rf .git   깃 삭제    
  -h
--help
도움말 보기 git status -h  
         

 

사용자 설정

명령어 옵션 설명 예시 비고
git config --list 설정 확인 git config --list  
  vscode로 에디터 설정 git config --global core.editor "code --wait"  
  사용자 이름 설정 git config —global user.name blarblar  
  사용자 메일 설정 git config —global user.email blarblar@gmail.com  
user.name 원하는 속성 확인 git config user.name  
core.autocrlf 운영체제별 줄바꿈 다른 이슈 해결 git config --global core.autocrlf input true
—global alias 단축어 설정 git config —global alias.st status  
init.defaultBranch 기본 브랜치 master -> main으로 변경 git config --global init.defaultBranch main  
core.editor 기본 에디터 vim -> vsCode 로 변경 git config --global core.editor "code --wait"  

 

기본 명령어

명령어 옵션 설명 예시 비고
git init   깃 초기화(생성)    
git clean   저장소에서 추적하지 않는 파일들(Untracked files)을 삭제    
-fd   git clean -fd : force적으로 directory 삭제 (force directory)
git status -s (간단히) 깃 상태 보기    
git add   staging area로 이동 git add * (.gitignore에 있는 파일까지 모두 add)
git add . (.gitignore에 있는 파일 빼고 모두 add)
 
git rm --cached stg -> wd(untracked)이동    
git diff   wd에 있는 변경사항 비교    
--staged
--cached
stg에 있는 변경사항 비교    
git diff [hashCode] [hashCode] 해시코드로 두 커밋 비교
git diff bd7bd285 bd7bd285
 
git difftool   에디터에서 변경사항 비교    
git commit   stg에서 prd로 커밋    
-a wd에서 prd로 바로 커밋  add 생략하고 한번에 커밋 (all) 추적되는 파일이어야 함.
-m 커밋 메세지 git commit -m "first commit"  
--amend 커밋 내용을 변경 (수정한 파일을 최근 커밋에 그냥 덮기) 1. 변경된 파일을 stg에 올린다.
2. git commit —amend 한다.
3. 메세지도 변경하고 싶으면 -m 옵션을 추가한다. (git commit —amend만 잘 안되어서, -m 옵션까지 하니 잘 되었다ㅠ)
 
--amend -m 커밋 메세지 변경 git commit --amend 화면 새로 뜨면 거기에 수정 후 저장
git rm   삭제하면서 바로 stg로 이동 git rm a.txt  
git mv   파일명 변경하면서 바로 stg로 이동 git mv a.txt b.txt  
git show [hashCode] 해당 커밋 내용 자세하게 보기    
[hashCode]:[FileName] 해당 해시코드 커밋 중 특정 파일의 커밋 내용만 확인 git show bd7bd285:about.html  
[tagName] 태그 내용 상세히 보기    
HEAD 현재 HEAD의 커밋 상세히 보기    

 

log

명령어 옵션 설명 예시 비고
git log   커밋 로그 확인   드림코딩 3.12강의 참고
-p 로그 자세히 보기   (patch) 
--oneline 한줄로 간단히 보기    
—reverse 최근 커밋부터 보기    
--graph 로그를 그래프처럼 보여주기    
-[Number] 원하는 개수만 보기 git log -3  
  포맷화하여 보기 --pretty=format:"%h %an %ar %s"  
  원하는 작성자로 보기 —author="sunny"  
  날짜 지정하여 보기 —before="2020-10-20"  
  타이틀명 필터하여 보기 —grep="project"  
-S 코드내용 필터하여 보기 -S "about" 코드 내용중에 about이 포함된 커밋만 보기 (-p를 붙이면 자세히 보여줌)
[FileName] 원하는 파일의 커밋만 보기 git log about.txt  

 

tag

명령어 옵션 설명 예시 비고
git tag   repository의 모든 태그 확인하기   드림코딩 3.15강의 참고
[tagName] 특정 커밋을 북마크 git tag v2.0.0 해당 헤드가 가르키는 커밋에 태그됨
[tagName] [hashCode] 특정 커밋에 태그 작성 git tag v1.0.1 123456a  
[tagName] [hashCode] -a -m 또는 -am "tagMessage" 특정 커밋에 상세 메세지 넣어서 태그 작성 git tag v1.0.1 123456a -am "Release note..."  
-l "와일드카드" 특정 문자열이 포함된 태그 확인하기 git tag -l "v1.*"  
  -d [tagName] 태그 삭제하기    
         
         

 

stash

명령어 옵션 설명 예시 비고
git stash   wd에 있는 작업들을 잠시 stash stack에 보관 git stash push -m "first try" 기본적으로 untracked파일들은 올라가지 않는다
--keep-index stg에 있는 것을 유지하면서 stash stack에 보관 git stash push -m "second try" --keep-index 수정 파일이 stg에 올라가 있는 상태에서 stash를 하는 경우, stg의 수정사항 그대로 유지시키면서 stash
  -u untracked 파일들까지 stash git stash -u  
git stash list   stash 목록 확인    
git stash show [stash아이디] 각 stash 확인  git stash show stash@{1}  
-p 각 stash 자세히 확인    
git stash apply [stash아이디] stash 목록 유지하며 stash 가져오기   id를 지정하지 않으면 가장 위의 stash를 적용
git stash pop [stash아이디] stash 목록에서 제거하며 stash 가져오기   stash 리스트에서 사라짐
git stash drop [stash아이디] 특정 stash 삭제    
git stash clear   stash 전체 삭제    
git stash branch  [new branch name] stash를 적용하면서 새로운 branch 생성 git stash newBranch  

 

브랜치

명령어 옵션 설명 예시 비고
git branch   브랜치 확인   현재 repository의 브랜치들 확인
(로컬 피씨의 브랜치만 보여줌)
--all 서버에 있는 브랜치들까지 전부 보여줌    
[newBranchName] 브랜치 생성 git branch new-branch  
—merged 현재 브랜치에 merge된 브랜치들 확인 (브랜치 생성만되고 커밋되지 않은 것들도 포함)   반대는 —no-merged
-D [branchName] 브랜치 삭제    
--delete git 원격 브랜치 삭제 git push origin --delete [branchName] -D 옵션으로 삭제 안됨 ! 
--delete 옵션으로 삭제 해야함.
—move [원래이름] [바꿀이름] 브랜치 이름 변경    
-M [newBranchName] git branch -M main 현재 체크아웃된 브랜치네임을 다른네임으로 바꿔줌 (지금 체크아웃된 브랜치가 master라면, master브랜치네임이 main으로 바뀜)
git switch [branchName] 원하는 브랜치로 이동   checkout과 같은 기능이지만 git version 2.23.0부터 더 직관적인 명령어를 쓰기 위해서 생겨난 것
-C [newBranchName] 새 브랜치를 만들면서 동시에 이동   (create)
git checkout [hashCode] 특정 커밋으로 head변경 git checkout 01f2b68  
[tagName] 특정 태그로 head변경    
[branchName] 특정 브랜치로 head변경    
-b [newBranchName] 새 브랜치를 만들면서 동시에 이동   (branch)
-b [newBranchName] [tagName] 특정 태그로 체크아웃하면서 동시에 브랜치 만들기 git checkout -b testBranch v1.0.1 testBranch라는 브랜치가 v1.0.1에서 만들어짐
— [fileName] wd에서 취소 wd에서 수정한 파일을 최근 커밋한 버전의 파일로 초기화 git checkout — new.txt *. stg올라간건 안됨. working directory만 해당
* git restore [fileName]과 같음
git cherry-pick   필요한 커밋만 가져오기 git cherry-pick f2b9178 master 브랜치로 checkout 후 명령

 

취소

명령어 옵션 설명 예시 비고
git restore   wd에서 취소 wd에서 수정한 파일을 최근 커밋한 버전의 파일로 초기화 1. git restore new.txt
2. git restore .
untracked 파일은 초기화 되지 않음 → git clean -fd를 이용하여 지워야함.
—staged stg에서 취소 wd에서 수정한 파일을 최근 커밋한 버전의 파일로 초기화 (add의 반대)    
—source=HEAD~2 [fileName] 특정 커밋 버전의 파일로 초기화 git restore —source=HEAD~2 . head에서 두번째 아래 버전의 커밋으로 모든파일 초기화
git reset   특정 커밋 버전으로 커밋을 초기화 git reset HEAD~2 커밋도 삭제되고, 파일은 특정 커밋 버전 이후 wd까지 초기화
HEAD [fileName] 특정 커밋 버전의 파일만 초기화 1. git reset HEAD .
2. git reset HEAD~2 new.txt
커밋은 그대로 있고 파일만 그 상태로 초기화됨
—mixed [특정커밋위치] 특정 커밋 버전으로 커밋을 초기화 (작업 중 파일 wd에 포함)   git reset의 디폴트 옵션 ( 버전 히스토리에서는 커밋을 삭제하지만, wd에서 작업하고 있던 내용들은 복원 )
—soft [특정커밋위치] 특정 커밋 버전으로 커밋을 초기화 (작업 중 파일 stg에 포함)   버전 히스토리에서는 커밋을 삭제하지만, stg에서 작업하고 있던 내용들은 복원
—hrad [특정커밋위치] 특정 커밋 버전으로 커밋을 초기화 (작업 중 파일 미포함)   특정 커밋 버전으로 커밋한 직후 (수정한 작업파일 없는 상태로)
—hard [특정로그 해시코드] 특정 로그의 커밋상태로 헤드를 이동(reflog활용) git reset —hard e94152f  
git reflog   이전 헤드가 가리키고 있던 내용들의 로그 리스트    
git revert   특정 커밋의 변경사항을 취소해주는 커밋 생성 git revert [hashCode]
git revert HEAD~2
이미 서버에 올라간 경우라면, reset과 rebase가 아닌 revert를 사용하는 것이 맞음
—no-commit [hashCode] 특정 커밋의 변경사항을 취소해주면서 커밋은 생성하지 않음    
         
         

 

merge

명령어 옵션 설명 예시 비고
git merge   fast-forward merge git merge fix 헤드가 마스터에 있는 상태에서 마스터에 병합할 브랜치네임을 지정해준다.
--no-ff NO fast-forward-merge git merge --no-ff fix-c  
--abort 머지 취소    
--continue 머지 진행   충돌 사항을 수정한 후에 git add 해당파일 → git merge —continue 진행
git mergetool   에디터에서 머지    
git rebase   머지   베이스를 재설정하는 느낌
서버에 올라가 있는 경우는 사용하지 말 것 !
  특정 브랜치를 master브랜치의 가장 최신 커밋으로 이동 git rebase master rebase하고 싶은 브랜치로 checkout 한 후에 명령
--onto 다른 브랜치에서 파생된 브랜치만 독립적으로 master브랜치에 머지 git rebase --onto master profile profile-ui (profile브랜치에서 파생된 profile-ui브랜치를 master에 올리기) 드림코딩 4.10강의 참고
-i 이전 커밋 수정 git rebase -i [hashCode] (interactive)
* 그 이후 옵션을 선택하여 각종 변경사항을 적용할 수 있음.
* 변경을 원하는 해시코드의 이전 해시코드를 입력해야함.
* 변경한 커밋의 이후 커밋들 모두 뉴 커밋들이 되어 새로 생성되므로 해시코드도 변경됨
* 드림코딩 6.8강의 참고

 

 

remote

명령어 옵션 설명 예시 비고
git remote -v git origin 저장소 주소 확인    
git push   prd에서 remote로 푸시    
-f prd와 remote의 커밋이 다른 경우, remote커밋을 무시하고 prd커밋을 반영하게 하며 push   * remote에 다른 커밋이 있고,
wd에서도 다른 커밋이 잇는 경우에 push를 하게되면 에러가 뜸.
* 로컬과 원격에서 동시에 같은 파일이 수정되고, 로컬에서 push 할때, git push -f을 하게 되면 원격 커밋사항은 사라지고 , 로컬의 커밋으로 갈아엎어진다. (기존의 git history를 rebase를 이용하여 변경하는 경우 부득이하게 이용 할 수 있음)
--delete 삭제한 브랜치 원격에도 업데이트 git push origin --delete fix origin 원격에서 fix 브랜치 삭제
--set-upstream 변경한 브랜치 네임 원격에 업데이트 git push --set-upstream origin fix-welcome origin 원격에 fix-welcome이라고 수정한 브랜치 네임 업데이트 
         
         

git push 후 git merge origin/main 를 한번에 해주는 같은 명령어 = git fetch (테스트 해봤는데 안됨. merge 또 해야 함.)


git difftool 설정하기

git config --global -e 로 git config에 글로벌로 설정되어 있는 파일을 에디터로 열어서 아래 내용 추가

// diff 툴은 vscode 사용
[diff]
	tool = vscode
    
// code 다음에 터미널에서 기다리고, local과 remote를 비교
[difftool "vscode"]
	cmd = code --wait --diff $LOCAL $REMOTE

 


git log 포맷

 

$git log --graph --all --pretty=format:'%C(yellow)[%ad]%C(reset) %C(green)[%h]%C(reset) | %C(white)%s %C(bold red){{%an}}%C(reset) %C(blue)%d%C(reset)' --date=short

git hist alias 만들기

$git config --global alias.hist "log --graph --all --pretty=format:'%C(yellow)[%ad]%C(reset) %C(green)[%h]%C(reset) | %C(white)%s %C(bold red){{%an}}%C(reset) %C(blue)%d%C(reset)' --date=short"

semantic versioning

출처 앨리 드림코딩

major: 특정 기능이 추가, 전체적입 업데이트가 발생했을 때

minor: 커다란 기능 중에 조금의 기능들이 업데이트, 개선했을 때

fix: 기존의 기능에서 오류수정을 했을 때, 성능이 조금 개선되었을 때


merge conflict

 

master와 feature브랜치 모두 같은 파일을 수정한 상황에서 merge 하는 경우

 

1. 수동으로 해결하기

 

$ git checkout master

$ git merge feature

! conflict 발생 !

conflict 발생한 파일 열어서 conflict 해결 후 저장

$git status로 파일이 staging area에 있는지 확인 후 이동 (아마 working directory에 있을 것. $git add .로 이동)

$ git merge --continue

 

2. VS Code로 해결하기

 

git config --global -e 로 git config에 글로벌로 설정되어 있는 파일을 에디터로 열어서 아래 내용 추가

// merge툴은 vscode 사용
[merge]
	tool = vscode
    
// code 다음에 터미널에서 기다리고 머지
[mergetool "vscode"]
	cmd = code --wait $MERGED

// 머지하고 나서 .orig 파일 생기는 것 false
[mergetool]
	keepBackup = false
$ git mergetool

vscode에서 conflict 해결 후 저장

$git status로 파일이 staging area에 있는지 확인 후 이동 (아마 있을 것 바로 진행)

$ git merge --continue

 

2. p4merge로 해결하기

p4merge 설치
git config --global -e 로 git config에 글로벌로 설정되어 있는 파일을 에디터로 열어서 아래 내용 추가

 

// merge툴은 p4merge 사용
[merge]
	tool = p4merge
    
// code 다음에 터미널에서 기다리고 머지
[mergetool "vscode"]
	cmd = code --wait $MERGED

// 머지하고 나서 .orig 파일 생기는 것 false
[mergetool]
	keepBackup = false

// p4merge의 경로 지정
[mergetool "p4merge"]
	path = "/Applications/p4merge.app/Contents/MacOS/p4merge"
    
// 윈도우의 경우
[mergetool "p4merge"]
	path = "C:/Program//Applications/p4merge.app/Contents/MacOS/p4merge"
$ git mergetool

vscode에서 conflict 해결 후 저장

$git status로 파일이 staging area에 있는지 확인 후 이동 (아마 있을 것 바로 진행)

$ git merge --continue

Rebase

01
featureA를 머지하려는데 master에 추가 커밋이 있을 경우

fast-forward merge 하기

$ git checkout feature-a
$ git rebase master
$ git checkout master
$ git merge feature-a

git revert

충돌 주의! (같은 파일을 수정한 경우!)

  1. 순서대로 1,2,3,4 커밋이 있을 때
  2. 현재 4에서 1커밋의 상태로 돌리고 싶다.
  3. 2커밋을 revert(취소)하면 1커밋 상태로 돌아갈 것만 같다.
  4. 하지만 git revert [2해시코드]로 해서는 충돌이 발생한다.
  5. git revert 3, git rever 2 이렇게 역순으로 하는 것을 권고한다 !
  6. 만약 같은 파일이 수정된게 아니라면 정상적으로 된다.