1. git이란?  ( Version Control System )

어떻게 여러사람이 협업할것인가?
이력관리를 어떻게 할것인가?

분산 버전 제어 시스템
개발자가 파일 변경 사항을 추적하고 다른 개발자와 프로젝트에서 공동 작업가능.
파일의 여러 버전을 저장하는 대신 Git은 특정 시점에 전체 프로젝트의 스냅샷을 생성.
손쉽게 이전 버전의 프로젝트로 되돌리거나 기존 프로젝트에 영향을 주지 않고,분기하여 새 버전을 생성가능.

2. 지역저장소와 원격저장소

 

수행내용 명령어
깃 생성 c:\test> git intit


( c:\test 경로에 숨김폴더로 .git폴더가 생성됨 )
깃 메일 등록 c:\test> git config --global user.email이메일주소
이름 등록 c:\test> git config --global user.name 이름or아이디

 

기타  
설정보기 c:\test> git config --global --list
도움말 c:\test> git --help

3. Staging Area란?

add시, 임시저장소 staging Area로 이동
commit시 하나의이력으로 남음


4. Staging Area관련 명령어

명령어 내용
Staging Area에 추가
> git add 파일이름
> git add 파일이름1 파일이름2
> git add 폴더이름  ( 지정된 폴더 내의 모든 파일 추가 )
> git add * ( 현재 폴더에 있는 모든 파일 또는 폴더 추가. , 빈폴더 제외)
> git add -u  ( 커밋한 적이 있는 모든 파일 추가. ,해당 파일이 커밋 이력에 있어야함)
Staging Area에서 삭제
> git rm --cached 파일이름 > git reset 파일 이름
> git reset ( 현재 폴더의 모든 폴더와 파일을 Staging Area에서 삭제 )
Working Directory
Staging Area 상태확인
> git status
 주의
파일을 삭제할 때, working directory에서 직접 삭제하지말고,
 git을 통해 삭제해야 이력이 관리된다


5. commit 관련 명령어

명령어 내용
Commit 생성하기
> git commit -m "initial commit" ( ""안에 커밋에 대한 설명을 적는다. )
> git show HEAD (최근 커밋에 대한 상세 정보를 보여준다. 소문자 head도 가능 )
> git log
Commit 수정하기
(새로운커밋이만들어짐)
> git commit --amend ( 최근 커밋의 내역을 볼 수 있다. 커밋 메시지 수정가능 )
> git commit --amend -sm "변경된 메시지" ( 커밋 메시지만 수정하고 싶을 때 )
취소 Commit  생성하기 > git revert HEAD ( 최근 커밋을 취소하는 새로운 커밋을 생성 )

6. commit 수정하기   (reset --soft)

ex)  원래 3개를 커밋하려했지만, 실수로 2개만 커밋 했다면?
명령어 reset --soft , ( 커밋되었던게 Staging Area로 되돌아감 )      그리고 다시 add → commit

만약 reset --soft 후, StagingArea에서 빼려면,  reset 파일이름        그리고 다시 add → commit

ex)  2개의 커밋을 1개로 합치고자한다면?
reset --soft를 2번 하면 됨.                                                                 그리고 다시 commit




 

 

 


7. HEAD와 reset         ( 커밋은 이전커밋을 가리키고 있음 )

Head란?    현재보고있는 커밋을 가리키는 포인터



ex)  만약 전단계로 가고 싶다면?
reset --hard
Working Directory까지 영향을주어 HEAD가 가리키는 포인터로 보게됨


ex)  만약 다시 전전단계로 가고 싶다면?
reset --hard를 한번더 입력하여 
커밋으로 만들어놓은 이력을 왔다갔다 가능


ex)  만약 새로운 파일ddd.txt fmf 만들고 커밋 후,  ccc.txt or bbb.txt로 돌아가고싶다면??
     reset- hard를 하면 되지만, 이때 커밋ID를 정확히 알아야한다.

 


Tracked파일 Untracked 파일

Tracked파일  : git관리 O 

UnTracked파일  : git관리 X




2개이상의 커밋을  하나의 커밋으로 합치기


8. git log와 커밋 ID

log관련명령어

내용 명령어
git log 자세한 로그. 커밋 아이디가 길게 나옴
git log --oneline 간략한 로그. 커밋 아이디가 짧게 나옴 (6자리)
git shortlog 아주 간략한 로그. 커밋 아이디가 안나옴
git show 커밋ID 특정 커밋션의 상세정보 (브랜치 지정가능)
gitk gui화면으로 커밋정보를 보여줌
git reflog HEAD가 가리켰던 (ref)커밋의 이력을 보여줌
git reflog 브랜치명 브랜치별로 reflog를 보여줌
git log -g reflog를 상세히 보여줌

9. git이 파일을 관리하는 방식

파일이름 대신 object id로 파일을 관리
커밋의 실제 파일 대신 object id의 목록만 저장 (파일은 별도로 저장)


10. branch

가리키고 있는 Head를 옮길 때. __ 명령어 : git checkout 브랜치명
새로운 브랜치 만들기 __ 명령어 : git branch 브랜치명


11. fast-forward merge

main 브랜치를 dev브랜치와 merge   ( 새로운 커밋이 만들어지지 않음!! )
명령어 : git merge 브랜치명 --ff
             ( git merge dev -ff )


12. no fast-forward merge

main 브랜치로 이동                              ( 무조건 새로운 커밋이 만들어짐 !! )
명령어 : git merge dev --no-ff
            ( git merge 브랜치명 )


13. merge conflict

깃 초기화 : git init      ( .git 숨김폴더를 윈도우에서 지우고 )
merge 중 충돌 발생

충돌발생!!

충돌부분 수정 후, add

아직 merge중이라고함 .

 merge를 취소하려면 ? git merge --abort

          merge를 재진행하려면 ? git merge --continue

 

 

git merge --continue 입력하여 진행

: wq

현재 충돌을 해결한 main브랜치가 최신이므로, dev 브랜치에서 는 작업불가

즉, dev로 checkout 하여 dev브랜츠를 main브랜치와 merge 해야한다.

main, dev 브랜치 모두 최신 커밋을 가리키고 있음 


14. reset    vs    checkout              ( detached HEAD )


15.  git의 브랜칭 전략

 


참고 :

남궁성, 스프링의 정석

 

+ Recent posts