내맘대로 git정리
git init -> 해당폴더에 git이 관리할 수 있는 폴더로 변경.
mkdir 폴더명 -> 폴더만들기 make directory임
cd 폴더명 -> change directory 폴더이동
ls -> 해당폴더 파일목록 출력
ls -a -> 해당폴더 숨겨진파일목록까지 출력 대부분 . 이표시 되어있으면 숨겨진 파일or폴더임
vcs 특성상 저장공간을 논리적으로 분리(이게 이해가 안감. (나중에 알아보자))
3가지로 나눌 수 있다.
(working, stage, repository)
깃의 추적(tracked)의 개념.
깃이 다른 vcs보다 뛰어난 것이 추적이라는 개념을 사용해서 그렇다고 한다.
워킹디렉토리에서 "추적됨"과 "추적되지않음"의 상태로 구분을 지은다.
untracked
실제 워킹디렉토리에서 파일을 추가하거나 수정 삭제를 한다고 해서 바로 깃이 관리를 할 수 있는 것은 아니다.
이런 경우는 깃이 한 번이라도 관리를 하지 않은 상태이기 때문에 untracked("추적되지 않음") 이라고 알 수 있다.
tracked
위에와 반대로 추적이 되는 상태이다.
stage로 새로 만들어진 파일을 추가를 하여서 tracked상태로 만들어주는데,
그 명령어는 git add .(.은 해당 모든것을 올리는 것이고 파일 명만 적어서 하나씩 올릴 수 있다.)
다음으로 stage영역이다 . 사실 이영역이 제일 이해가 안 되었다.
그냥 딱 내가 작업하는 로컬공간(working)과 원격으로 저장되는 공간 깃허브 (repository) 이렇게 나누는게 딱 좋아보이는데
중간에 stage를 끼어있으니까 더 복잡한 느낌? 하지만 더 세밀하고 관리를 잘하긴 위해서 존재하는 공간이라고 한다.
그냥 일단 임시로 저장되는 공간이라고 생각하면 편할 것이다. 중간다리의 역할?
앞서 설명한 워킹에서는 untracked와 tracked파일이 있다고 했다. 스테이지에서는 unstage와 stage가 존재한다.
일단 기본적으로 stage에서 관리를 하기 위해서는 git add 로 관리를 할 수 있게 올린다. 그럼 기본적으로
다 파일들이 tracked상태일 것이다.
일단 관리를 할 수 있는 상태이긴 할 것이다 하지만 여기서 이제 파일의 내용을 수정을 한다고 하면 내용들이 달라져서 워킹에 있는 내용과 관리를 하기 위해 올린 stage영역과 다르게 된다. 이런 경우를 unstage 상태라고 한다.
하지만 변경이력들을 저장하고 기록하기 위해서는 stage상태여야하는데 git add 로 다시 맞추어서 stage영역에 추가할 수 있습니다.
파일의 modified, unmodified가 있다.
tracked가 된 상태에서 stage영역에서는 unmodified(수정되지않음)과 modified(수정됨)으로 관리한다.
그림으로 보면 편하다 일단 수정이 되었다는건 워킹영역과 스테이지 영역에서 서로 다르기 때문에 unstage상태이면서 modified이다.
git ignore
파일관리를 하긴 하는데 민감한 부분이나 공개가 되면 안되는 부분들은 따로 분리를 해서 관리를 해야한다.
.gitignore를 만들고 파일안에 표기법에 맞게 작성을 하면 따로 관리를 해준다.
Commit
여러가자의 의미가 있을 수 있겠지만..? 현재 상태를 저장하다?(기록하다) 라고 생각하면 좋겠다.
커밋을 할 경우에는 영구적으로 깃 저장소에 저장이 됩니다
git commit -m "커밋메세지" 이렇게 커밋을 할 수 있습니다.
HEAD
head란 포인터라는 개념이 있습니다. 현재 위치?
커밋이 될 때마다 한 단계식 이동을 합니다. head는 또한 이동을 할 수 있습니다.
스냅샷 방법을 이용합니다.
커밋마다 저장을 할 경우 모든것을 다 저장하고 관리를 하면 크기가 너무 커지게 됩니다.
하지만 스냅샷 방법을 사용하여서, 변경된 부분만 수정하여 기록합니다.
일단 커밋을 하는 것은 위에 말한 것처럼 깃 저장소에 영구적으로 저장을 한다는 것이다.
커밋을 하기 위해서는 tracked 상태여야하며, stage상태여야합니다.
stage 상태로 해놓고 수정이나 변경이 있으면, unstage,untracked,moidified 상태이기 때문에 커밋이 안되므로
git add 다시 stage영역에다가 알려줘야합니다 ㅎ.
git status -> stage상태를 확인할 수 있다.
git log ->commit 상태들을 확인할 수 있다.
아무튼 새로운 파일을 커밋을 하든 커밋한 파일을 수정을 하든 다시 tracked ,stage, modified 상태로 만들어야 할 수 있다.
위에서 설명한 git commit -m "커밋메세지" 이렇게 커밋을 할 수 있습니다. 을 한번에 git add 안하고(하지만)
git commit -am "커밋 메세지"로 할 간략히 할 수 있습니다 -a는 워킹영역에 있는것을 스테이징영역에 올려줍니다.
위에와 같은 방법은 한 번이라도 깃에 추적이 된 상태여야만 할 수 있습니다. 즉 한 번이라도 커밋이 된 파일이여야합니다.
(이렇게 하는 것이 헷갈리면 그냥 git add 로 편안하게 하면 될 듯..?)
커밋을 할 때는 커밋메세지가 필요한데, 빈 커밋메세지를 작성하여서 할 수 있다.
굳이 사용할 일이 있을까? 하지만 사용 방법은
git commit --allow-empty-message -m "" <-커밋메세지를 작성하지 않는다.
그리고 또 커밋메세지를 작성을 할 때 실수로 커밋메세지를 잘못 적을 수 있으니 바로 직전의 커밋 메세지를 변경할 수 있다. git commit --amend로 할 수 있다.
git diff를 사용하면 워킹영역과 스테이징영역의 차이를 출력하여 알 수 있다.
git 원격저장소
git remote로 나의 원격저장소와 연결을 할 수 있습니다.
(기본으로 별칭이 origin으로 되어있을 경우)
git remote -v -> 현재 연결되어있는지 없는지 어떤거와 연결되어있는지 알 수 있습니다.
git remote add origin 저장소url -> 원격저장소 연결
git remote remove(rm) origin ->원격저장소 연결해제
원격저장소에 저장할 때,
(기본으로 별칭이 origin으로 되어있을 경우)
git push origin main(브랜치)으로 푸쉬할 수 있다.
원격저장소 복제
git clone 원격저장소url -> 원격저장소를 복제합니다.
원격저장소 내려받기
git pull origin main -> 예를 들어 clone으로 원격저장소를 받습니다. 그러면 사실 가장 최근의 커밋이 들어간 거 일텐데 나중에 또 원격저장소의 최신커밋을 받기 위해서는 pull(당겨오기)을 합니다.
(커밋순에 따라 알아서 병합을 해준다.)
pull를 할 경우에는 알아서 자동병합을 해준다. 하지만 여러개발자와 협업으로 할 경우에는 가끔 문제가 발생하는 경우가 있어서fetch를 사용한다.
fetch는 자동으로 병합하지 않는다.
git fetch 원격저장소 Url
자동으로 병합이 되지않는다. 수동으로 병합을 해줘야한다.
-> git log 를 찍어보면 실제로 바로 자동병합이 되지않는다.
-> git merge origin/main
-> 실제로 병합이 잘 된다
충돌방지
git에는 여러명의 개발자가 하나의 레포지토리에서 사용할 수 있다.
하지만 .한 번에 동시에 여러명이 푸시를 할 수 없습니다.
이런경우에는 pull이 필수 입니다. 혹시모를 상황을 대비하여 pull를 하여 최신상태로 맞춰 놓은 상태여야만, 푸시가 가능합니다.
브랜치
또 다른 저장공간을 만든다고 생각하면 될 것 같다.
기본적으로 깃 저장공간을 만들면 main or master 브랜치가 생성된다.
main으로 동작하는 브랜치를 빼고 새로운 기능이나 추가로 버그수정 등등... 따로 버전을 관리를 해야하는 경우우면 새로운 브랜치를 만들어서 관리 및 병합을 하면 관리하기가 쉬워집니다.
git branch ,git branch -vgit ->브랜치 목록
git branch <브랜치명> ->.브랜치 생성
git branch <브랜치명> <커밋해쉬아이디> ->해당 커밋 시점에서 브랜치 생성
git checkout <브랜치명> -> 해당 브랜치로 이동
git checkout <커밋해쉬아이디> -> 해당 커밋으로 이동
브랜치이동도 브랜치명으로만 이동할 수 있는게 아니라 커밋해쉬ID로 이동할 수 있다.
checkout으로 이동을 하다가 다시 돌아오기 위해서는 git branch <브랜치명>
git log --graph --all -> 전체 커밋 log를 그래프 형식으로 볼 수 있다.
git log --graph ->커밋 log를 그래프 형식으로 볼 수 있다.
브랜치를 이동하는 경우에는 head도 같이 이동된다.
aHEAD ->
원격저장소 서버에 올린 커밋보다 로컬에서 작업한 커밋이 더 많을 경우.
bHEAD ->
반대의 경우이다.
Head를 이용한 이동도 있다.
git checkout HEAD~1 -> 현재 커밋으로 부터 한단계 전으로 이햣동
브랜치 삭제
현재 나의 브랜치에서는 삭제가 불가능하다.
git branch -d <브랜치 이름> -->로컬에 생성된 브랜치만
원격저장소의 브랜치 삭제하기
git push origin --delete <브랜치이름>
스태시
앞서 말한 것처럼 브랜치이동 등등 작업 워킹디렉토리가 clean하지 않는 경우에는 이동을 할 수가 없다.
근데 지금 작업이 다 끝나지 않은 경우인데, 브랜치를 이동을 해서 급하게 해야하는 일이 생겼다.
이런 경우에는 어떻게 해야할까? 조금이라도 작업중인 것을 커밋을 해놓고 브랜치를 이동을 해야할까?(뭐.. 이것도 방법일 수는 있겠다.)
이런 경우에는 스태시를 사용합니다.(안전한 보관)
아직 작업 중인 (아직 커밋을 하지않은 변경내용) 이 있을 때 현재작업을 임시보관을 해줍니다.
스태시를 하면 작업 중인 것은 임시보관을 해주고, 작업 전의 상태로 돌아가집니다.(즉 워킹영역이 비어있는 마지막 커밋상태 -> 이런 경우면 바로 브랜치간의 이동가능하겠지..?)
간단하게 이미지를 보면 아무튼 파일을 하나 만들어놓고 작업 중에 현재(subBranch)이다.
- sub에서 간단한 파일을 만들고 커밋을 해준다. 그리고 다시 파일을 열어 내용을 수정해준다.
- 이제 main으로 넘어갈려고 할때 밑에 이미지 처럼 상황이 발생.

아직... 끝나지 못해서 커밋을 할 수 없는상황...
이럴때 git stash를 사용. or 여러번을 사용해야하는 경우에는 save명령어를 추가해준다.
스태시는 스택 구조이며, 여러번 저장을 할 수 있습니다. 구분을 위해 메세지도 추가할 수 있음.
git stash save "<메세지>"
일단 스태시 해보자

이제 워킹영역도 비워지고 main브랜치로 이동을 할 수 있다.

스태시를 목록을 볼 수있다. 그리고 또한 .git/refs/stash에 저장해놓는다.
git stash show -p stash@{0} 으로 이전에 작업한 것과 임시저장한 것의 차이를 알 수 있다.
그럼 이제 임시저장을 잘 해놨으니까 불러와보자.
git stash pop으로 불러올 수 있다.
복원이 잘되면 알아서 자동으로 스태시를 삭제한다.(안되는 경우에는 자동으로 삭제안됨...)

조건이 있는데 스태시를 복원을 할때는 그 브랜치의 워킹디렉토리가 깔끔해야한다.
복원과정 중에 충돌이 일어나서 병합이 안될 수가 있다.
충돌이 예상될 경우에는 스태시용 브랜치를 만들자.
git stash branch stashTest<브랜치이름> --> 나중에 다시 알아보자
스태시는 꼭 굳이 저장한 브랜치나 복원을 동일 브랜치에서 할 필요는 없고 다 가능하다.
git stash apply가 있는데 이 명령어는 pop과 다르게 삭제를 하지않고 스택에서 유지를 합니다.
위에 한 번 나왔는데, 스택에 여러개의 작업내용이 있을 경우에는 stash@{번호}로 할 수있습니다.
stash 삭제는 git stash drop으로 삭제할 수 있습니다.
병합
병합의 종류(?)
- fast-forward
- 3-way
- rebase을 이용한 병합.
fast-forward
fast-forward는 개인이 혼자 개발할때 주로 사용이 된다.
원본의 main브랜치는 놓고 개발 브랜치을 따로 만들어서 관리를 한다.
기본적으로 브랜치를 만들때는 기준이 되는 main의 최종 커밋 포인터입니다.
하나의 서브 브랜치를 파서 계속 커밋을 하다가 개발이 완성이 된 서브 브랜치면,
기준이 되는 main branch에서 이제 merge 병합을 합니다.
git merge <sub브랜치>
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git log
commit b09a54d876943ab910d6ac8aa0520011578c62d1 (HEAD -> main)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git checkout -b subTest
Switched to a new branch 'subTest'
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest)
$ git log
commit b09a54d876943ab910d6ac8aa0520011578c62d1 (HEAD -> subTest, main)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest)
$ touch test3.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest)
$ git add .
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest)
$ git commit -m"text3.txt 작성"
[subTest efac6bb] text3.txt 작성
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test3.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest)
$ git log
commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67 (HEAD -> subTest)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:25:34 2023 +0900
text3.txt 작성
commit b09a54d876943ab910d6ac8aa0520011578c62d1 (main)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest)
$ git checkout main
Switched to branch 'main'
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git merge subTest
Updating b09a54d..efac6bb
Fast-forward
test3.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test3.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git log
commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67 (HEAD -> main, subTest)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:25:34 2023 +0900
text3.txt 작성
commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
임의 main branch에 두개의 더미 test1,2.txt파일을 만들고 최종커밋에서 sub 브랜치를 만들어서 merge를 하면 위에와 같은 로그가 찍힌다.
3-way
또 다시 서브 브랜치를 하나 만든다. 물론 기준이 되는 main의 최종 커밋 포인터입니다.
fast-forward는 main브랜치는 따로 서브 브랜치와 별도로 커밋을 하지않았지만, 따로 main도 커밋이 진행된다.
위에 와 같이 서브브랜치에도 커밋을 진행해준다. 넉넉히 2번 정도로 커밋을 진행을 해준다.
그러고 나서 main으로 브랜치를 이동을 하고 main 에서도 별도로 커밋을 진행을 한다.

이런식으로 진행이 되어가고 있는것이다. 이렇게 보면 공통조상의 브랜치1개, main 브랜치 1개, sub브랜치1개 이렇게 총 3개의 길이 보여서 3-way라고 한다..병합을 할려면 공통조상을 찾아야하는데 깃은 아주 친절히 찾아준다 ^^
병합이 되면 병합커밋으로 하나의 커밋메세지가 fast-forward와 다르게 추가되며 만들어진다.
병합하는 방법은 같다. main branch로 가서 git merge <subBranch>를 하면 된다.
* master, feature, develop, release, hotfix브랜치로 이용을 하는데 develop브랜치는 병합 후에도 계속 유지를 해놓습니다.
병합 후에 필요하지 않는 브랜치는 삭제를 해줍니다
git branch -d <브랜치 명>
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git log
commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67 (HEAD -> main)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:25:34 2023 +0900
text3.txt 작성
commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git checkout -b subTest1
Switched to a new branch 'subTest1'
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest1)
$ touch subtext4.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest1)
$ git add .
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest1)
$ git commit -m"subtext4.txt작성"
[subTest1 bb5b38c] subtext4.txt작성
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 subtext4.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest1)
$ git checkout main
Switched to branch 'main'
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ touch text5.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git add .
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git commit -m"text5.txt작성"
[main 8f20f24] text5.txt작성
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 text5.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git log
commit 8f20f243bc0bd7a169863d43316e0299cf53e615 (HEAD -> main)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:39:04 2023 +0900
text5.txt작성
commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:25:34 2023 +0900
text3.txt 작성
commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git merge subTest1
Merge made by the 'recursive' strategy.
subtext4.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 subtext4.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git log
commit 8e6ecfe82c517dcfe57b5b702300fe80d6109755 (HEAD -> main)
commit 8e6ecfe82c517dcfe57b5b702300fe80d6109755 (HEAD -> main)
Merge: 8f20f24 bb5b38c
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:39:31 2023 +0900
Merge branch 'subTest1'
commit 8f20f243bc0bd7a169863d43316e0299cf53e615
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:39:04 2023 +0900
text5.txt작성
commit bb5b38cf1058031651b6e761a7c51e2c0f63ebb4 (subTest1)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:38:10 2023 +0900
subtext4.txt작성
commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:25:34 2023 +0900
text3.txt 작성
commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git log --graph --all
* commit 8e6ecfe82c517dcfe57b5b702300fe80d6109755 (HEAD -> main)
|\ Merge: 8f20f24 bb5b38c
| | Author: yoonwongoo <yunyun26@naver.com>
| | Date: Mon Mar 20 20:39:31 2023 +0900
| |
| | Merge branch 'subTest1'
| |
| * commit bb5b38cf1058031651b6e761a7c51e2c0f63ebb4 (subTest1)
| | Author: yoonwongoo <yunyun26@naver.com>
| | Date: Mon Mar 20 20:38:10 2023 +0900
| |
| | subtext4.txt작성
| |
* | commit 8f20f243bc0bd7a169863d43316e0299cf53e615
|/ Author: yoonwongoo <yunyun26@naver.com>
| Date: Mon Mar 20 20:39:04 2023 +0900
|
| text5.txt작성
|
* commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
| Author: yoonwongoo <yunyun26@naver.com>
| Date: Mon Mar 20 20:25:34 2023 +0900
|
| text3.txt 작성
|
* commit b09a54d876943ab910d6ac8aa0520011578c62d1
| Author: yoonwongoo <yunyun26@naver.com>
| Date: Mon Mar 20 20:23:02 2023 +0900
|
| text2.txt 작성
|
* commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
위에 처럼 너무나도 순조롭게 잘 되면 좋겠지만.. 분명 그러지는 않을 것이고 문제가 분명히 생길 것이다.
대부분 3-way에서 충돌이 생긴다... 서로 여러개발자가 같은 위치의 소스를 수정을 할 경우에 발생하는 경우..
다른위치의 소스를 수정하면 충돌이 안생긴다.
예를 들면 어떤 경우이면

conflict 경고가 뜨며, git status 명령어로 확인을 해보면, Unmerged paths:"내용" 충돌내용이 뜬다.
git merge --abort 로 병합을 취소.--> 병합을 취소한다.
그럼 해당 파일에 들어가면 <<<<<<<<,>>>>>>>등으로 어디 부분이 충돌이 일어났는지 알려준다.
이부분도 지우면서 수정을 해야한다.
수동으로 수정을 해줘야한다. 그럼 git merge --abort 를 하지말고 (main|MERGING)이 써있어야한다.
수정을 해주고 add -> commit를 해준다. 그럼 성공적으로 잘 될 것이다(MERGING) 없어짐.
git branch --merged로 병합된 브랜치들을 알 수 있다..
다음으로 rebase다 rebase로 여러가지를 할 수 있다. 커밋을 변경하든 합치든...등등....
rebase를 하는 이유는 보기 편하기 위해...? 근데 차이점이 3-way-merge와 차이점이 있다.

이렇게 최종적으로는 병합커밋이 만들어지는데,
rebase

rebase는 두 브랜치를 비교하지 않고 순차적으로 커밋 병합을 시도합니다. 그리고 병합 커밋이 없습니다.
하는 방식은 약간 다른데 merge는 기준이 되는 브랜치에서 sub브랜치를 병합했지만, 반대로 해야한다.
sub브랜치에서 main을 rebase한다. 즉 git rebase <main브랜치> 을 한 후에 head포인터가 다르기 떄문에 맞춰주어야한다. main브랜치로 이동하여, git merge <subBranch> 로 head를 맞춰준다.
약간 fast-forword와 비슷한 형태를 가진다.
즉 리베이스는 병합과 같은 최종상태를 가지기 보단 커밋을 재배치를 한 것일 뿐이다.
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git checkout -b subTest2
Switched to a new branch 'subTest2'
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest2)
$ git log
commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67 (HEAD -> subTest2, main)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:25:34 2023 +0900
text3.txt 작성
commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest2)
$ touch subTest4.txt작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest2)
$ git add .
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest2)
$ git commit -m"subTest4.txt작성"
[subTest2 0102652] subTest4.txt작성
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 subTest4.txt작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest2)
$ git checkout main
Switched to branch 'main'
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git log
commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67 (HEAD -> main)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:25:34 2023 +0900
text3.txt 작성
commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ touch text5.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git add .
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git commit -m"text5.txt작성"
[main bf6bff9] text5.txt작성
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 text5.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ touch text6.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git commit -m"text6.txt작성"
[main e9c3f0c] text6.txt작성
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 text6.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git checkout subTest2
Switched to branch 'subTest2'
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest2)
$ touch subTest7.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest2)
$ git add .
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest2)
$ git commit -m"subTest7.txt작성"
[subTest2 c56999f] subTest7.txt작성
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 subTest7.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest2)
$ git log
commit c56999fe1ed1664918b3a6d3fd2a2680c2759667 (HEAD -> subTest2)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:53:06 2023 +0900
subTest7.txt작성
commit 0102652ba2b9cce508b677c06ca1d86d9adba8b1
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:49:23 2023 +0900
subTest4.txt작성
commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:25:34 2023 +0900
text3.txt 작성
commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest2)
$ git rebase main
Successfully rebased and updated refs/heads/subTest2.
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git log
commit e9c3f0c83c947805157a4f75cb7b8ac08dac4271 (HEAD -> main)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:52:20 2023 +0900
text6.txt작성
commit bf6bff9a8bb9dfaa42f538aa85182701983dc6e0
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:51:59 2023 +0900
text5.txt작성
commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:25:34 2023 +0900
text3.txt 작성
commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git checkout subTest2
Switched to branch 'subTest2'
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest2)
$ git log
commit 6497e4bc4b9ebe5ed23c8ba80fb0dca3e82b844d (HEAD -> subTest2)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:53:06 2023 +0900
subTest7.txt작성
commit 494f208d171c428deaa52f26d8bbf51c536208ef
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:49:23 2023 +0900
subTest4.txt작성
commit e9c3f0c83c947805157a4f75cb7b8ac08dac4271 (main)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:52:20 2023 +0900
text6.txt작성
commit bf6bff9a8bb9dfaa42f538aa85182701983dc6e0
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:51:59 2023 +0900
text5.txt작성
commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:25:34 2023 +0900
text3.txt 작성
commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (subTest2)
$ git checkout main
Switched to branch 'main'
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git log
commit e9c3f0c83c947805157a4f75cb7b8ac08dac4271 (HEAD -> main)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:52:20 2023 +0900
text6.txt작성
commit bf6bff9a8bb9dfaa42f538aa85182701983dc6e0
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:51:59 2023 +0900
text5.txt작성
commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:25:34 2023 +0900
text3.txt 작성
commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git merge subTest2
Updating e9c3f0c..6497e4b
Fast-forward
subTest4.txt작성 | 0
subTest7.txt | 0
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 subTest4.txt작성
create mode 100644 subTest7.txt
yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git log
commit 6497e4bc4b9ebe5ed23c8ba80fb0dca3e82b844d (HEAD -> main, subTest2)
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:53:06 2023 +0900
subTest7.txt작성
commit 494f208d171c428deaa52f26d8bbf51c536208ef
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:49:23 2023 +0900
subTest4.txt작성
commit e9c3f0c83c947805157a4f75cb7b8ac08dac4271
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:52:20 2023 +0900
text6.txt작성
commit bf6bff9a8bb9dfaa42f538aa85182701983dc6e0
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:51:59 2023 +0900
text5.txt작성
commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:25:34 2023 +0900
text3.txt 작성
commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:23:02 2023 +0900
text2.txt 작성
commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <yunyun26@naver.com>
Date: Mon Mar 20 20:21:06 2023 +0900
text1.txt 작성
위에 같이 최종병합 커밋은 생기지 않지만.... 커밋들의 재배치로 인하여 커밋hashId가 변경이 된다.
rebase도 또한 충돌이 일어날 수 있다.
똑같이 리베이스 하다가 충돌이 일어나면 병합과 같이 파일에 충돌되는 부분들을 표시합니다.
(subBranch|REBASE 1/2) 이런표시를 나타내며 문제가 생김.
리베이스는 커밋을 하나씩 따라가면서 위치를 재조정을 하고 수정이 끝났으면,
git rebase --continue 를 해주면서 다음 단계로 이동합니다.
git add <해당파일> stage영역으로 추가를 해주며,
git rebase --continue 다시 계속 진행합니다.
(subBranch)그럼 이렇게 변하면서 리베이스가 완료가 된다.
리베이스 취소는 git rebase --abort 로 할 수 있다.
rebase를 이용한 커밋메세지 작업하기
git rebase -i HEAD~3 head로 부터 커밋을 3개 보여줌. 근데 아래에서 위의 방향으로 보여준다.

여러가지 방법을 밑에 주석으로 보여준다.
reword로 커밋메세지를 변경할 수 있으며, edit으로 작업을 수정할 수 있고 , sqush를 해준다.

커밋메세지를 하나로 바꿀 수 있지만, squash되었다는거를 알리기 위해 하였다.
하지만 이미 push를 한 것을 squash하는 것을 추천하지 않는다 repository랑 맞지가 않기 때문이다....
rebase 사용 시 주의점
리베이스는 커밋 위치와 해시 값을 변경합니다. 저장소를 외부에 공개했다면 공개된 순간부터 커밋은 리베이스를 사용하지 않는 것이 원칙입니다.
리베이스는 외부로 코드를 푸시하거나 공개하기 전에 로컬에서만 실행하는 것이 좋습니다. 외부에 공개된 커밋을 리베이스하면 커밋 위치와 해시 값이 변경되어 너무 혼란스럽습니다.
즉 아직 원격저장소에 안올렸다. -> rebase를 사용해도 된다.
아니다.-> 이미 올려서 pull 해서 사용 중이다. revert를 한다.
복귀
reset revert 등으로 되돌아갈 수있다.(특정시점).
git checkout <브랜치 및 커밋hashID>로 커밋시점으로 단순히 이동하는 것이 아닌, 특정 시점 으로 reset을 하면 그 이후는 아예 없던일 처럼 된다. 주의하여서 사용해야한다.
다음에 정리하자..