git -am [파일명] "메시지"
-a : 한번도 add 한적 없는 파일은 자동으로 add 되지 않는다.
Branch
- 원본 소스코드를 수정하지 않고 별도의 버전을 만드는 경우
- 현재까지 작업한 소스코드를 테스트 해야할 때, 메인 작업과 테스트 작업을 분리할 경우
git branch [branch명] #새로운 branch를 생성
git checkout [branch명] #원하는 branch로 이동
새로운 branch를 생성하면, 현재 branch의 상태를 그대로 복사하게 된다.
전체 branch들을 확인
git branch --branches [--decorate] [--graph] [--oneline]
--decorate : branch의 가장 최신 commit이 어딘지 표시, head 표시
--graph : branch를 시각적으로 보여줌
--oneline : 간결하게
- branch간 차이 확인
git log [-p] branch1..branch2 #branch1 기준으로 branch2의 차이
git diff branch1..branch2
-p
git merge
merge할 branch로 이동해서 실행해야 한다. (checkout)
git merge [branch명]
현재 b1이고, b1으로 b2를 merge하려면 (b2 -> b1)
git merge b2
merge 후에 다른 branch를 삭제하고 싶다면
git branch -d [제거할 branch명]
- fast-forward
master가 가르키는 commit만 바꿔줌. 별도의 commit이 생성되지 않음
- recursive strategy
c3가 분기한 조상 c2에서 새로운 commit이 생성되었음 (c4) -> fast forward 불가능
"3-way merge" 사용
- C4와 C5 merge
- 새로운 commit C6 생성 (merge commit)
- 해당 branch가 C6를 가리키도록 이동
git stash
- 해당 branch에서 아직 작업이 끝나지 않았지만, 이슈를 해결하기 위해 다른 branch로 checkout 해야하는 경우
- 즉, commit 하지 않고 checkout을 하기위한 방법
- head의 branch로 이동해서 새로운 branch를 생성하는 방법
git stash #작업하던 working directory를 저장
git stash apply #가장 최근 저장했던 내용을 복원
git stash list #stash 된 내용을 확인
stash된 파일은 명시적으로 제거하지 않는 이상 계속 남아있다.
(git reset --hard HEAD 해도 남아있음)
여러개의 stash list를 적용하고 싶다면, apply후 drop 해주면 된다.
git stash apply;git stash drop #최근 stash 복원;최근 stash 삭제
#git stash pop 동일
git stash apply #다음 stash 적용
git stash는 tracked file(버전 관리 중인 파일)에 대해서만 저장한다.
git rm -rf [파일명] # 파일 삭제
rm -rf .git #.git 폴더 삭제, 워킹 디렉토리 초기화
Branch 원리
- Head -> refs/heads/master -> 가장 최신 commit의 object ID
- 이를 통해서 가장 최신 commit을 알 수 있다.
- 이전 commit은 parent를 따라 가면서 탐색할 수 있다.
새로운 branch 생성
- refs/heads/[새로운 branch]
- branch = 일반 txt 파일
- checkout 시 HEAD가 해당 branch를 가르킴
Branch 충돌 해결: Merge
- 각 branch에서 다른 파일을 수정한 후, merge하면 자동으로 합쳐준다.
- 동일한 파일을 수정해도 다른 위치를 수정하면 자동으로 합쳐준다.
- 하지만 동일한 파일&같은 부분을 수정하면 충돌이 발생한다.
- 충돌이 발생한 파일을 열어서 파일을 수정해줘야 함.
======= : 구분자
<<<<<< HEAD : 현재 branch 내용
>>>>>>[다른 branch] : 다른 branch 내용
git reset&checkout
git reset --hard [commit 주소]
- reset == head를 바꾸는 작업
- refs/heads/master 가 가르키는 파일이 돌아가고 싶은 commit 파일로 바뀜
- logs/refs/heads/master: master branch에서 일어나는 사건들을 기록하는 폴더
- ORIG_HEAD: 현재 branch의 최신 commit을 저장
reset 취소하기
git reset --hard ORIG_HEAD
git reflog #log 확인 가능
- reset을 취소하려면 ORIG_HEAD로 reset 해주면 된다.
git checkout
git checkout [commit 주소]
- checkout에 commit 주소를 적으면 HEAD가 해당 commit을 바로 가르키게 된다.
- (마지막 사진을 보면 master branch에서는 refs/heads/master를 가르키는 것을 볼수 있음.)
git reset 옵션
working directory = working tree = working copy |
index = staging area = cache |
repository = history = tree |
로컬에서 파일 수정 | add | commit |
git reset --soft | ||
git reset --mixed | ||
git reset --hard |
git reset --[soft|mixed|hard] [commit 주소]
- 옵션에 따라 삭제되는 정도가 다르다.
- mixed(default) : 옵션을 지정하지 않으면 mixed로 동작
git diff # working copy 내용과 index의 내용을 비교하는 명령
git merge & conflict
kdiff3 설치 시 The merge tool kdiff3 is not available as 'kdiff3' 발생 시
kdiff3를 사용해서 conflict 파일을 수정할 수 있다.
3 way merge
Current | Base | Other | 2 way merge | 3 way merge |
A | A | ? | ||
B | B | B | B | B |
1 | C | 2 | ? | ? |
D | D | ? |
- 2 way merge: base를 보지 않고, cur과 other branch를 merge하는 방식
- 3 way merge: base를 참고해서 cur과 other branch를 merge하는 방식 //good
이미지 출처: git book
'CS' 카테고리의 다른 글
[생활코딩] 지옥에서 온 Git - Github (0) | 2021.10.06 |
---|---|
[생활코딩] 지옥에서 온 Git - 원격저장소 (0) | 2021.10.02 |
[생활코딩] 지옥에서 온 Git - 원리 (0) | 2021.10.01 |
[생활코딩] 지옥에서 온 Git - Git 원리 (0) | 2021.09.17 |
[Computer vision] 의료영상 분석 강의 필기 (0) | 2021.08.17 |