forDevLife
[Git, GitHub] 입문 본문
1. 커밋한다(commit)
- 게임의 세이브 포인트와 동일하다. 언제든지 저장 시점으로 돌아갈 수 있다.
- 커밋을 하려면 저장을 원하는 파일을 묶어서 커밋 명령을 수행하면 된다.
2. 스테이지에 올린다(add)
- 앞서 커밋하기 전에 저장을 원하는 파일을 묶는 일을 해야한다고 했다.
- 이 작업을 스테이지에 파일을 올린다 라고 한다.
3. gitHub에 업로드(push)
- 커밋을 하면, 현재 작업 내용의 세이브 데이터가 내 컴퓨터에 저장된다.
- 이를 원격 저장소에 올리는 것을 push라고 한다.
소스 트리 사용
- 강의에서 소스 트리를 사용해서, 편하게 사용해보고자 예전에 깔았던걸 써보는 도중.. mac에서 login 관련 bug가 있음
- 로그인이 정상 동작 안하고, CPU 사용량이 엄청 증가한다.
- 아직 해결 안된 것 같다.
변경사항 취소하기
- checkout을 통해 브랜치 또는 커밋으로 돌아갈 수 있다.
- sourceTree의 코드뭉치 버리기를 통해 변경사항을 되돌릴 수 있다.
pull 및 충돌 해결하기
- 현재 브랜치 : HEAD
- origin/master가 로컬보다 더 빠를 경우 pull 먼저 진행
- pull = fetch + merge
- 충돌의 발생 원인 : 자동 병합 실패했을 경우 발생, 겁내지 말자.
해결방법
1. ide에서 수동으로 에디터를 이용해 HEAD, branch 부분을 지워서 해결하는 방법
2. main 브랜치꺼를 사용하는 방법
3. 반대쪽 브랜치꺼를 사용하는 방법
이전 커밋으로 되돌리기 - Reset
- reset(이 커밋까지 현재 브랜치를 초기화) - soft, mixed, hard -> hard가 되돌리기이다.
- 원격에 없는 내용을 reset하면, reset 전 내용들이 모두 지워질 것이다.
- main과 원격의 내용이 다르므로, 강제 push가 필요하다.(git push --force)
- 강제 push 대신에는? (sourceTree에서 push 지원 x)
1. origin/master를 먼저 merge 한다. 충돌을 해결한다.
2. 그리고 push를 한다.
3. 브랜치, revert, rebase를 사용하는 방법도 있다.
이전 커밋으로 되돌리기 - 브랜치 이용(추천하는 방법)
- 쉽지만 트리가 지저분해진다.
- reset과는 달리 내용이 사라지지 않는다.
1. 새로운 브랜치 생성
- 현재 로컬이 원격보다 한 커밋 앞서있는 상태이다.
- 이 상태에서 되돌리기 원하는 위치에 update-branch를 생성한다.
- 추가로 master와 원격을 동기화 하기 위해 Master push를 진행했다.
2. 새로운 브랜치에 커밋 추가
- master push를 했다.
- 커밋을 추가했다.
3. update-branch merge
- 충돌이 발생할 것이다.
- update 내용('저장소'것)을 사용해서 해결을 누르고 merge를 진행한다.
- 충돌 해결 후 커밋을 진행한다.
4. merge 결과
- 원래 origin/master위치였는데, 하나를 되돌아가서 브랜치(update-branch)를 만들고, 작업을 한 후 merge한 상황이다.
- push해도 문제 발생하지 않는다. 강제 push 필요 없다.(push 하면 master로 origin/master, origin/HEAD가 이동한다)
- 즉, 되돌아갈때는 branch를 만들어서 되돌리자.
이전 커밋으로 되돌리기 - Revert를 사용해 커밋 되돌리기
1. revert test용 커밋 추가
- revert test용 커밋 추가한 상황
- 이 의미없는 커밋을 없애고 싶은 상황이다.
2. revert test 커밋을 대상으로 revert(커밋 되돌리기) 실행
- 이전의 의미없는 커밋이 삭제되는게 아니라, 'Revert ~ '라는 커밋이 새로 생성이 된다.
- 없애고 싶은 커밋의 이전 파일 내용으로 돌아간다.
- 하지만 '리버트 테스트용 커밋'은 남아있게 된다. 이곳에는 파일도 남아있다.
- 즉, 되돌렸다는 내용 자체도 커밋으로 남기는 것이다.
- 단점은, 충돌 발생 가능성이 있다.
- learngitbrancing 실습
- C3를 대상으로 git revert C3를 하게되면, C3'커밋이 생기게 된다.
- 이 내용은 C2와 동일하다! C3 커밋은 보존된다.
이전 커밋으로 되돌리기 - revert로 여러 커밋 되돌리기
Q : revert로 여러 커밋을 되돌리려면 어떻게 하나요?
- 현재 test 브랜치를 만들고, commit 3개를 진행한 상황이라고 하자.
- commit 3을 대상으로 revert를 하면, commit2의 내용으로 돌아간다. 기록은 Revert "Commit 3"으로 남게 된다.
- commit 1로 돌아가고 싶으면?
-> 바로 Commit2를 대상으로 revert하는게 아니라, 차례로 Commit 3부터 revert를 진행해줘야 한다.
-> 바로 Commit2를 대상으로 하게되면 충돌이 발생한다.
-> 현재 Commit3의 내용을 Commit1로 변경하겠다는 의미이기 때문이다. - 즉 최신부터 순서대로 revert를 반복 적용하면 된다!
- 터미널
-> git revert HEAD : 최신 커밋을 되돌리자
-> git revert HEAD HEAD~1 : HEAD, HEAD~1을 순서대로 되돌리자
이전 커밋으로 되돌리기 - revert 마지막
- 선택한 커밋 하나의 변경사항을 되돌리고 -> 새로운 커밋을 생성한다.
- cherry-pick과 비슷하면서도 반대로 동작한다.
Q : 특정 커밋 하나만 취소하고 싶은 경우에는 어떻게 하나요?
- 그냥 선택해서 revert를 하면 된다.
- 단, 충돌의 가능성이 있다.
< 충돌 안나는 경우 >
1) 임시 브랜치 생성(revert-test) & commit 3번 진행(파일 3개 생성 및 각각 커밋)
2) 2번째 커밋만 되돌리기
- 커밋마다 파일이 모두 다르다.
- 따라서 2번째 커밋을 revert해도, 2번째 파일만 사라지고 1, 3은 남아있게 된다. 충돌 발생하지 않는다.
Commit --amend와 스태시
브랜치 체크아웃 시 주의사항
- 브랜치를 만들고 체크아웃을 하려면 현재 작업 디렉토리가 깨끗해야 한다.
즉, 현재 브랜치변경사항이 있을때는 체크아웃이 불가능하다. 즉 로컬의 변경사항을 커밋해야 한다. - 그런데 갑작스럽게 체크아웃이 필요하다면?
commit --amend 사용
1. 브랜치 1에서 일단 (임시) 커밋을 한다.
2. 브랜치 2로 체크아웃 하고 볼 일을 본다.
3. 다시 브랜치 1로 되돌아 온다.
4. 1의 작업을 이어서 마무리 짓는다.
5. 커밋 덮어쓰기 (commit --amend)를 한다.
6. (옵션) 필요하다면 (push --force)를 한다.
1. 임시 커밋 후 돌아와서 다시 커밋 한 상태
- test 브랜치에서 다른 브랜치로 갑작스럽게 체크아웃이 필요해서, 의미 없는 커밋을 만들고 작업 후 다시 돌아왔다.
- 그리고 이번에는 의미 있는 커밋을 남겼다.
- 이걸 없애려면 어떻게 할까?
2. commit --amend (마지막 커밋 정정 옵션)
- 결과로 의미 없는 커밋을 덮어쓰게 되었다.
3. 만약 의미 없는 커밋을 push 했을 경우?
- 이 상태에서 커밋 정정 옵션을 선택하게 되면?
- 로컬과 원격의 커밋이 분리가 된다. 서로 다른 커밋이 2개가 된다.
- 이럴때는 어쩔 수 없이 git push --force를 수행해서 원격으로 의미있는 커밋을 강제로 덮어씌운다.
- 실수로 했을 경우에만 사용!
Stash를 이용해서 같은 작업 하기
1. Stash를 만든다.
2. 이 때 새로운 파일(untracked file)이 있었다면 일단 인덱스에 추가한다.
3. 체크아웃을 한다.
4. 되돌아 온다.
5. Stash를 pop 한다.
6. 보통 커밋을 새로 생성한다.
1. Stash(임시 저장공간) 사용
- 변경점을 stash로 저장한다.
- 이 내용이 stash로 들어가게 된다.
- 작업이 끝난 후, 다시 test2 브랜치로 돌아와서 스태시 적용을 누르게 되면, 다시 내용이 반영된다.
- 즉, 불필요한 커밋을 생성하지 않는 방법이다!
2. 주의 사항 - 신규파일 있을 시
- untracked file, 즉 추적되지 않는 파일로 신규 생성된 파일이라는 의미이다. 이는 소스트리상에서 '?'로 표시된다.
- 이런 파일들은 stash가 되지 않는다. 이런 파일들은 스테이지에 올리기만 하면 된다.(커밋 x)
- 불필요한 stash는 삭제 가능하다.
rebase 사용해서 트리 정리하기
병합(merge) 처럼 두 브랜치를 합칠 때 사용한다. 소스트리에서는 "재배치"라는 명령이다.
현재 브랜치가 대상 브랜치 위로 올라간다.
- 장점 : 커밋 히스토리가 깔끔하게 정리된다.
- 단점 : 이미 원격에 올라간 경우, 협업을 하고 있는 경우 특히 위험하다.
< 단순 merge 사용 >
1. rebase 브랜치 생성 및 커밋
2. 원래 master 위치에 신규 브랜치 생성(etc), 새로운 커밋 추가
- rebase, etc 각각 동일한 파일을 수정한 후 commit이 수행된 상태이다.
3. master에서 rebase를 merge(fast forwarding)
4. master에서 etc를 merge(충돌 발생)
- 충돌 해결 후 merge 수행 (3-way merge 진행)
< rebase 사용 >
1. etc, rebase 생성(이전과 동일)
- test를 위한 브랜치를 만드는게 좋다. 이번에는 merge-test라는 브랜치를 만들어서 진행한다.
2. etc merge(fast forward)
3. rebase 수행
- 이번에는 merge-test(master라고 생각하자)가 아닌 rebase를 먼저 체크아웃한다.
- 병합을 원하는 브랜치를 대상으로 "재배치"를 누른다.
누르면 현재 변경사항을 "merge-test"로 재배치하시겠습니까? 라는 메시지가 나온다. - 마찬가지로 충돌은 발생한다.
4. 충돌 해결 후
- 충돌 해결 후, 다시 재배치 요청을 한다.
- 즉, 하던 rebase를 계속하라는 의미이다.(git rebase --continue)
5. 결과
- 갈라져있던 rebase가 하나로 통합되었다.
- 다시 merge-test로 들어가서, 병합을 눌러줘야 한다.
- 이제는 같은 줄이므로 merge-test -> rebase로 병합이 가능하다.
- rebase를 통해 Tree가 이쁘게 합쳐진다.
- but, 원격으로 올라간 내용은 rebase 하지 말자.
기타 주의사항
- 안쓰는 코드에 대한 주석을 남기지 말자.
- 커밋은 자주 하자. 원자적으로 쪼갤 수 없는 단위(주로 함수 등)의 의미 있는 개발은 커밋을 하자.
- 커멧 메시지를 잘쓰자. 첫 줄에 요약 -> 한 줄을 띄우고 자세하게 내용을 적자.
미션
1. A, B 원격 저장소 만들기
2. 각각 다르게 커밋하기, B는 1회만 커밋 / A는 다수 커밋
3. A의 내용을 B의 1회 커밋 위에 올려서, B 저장소로 push 하기
'Etc' 카테고리의 다른 글
휴직 1주년 & 코드스쿼드 진행 중 회고 (0) | 2022.04.14 |
---|---|
2021년 회고 - 앞으로의 계획 (3) | 2022.01.01 |
[Git] 다른 repository로 프로젝트(브랜치) 옮기기 (0) | 2021.11.28 |
resource 내의 파일 업로드 방법(file -> MultipartFile) (0) | 2021.09.29 |
[git] github push 되돌리기 (0) | 2021.09.03 |