[Git] Git 명령어 와 git flow

Git의 목적 : 버전관리, 백업, 협업

Git을 통해 버전을 관리하고 그 버전을 원격 저장소인 GitHub에 백업하고 이를가지고 팀원들과 같이 협업한다.



git flow

$ git init 명령어로 해당 폴더를 git으로 관리할 수 있도록 초기화 할 수 있다.

기능별로 또는 사람별로 또는 특정한 기준에 따라 각각의 branch를 생성한다.

각각의 branch별로 개발을 진행하다가 리뷰하는 시기를 정해서 master 또는 main branch로 병합을한다. 무조건 master 또는 main  branch에서 할 필요는 없으며 특정 branch를 병합 branch로 정해서 병합한다. 

상황에 따라 다르지만 branch 병합시 많은 conflict가 발생하는데 이러한 오류들을 다 처리한뒤 문제없는 코드들을 master branch로 옮긴다.

master branch는 최종적으로 배포될때만 건들이도록 한다.

병합하고 배포를 끝내고나면 master branch에서 병합된 작업 결과물을 각각의 branch에 동일할 수 있도록 동기화해야하므로 각 branch에서 $ git pull 하여 동일한 코드로 다시 작업을 이어갈 수 있도록 한다.

이렇게 작업하던중 급한 버그가 발생하면 급한버그를 처리할 브랜치(hot fix)를 하나 생성한다.

급한 버그를 처리해서 바로 마스터 브랜치에 적용시킨다. 이때도 수정된 작업물을 모든 각각의 브랜치에 동일하게 적용시키고 작업을 이어나간다. 동일한 작업환경에서 작업을해야 오류발생 확률을 줄일 수 있다.

hot fix의 경우 한번 사용되고 버려지므로 예외적으로 적용시키지 않아도 된다.

즉 마스터 브랜치를 모든 브랜치가 예의주시하고 있어야 한다.

위에 설명을 키노트로 직접 그려봤다.







 👨‍💻 git 명령어 

git 명령어 help

작성한 명령어에 대한 도움말을 확인할 수 있다. 어떻게 사용해야하는지 등등




git init

해당 폴더를 git이 관리할 수 있는 환경으로 초기화




git status

git이 관리할 수 있는 파일 목록 확인(해당 목록에 있다고 모두 관리되는것은 아님)




git add <file>

git status로 출력된 파일명에서 관리하고자하는 파일을 선택해서 git add <file>을 작성한다. 
<file>에는 파일 명을 작성(확장자 포함)

모든 파일을 한번에 관리대상으로 등록하고싶으면 file명 대신에 . (점) 하나를 작성해주면 모든 파일이 관리대상으로 등록된다.

다수의 파일을 생성하다보면 일일이 file명을 작성하여 관리파일로 지정하지않고 . (점)을 사용해서 모든 파일을 한번에 관리파일로 등록하게된다.

하지만 이런경우에도 관리파일로 추가되지않으며 그대로 두고싶은 파일이 있는데 . (점)으로인해 계속해서 관리파일로 지정되게 된다.

이런경우 .gitignore라는 파일을 생성하여 관리파일로 지정되지 않기를 원하는 파일들의 명칭을 작성해준다.
그러면 해당 파일에 작성되어있는 파일은 더이상 관리파일로 지정되지 않는다. .gitignore파일은 따로 확장자가 없다.

여기서 주의할 점은 .gitignore파일은 관리파일로 지정해서 관리해주어야한다.



















git rm --cached <file name>

관리 대상이 되었던 파일을 관리 대상에서 제외 시킨다. 즉 staging area로 추가되었던 파일을 제거한다. 실수로 add 한 파일을 제거할때 사용한다.

--cached를 작성하지 않으면 파일이 삭제 될 수 있으니 조심하기!!




git commit -m "커밋내용"

해당 프로젝트를 저장하는 방법이며  "커밋내용" 을 적어주어야 해당 커밋의 내용이 무엇인지 알 수 있다.
만약에 커밋내용을 적지않는다면 수많은 커밋 중 내가 무엇을 저장한것인지 알 수 없기 때문에 커밋내용을 적어주도록 한다. 

만약 적지않다하더라도 터미널(Terminal)창에 vim이 생성되어 커밋내용을 작성하라고 한다.


만약 commit이 했지만 실수로 또는 마음이 바뀌어서 특정 파일을 관리대상에서 제외하고싶다면 해당 파일을 삭제하고 다시 생성하고 .gitignore에 해당 파일명을 작성해주어야한다. 삭제하지않고 .gitignore에 적어도 한번 commit되면 계속해서 파일 관리대상이 되기 때문이다.




git log

지금까지 commit한 내역을 확인할 수 있다. commit 주소와 상세내역까지 출력한다.
목록을 출력할때 vim이 뜨게 되는데 종료하려면  :q를 입력한다 
(:wq 를 입력하는것을 많이 봤을 것이다.)
w 는 write
q 는 quite




git shortlog

git log는 상세출력이지만 git shorlog는 commit된 목록을 간단하게 출력한다.




git config --global user.name "내 이름"
git config --global user.email "내 이메일"

comiit 목록을 출력해보면 작성자와 주소 그리고 날짜가 출력되는데
이러한 출력내용들중 작성자와 주소를 위의 명령어로 수정이 가능하다.




git checkout -- <file>

내용의 변경사항을 되돌린다.

checkout은 두가지로 사용된다.
1. 복원
2. branch 선택
2번에 대해서는 밑에서 다뤘다. 



git commit -am "커밋내용"

파일을 수정한 후 수정된 파일을 git add <file> 처럼 일일이 관리파일로 등록해주던지 또는 git add . 를 사용해서 수정된 파일 모두를 관리파일로 등록해주고 commit을 해주어야하는데 이러한 두가지 작업을 한줄로 해결할 수 있는 명령어이다. 해당 명령어를 사용하면 git add와 git commit 두가지 동작을 해준다.


하지만 모든 파일이아닌 특정파일만 add 와 commit을 하고싶다면 -a를 빼고 git commit <file> -m "커밋내용"을 작성하면 된다.

-a 는 all이라는 뜻이라 특정한 파일만 하려면 git commit <file1> <file2> -m "커밋내용" 을 입력한다.




git diff

어느 부분이 어떻게 수정되었는지 확인하고 싶을 때 사용하는 명령어이다.




git remote add origin "깃허브 repository 주소"

깃허브의 repository와 나의 git과 연결한다.




git remote get-url origin

내가 사용중인 원격 주소 확인




git push <remote> <branch>

내가 작업한 파일을 원격 주소에 업로드한다.
위에 git remote add origin "깃허브 repository 주소"에서 명칭을 origin으로 작성했다.
git push <깃허브 주소명> <내 이름>
git push origin master
git push 서버이름 내이름




git pull <remote> <branch>

서버에 올라가있는 작업된 파일들을 내려 받는다.
git pull origin master
git pull 서버이름 내이름

다른사람과의 협업시에 필수로해야지 오류가 발생하지 않는다. 만약에 got pull을 하지않은 상태에서 작업을하다보면 서버에서는 commit이 5개가 발생되었는데 그부분에대해서 모르고 수정할때 오류가 발생할 수 있다.

git pull은 fetch와 merge가 합쳐진것이다.




git config --global core.quotepath false

git status 명령어 입력시 한글 파일의 글자가 깨지는 경우 위의 명령어를 입력하면 한글이 제대로 출력된다.




git reset

실수로 커밋한 결과를 되돌리게 해준다. 
수정된 내용은 그대로 존재한다.
커밋했던 기록은 지워진다.


git reset에도 여러가지 방법이 있다.

git reset HEAD~1   
위와 같은 방법은 HEAD는 가장 최근에 커밋한것을 이야기하며 ~물결표 뒤의 숫자는 몇번째 뒤로 되돌릴지를 의미한다. 즉 바로 전에 실수만 되돌리고싶다면 숫자1을 사용하고 2번째 전으로 되돌리고 싶다면 숫자2를 사용한다. 

git reset <commit id( 7자리 )>
HEAD를 사용하면 일일이 몇번째까지 reset 할것인지 카운트 해야하지만 commit id를 작성하면 해당 커밋까지 되돌려준다.



추가적으로 reset을 조금 더 세부적으로 하는 방법이 있다.




















위 그림의 초록이는 track 되고있는 파일, 빨강이는 untrack 되고있는 파일이다.


git reset을 기본적으로 사용하면 untrack상태로 되돌아가며 수정한 내용은 그대로 존재한다.


git reset HEAD~1 --soft
git add 까지 완료된 상태로 되돌아간다.


git reset HEAD~1 --hard
수정된 데이터까지 모두 원상복구(삭제)한다.

git reset --hard
HEAD를 빼고 사용하는 경우도 있는데 초록이나 빨강이로 되어있는 파일을 기존의 상태로 돌려 놓기 위해서 사용한다.




git revert

실수한 커밋을 되돌리고 이전 내용을 다시 커밋하게 해준다. 

협업할때 원격 저장소까지 실수로 커밋을했을때 reset을 사용하면 원격 저장소와 로컬저장소와의 차이가 발생하고 특히나 협업중인 팀원들이 내가 실수한 커밋을 그대로 가져다가 사용하고 있을 수 있기 때문에 reset보다는 revert가 문제발생 위험도가 조금 더 낮다.




$ git branch <새롭게 추가할 branch name>

신기능을 추가하거나 하나의 프로젝트에서 각각의 다른 기능을 생성할때 하나의 branch를 여러갈래로 나누었다가 나중에 합칠 수 있다.



$ git branch -r

원격 브랜치의 모든 branch의 내역을 확인할 수 있다.



$ git branch -a

로컬 branch와 원격 branch의 모든 branch 내역을 확인 할 수 있다.



$ git checkout <branch name>

생성된 여러개의 branch들 중 원하는 branch 선택



매일 출근하면 또는 매일 프로젝트 시작할때 아래 두개 필수로 실행하여 branch확인과 변경된 내용 받기

git branch
git pull origin master 



git merge <branch name>

master에서 다른 branch를 받아와 master에 연결한다.

GUI프로그램에서 각 branch를 여러 줄로 표현한다.




$ git rebase <branch name>

master에서 다른 branch를 당겨와 master에 연결한다.

rebase 도중에 conflict 오류가나서 오류를 해결하면 다시 커밋하기 보다는 git rebase --continue 입력한다.

GUI프로그램에서 각 branch를 한줄로 표현한다.




$ git cherry-pick <commit id( 7자리 )>

다른 branch의 모든 내용 중 필요한 내용만 뽑아오기




$ git tag <tag name>

기존에 commit id 7자리를 사용하지 않고 tag name을 사용하여 해당커밋에 접근할 수 있다.
ex) git tag v1.0.0

많은 커밋들 중 특히 중요한 커밋들, 배포, 버전을 변경 했을때와같이 중요한 기점이 되는 부분에 tag를 작성한다. 




$ git stash 


현재 branch에서 코드를 수정하다가 커밋하지않고 다른 branch로 이동하고자 할때 사용하는 명령어이다. 즉 임시 저장소 역할을 한다. 

일반적으로 다른 branch로 이동하면 현재 branch에서 수정했던 내용들이 모두 날아갈 수 있는데 이러한 내용들을 임시저장소에 저장해준다.

다시 이전 branch로 돌아와서 임시 저장된 값을 불러오고자 할때 git stash apply를 사용한다.

또는 

master branch에서 작업해야될것을 다른 branch에서 작업했다면 해당작업을 stash에 저장하고 master branch로 와서 해당작업을 적용시킬 수 있다.




$ git fetch

git pull은 원격 저장소로부터 필요한 파일을 다운+병합
지역 브랜치와 원격 저장소 origin/master가 같은 위치를 가리킨다.

반면에 fetch는 원격 저장소로부터 필요한 파일을 다운한다(병합은 따로 해야한다)

지역 브랜치는 원래 가지고 있던 지역 저장소의 최근 커밋 위치를 가리키고 원격 저장소 origin/master는 가져온 최신 커밋을 가리킨다.

원래 내용과 바뀐 내용과의 비교를 할 수 있다. (git diff HEAD origin/master)
commit이 얼마나 되었는지 알 수 있다. (git log --decorate --all --online)
이러한 세부 내용을 확인한 후 git merge origin/master를 하면 git pull 상태와 같아진다 (병합까지 완료)

git pull은 fetch와 merge가 합쳐진것이다.



$ git checkout -b <새이름> origin/브랜치 이름


원격 저장소에있는 특정 브랜치의 내용을 새로운 브랜치에 그대로 복제 하고 싶은 경우 사용한다.




$ git fetch --prune


원격 저장소의 branch 목록을 로컬 저장소 branch 내역에 동기화 할 수 있다.

















댓글

댓글 쓰기