git init
gid add
git commit
과정 정리
git init
-> 작업영역 생성 완료! -> 변경감지 발생 -> git add
-> 인덱스 영역(tree 목차)로 이동 -> 영구히 기록하자! -> git commit
-> 헤더 영역으로 이동
관련 그림 자료
git log
를 실행하면 commit 해시값
하고 커밋로그들이 보여진다. 이때 해시값을 이용하여 reset을 실행하면 된다. (이때, 해시값들이 꽤 긴데, 다 복사할 필요는 없고, 다른 commit 해시값들과 구분될 정도로만 값만 복사하면 된다.)-> 명령어 사용예시
이때, 1번째 commit을 하고 두번째 commit을 한 상태라고 가정하자. 그리고 두번째 커밋로그의 내용을 바꾸고 싶은 경우로 가정하자. (두번째 커밋의 해시값 : efla9e0e942715be3e....)
git reset --soft efla
- 이때 efla은 해시값중 일부이다.
git status
- 이 명령어를 실행하면 reset soft가 잘 실행된 것을 알 수 있다. status는 commit을 하기전인 add만 한 상태로 돌아간 것을 알 수 있다. git log
로도 reset soft가 적용된 것을 잘 확인할 수 있다.
git commit -m "커밋 메시지"
-> reset soft를 실행하고, commit을 다시 해줘야 원하는 commit 로그 메시지로 바꿀 수 있다.
git reset --mixed efla
- 이때 efla은 해시값중 일부이다.
git status
- 위 명령어로 확인하면 reft mixed가 잘 실행된 것을 알 수 있다.
- status는 add를 하기 전 상태로 돌아간 것을 알 수 있다.
git reset --hard efla
git status
- 위 명령어로 확인하면 reft mixed가 잘 실행된 것을 알 수 있다.
- status는 2번째 파일이 만들어지기 전으로 돌아갔다는 것을 알 수 있다.
그런데 log에 남아있지 않는 commit (해시값) 으로 돌아가야 할때는 어떻게 해야 할까?
-> reflog를 사용하자.
reflog : 백업에 대한 데이터들로, 한번이라도 커밋한 로그들의 정보가 들어있다.
git reflog
git reset --hard efla6h
git log
를 실행했을때 commit 로그가 한번밖에 없는 경우, reset soft 를 이용해 이전 commit 상태로 돌아가지 못한다. 즉, git reset soft 명령어를 사용하지 못한다. 대신 아래 명령어를 이용해서 commit 로그를 변경한다.git commit --amend -m "바꾸고 싶은 커밋 로그 메시지"
git status
로 status를 확인하면 commit 로그가 변경된 것을 알 수 있다.git commit --amend -m "commit message"
git reset --soft 해시값
git commit -m "commit message"
git rebase -i (HEAD ~3)
git branch
git branch 브랜치이름
git checkout 이동할브랜치이름
git checkout -b 브랜치이름
git checkout main
git merge 머지할브랜치이름(topic)
-> 위 두 명령어를 실행하면 fast-forward merge로 merge할 수 있다.
fast-forward merge는 두개의 branch만 생각해서 main에서 새로운 branch를 merge해주면 되는데 three-way merge에서 fast-forward merge와 같이 하면 main에서 새로 만든 내용이 그냥 날라가게 된다. 그래서 나뉜 브랜치에서 새로 추가된 것 2개와 이 2개의 공통조상인 것 1개를 이용해 three-way merge를 해야 한다.
git checkout main
git merge main이아닌브랜치이름(topic)
-> vi 에디터가 뜨는데 esc
를 치고 :wq
를 치고 종료한다.
-> 위 과정을 실행하면 three-way merge가 실행된다.
위 두개의 실행방법은 같다 ?? 과정만 다를뿐 같은 명령어로 다르게 실행이 될 수 있나 ??
다른 branch에서 같은 파일을 수정하고 commit하면 merge 충돌이 발생할 수 있다. merge 충돌이 발생하면, 어떤 내용으로 최종 commit을 할건지 결정해야 한다.
touch 파일이름
rm 파일이름
rebase:
코드에 대한 로그를 깔끔하게 정리한다.
상황: 남긴 로그가 마음에 들지 않아 다시 수정하고 싶다.
squash
rebase를 하려면 squash의 개념을 알아야 한다. squash는 찌그러트린다는 의미이다. 찌그러트리는 방향은 최근에서 과거로 찌그러트려야 한다. 즉, 최근의 코드들을 예전의 코드로 모으는 것이다. 아래 그림에서 올바른 방향은 아래에서 위로 방향이다.
<관련 그림>
<rebase 명령어 실행 과정>
git rebase -i HEAD~찌그러트리고싶은개수
git rebase -i HEAD~3
와 같이 쓴다.-> 위 명령어를 실행하면 vi에디터가 나온다.
i
를 누르면 입력이 가능해지는데,pick
으로 되어있는 최근 2개의 로그들을 s
로 바꿔준다.
-> 위 내용들을 실행한 결과, 수정한 내용들은 그대로 유지하고 로그들만 삭제하는 것과 같다. 즉, 최근 2개의 수정내용들을 2개전의 로그에 합쳐준다고 할 수 있다.