나처럼 git 정리

  • by

git init -> 그 폴더에 git가 관리할 수 있는 폴더로 변경.

mkdir 폴더 이름 -> 폴더 만들기 make directory

cd 폴더 이름 -> change directory 폴더 이동

ls -> 해당 폴더 파일 목록 출력

ls -a -> 해당 폴더 숨겨진 파일 목록까지 출력 대부분. 이것이 표시되면 숨겨진 파일 또는 폴더입니다.

vcs 특성상, 기억 공간을 논리적으로 분리(이것이 이해가 안감. (나중에 조사하자))

3개로 분할될 수 있다.

(working, stage, repository)

깃털 추적 개념.

깃털이 다른 vcs보다 뛰어난 것이 추적이라는 개념을 사용하고 있다고 한다.

작업 디렉토리에서 “추적됨”과 “추적되지 않음” 상태를 구분합니다.

untracked

실제 워킹 디렉토리에서 파일을 추가하거나 수정 삭제를 해도 곧바로 날개가 관리를 할 수 있는 것은 아니다.

이러한 경우는 날개가 한 번이라도 관리를 하지 않은 상태이므로 untracked(“추적되어 있지 않다”)라고 말할 수 있다.

tracked

위와 반대로 추적이 되는 상태다.

stage에서 새로 만든 파일을 추가하여 추적 상태로 만듭니다.

그 명령은 git add.

다음은 stage 영역이다.

사실 이리가 가장 이해할 수 없었다.

단지 내가 작업하고 있는 로컬 공간(working)과 원격으로 보존되는 공간의 깃발 허브(repository)

중간에 무대를 끼고 있기 때문에 더 복잡한 느낌? 그러나 더 세밀하게 관리를 잘하기 위해 존재하는 공간이라고 한다.

단지 일시적으로 보존되는 공간이라고 생각하면 편할 것이다. 중족의 역할?

앞서 설명한 워킹에서는 untracked와 tracked 파일이 있다고 한다.

무대에서는 unstage와 stage가 존재한다.

일단 기본적으로 stage 로 관리를 하기 위해서는 git add 로 관리를 할 수 있도록 올린다.

그럼 기본적으로

모든 파일이 추적 상태가 될 것입니다.

일단 관리가 가능한 상태가 되지만, 여기서 파일의 내용을 수정하면 내용이 바뀌고, 워킹에 있는 내용과 관리를 하기 위해 올린 스테이지 영역과 다르게 된다.

이런 경우 unstage 상태라고 한다.

그러나 변경 내역을 저장하고 기록하려면 스테이지 상태여야 하지만 git add로 돌아가서 스테이지 영역에 추가할 수 있습니다.

파일의 modified, unmodified 있다.

tracked 가 된 상태에서 stage 영역에서는 unmodified (수정되지 않음) 와 modified (수정된) 로 관리한다.

그림에서 보면 편하다 일단 수정이 되었다는 것은 워킹 에리어와 스테이지 에리어에서 서로 다르기 때문에 unstage 상태이면서 modified이다.

git ignore

파일 관리를 하기에 민감한 부분이나 공개가 되지 않는 부분은 따로 분리해 관리를 해야 한다.

.gitignore를 작성해, 파일안에 표기법에 맞추어 작성을 하면 따로 관리를 해 준다.

커밋

여러가지 의미가 있을지도 모릅니다만…? 현재 상태를 저장? (기록한다)라고 생각해 주었으면 한다.

커밋하는 경우 영구적으로 페이트 스토어에 저장됩니다.

git commit -m “커밋 메시지” 이렇게 커밋 할 수 있습니다.

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 -> 예를 들어 복제본에서 원격 저장소를 받습니다.

그러면 실제로 최신 커밋이 들어갔는데, 나중에 또 리모트 스토어의 최신 커밋을 받기 위해서는 풀을 합니다.

(커밋 순서에 따라 조사하여 병합을 해준다.

)

풀을 하는 경우에는 조사해 자동 병합을 해준다.

그러나 여러 개발자와 공동 작업하는 경우 때로는 문제가 발생할 수 있으며 fetch를 사용합니다.

fetch는 자동으로 병합하지 않습니다.

git fetch 원격 스토리지 Url

자동으로 병합되지 않습니다.

수동으로 병합해야 합니다.

-> git log 를 찍어 보면 실제로는 자동 병합이 되지 않는다.

-> git merge origin/main

-> 실제로 병합이 잘 작동합니다.

충돌 방지

git에는 여러 개발자가 단일 리포지토리에서 사용할 수 있습니다.

그러나 한 번에 여러 명이 동시에 밀어 넣을 수는 없습니다.

이 경우 풀이 필수입니다.

만약 상황을 갖추고 풀을 하고 최신 상태에 맞춘 상태가 아니면 푸시가 가능합니다.

분기

다른 보존 공간을 만든다고 생각하면 좋다고 생각한다.

기본적으로 페이트 스토리지 공간을 작성하면 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 -> 전체 커밋 로그를 그래프 형식으로 볼 수 있다.

git log –graph -> 커밋 로그를 그래프 형식으로 볼 수 있다.

분기를 이동하면 head도 함께 이동합니다.

aHEAD ->

원격 스토리지 서버에 업로드한 커밋보다 로컬로 작업한 커밋이 더 많은 경우.

bHEAD ->

반대의 경우다.

헤드를 사용한 이동도 있다.

git checkout HEAD~1 -> 현재 커밋에서 한 단계 전에 이탈

브랜치 삭제

현재 내 지점에서는 삭제할 수 없습니다.

git branch -d <ブランチ名> –> 로컬로 생성된 브랜치만

원격 저장소의 브랜치 삭제

git push origin –delete <ブランチ名>


스타시

전술한 바와 같이, 브랜치 이동 등 작업 워킹 디렉토리가 클린이 아닌 경우에는 이동을 할 수 없다.

그런데 지금 작업이 끝나지 않은 경우인데, 브런치를 이동해 서둘러야 할 일이 생겼다.

이런 경우에는 어떻게 해야 합니까? 조금이라도 작업 중인 것을 커밋해 두고 브랜치를 이동해야 할까?

이 경우 Stash를 사용하십시오. (안전한 보관)

아직 작업 중(아직 커밋을 하지 않은 변경 내용)이 있을 때 현재 작업을 임시 저장합니다.

스태시를 하면 작업중의 것은 일시 보관을 해 주고, 작업전의 상태로 돌아옵니다.

쉽게 이미지를 보면 어쨌든 파일을 만들고 작업 중입니다.

(subBranch)이다.

  1. sub로 간단한 파일을 만들고 커밋합니다.

    그리고 다시 파일을 열어 내용을 수정해 준다.

  2. 지금 main으로 진행하려고 하면 아래에 이미지와 같은 상황이 발생.


아직… 끝나지 않으니까 커밋할 수 없는 상황…

이때 git stash사용. or 여러 번 사용해야 하는 경우 save 명령을 추가하십시오.

Stash는 스택 구조이며 여러 번 저장할 수 있습니다.

구별을 위해 메시지를 추가할 수도 있습니다.

git stash save “<メッセージ>“

한 번 멈추자.


이것으로 워킹 에리어도 비워져 메인 브랜치로 이동할 수 있다.


Stash 목록을 볼 수 있습니다.

또한 .git/refs/stash에 저장합니다.

git stash show -p stash@{0} 에서 이전에 작업한 것과 일시 보존한 것의 차이를 알 수 있다.

그럼 지금, 일시 보존을 잘 해 두었으므로 부르자.

git stash pop라고 부를 수 있다.

복원이 잘되면 알고 자동으로 스태시를 삭제합니다.


조건이 있지만, 스타시를 복원할 때는, 그 브랜치의 워킹 디렉토리가 깨끗해야 한다.

복원 과정 중에 충돌이 일어나 병합할 수 없는 경우가 있다.

충돌이 예상되면 스태시에 대한 분기를 만듭니다.

git stash branch stashTest <ブランチ名> –> 나중에 다시 확인합시다.

스타시는 반드시 저장한 브랜치나 복원을 같은 브랜치로 실시할 필요는 없고, 모두 가능합니다.

git stash apply하지만,이 명령은 와 달리 삭제하지 않고 스택으로 유지를 합니다.

위로 한 번 나왔지만 스택에 여러 작업 내용이있는 경우 stash@ {번호}로 할 수 있습니다.

stash 삭제는 git stash drop에서 삭제할 수 있습니다.


병합

병합 유형(?)

  • fast-forward
  • 3-way
  • rebase를 사용한 병합.

fast-forward

fast-forward는 개인이 혼자 개발할 때 주로 사용된다.

원본의 main 브랜치는 놓고 개발 브랜치를 따로따로 관리한다.



디폴트에서는, 브랜치를 작성할 때는 기준이 되는 main 의 최종 커밋 포인터입니다.

하나의 서브 브랜치를 파고 커밋을 계속해서 개발이 완성된 서브 브랜치라면,

기본 메인 브랜치로 병합을 병합합니다.

git merge

yunyu@DESKTOP-92IMVU3 MINGW64 ~/Documents/gitPracticeWorkspace/기본적인 git/gitPractice/test (main)
$ git log
commit b09a54d876943ab910d6ac8aa0520011578c62d1 (HEAD -> main)
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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 <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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 <[email protected]>
Date:   Mon Mar 20 20:25:34 2023 +0900

    text3.txt 작성

commit b09a54d876943ab910d6ac8aa0520011578c62d1 (main)
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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 <[email protected]>
Date:   Mon Mar 20 20:25:34 2023 +0900

    text3.txt 작성

commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:21:06 2023 +0900

    text1.txt 작성

임의의 main branch에 2개의 더미 test1, 2.txt 파일을 작성해, 최종 커밋으로 sub 브랜치를 작성해 merge를 하면, 위와 같은 로그가 찍힌다.

3-way

또 다시 서브 브랜치를 하나 만든다.

물론, 기준이 되는 main의 최종 커밋 포인터입니다.

fast-forward는 메인 브랜치는 따로 서브 브랜치와는 별도로 커밋을 하지 않았지만, 따로 main도 커밋이 진행된다.

위와 같이 서브 브랜치에도 커밋을 진행시켜준다.

충분히 2번 정도로 커밋을 진행해 준다.

그 후, main에 브랜치를 이동해, main에서도 별도 커밋을 진행한다.


이렇게 진행되고 있는 것이다.

이렇게 보면 공통 조상의 브랜치 1개, main 브랜치 1개, sub 브랜치 1개, 이렇게 총 3개의 길이를 보여 3-way라고 한다.

병합되면 병합 커밋에서 하나의 커밋 메시지가 fast-forward와 달리 추가되어 만들어진다.

병합하는 방법은 동일합니다.

메인 브랜치로 이동 git merge 하면 된다.

* 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 <[email protected]>
Date:   Mon Mar 20 20:25:34 2023 +0900

    text3.txt 작성

commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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 <[email protected]>
Date:   Mon Mar 20 20:39:04 2023 +0900

    text5.txt작성

commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:25:34 2023 +0900

    text3.txt 작성

commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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 <[email protected]>
Date:   Mon Mar 20 20:39:31 2023 +0900

    Merge branch 'subTest1'

commit 8f20f243bc0bd7a169863d43316e0299cf53e615
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:39:04 2023 +0900

    text5.txt작성

commit bb5b38cf1058031651b6e761a7c51e2c0f63ebb4 (subTest1)
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:38:10 2023 +0900

    subtext4.txt작성

commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:25:34 2023 +0900

    text3.txt 작성

commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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 <[email protected]>
| | Date:   Mon Mar 20 20:39:31 2023 +0900
| |
| |     Merge branch 'subTest1'
| |
| * commit bb5b38cf1058031651b6e761a7c51e2c0f63ebb4 (subTest1)
| | Author: yoonwongoo <[email protected]>
| | Date:   Mon Mar 20 20:38:10 2023 +0900
| |
| |     subtext4.txt작성
| |
* | commit 8f20f243bc0bd7a169863d43316e0299cf53e615
|/  Author: yoonwongoo <[email protected]>
|   Date:   Mon Mar 20 20:39:04 2023 +0900
|
|       text5.txt작성
|
* commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
| Author: yoonwongoo <[email protected]>
| Date:   Mon Mar 20 20:25:34 2023 +0900
|
|     text3.txt 작성
|
* commit b09a54d876943ab910d6ac8aa0520011578c62d1
| Author: yoonwongoo <[email protected]>
| Date:   Mon Mar 20 20:23:02 2023 +0900
|
|     text2.txt 작성
|
* commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
  Author: yoonwongoo <[email protected]>
  Date:   Mon Mar 20 20:21:06 2023 +0900

      text1.txt 작성

위와 같이 너무 순조롭게 잘 되면 좋겠지만.. 반드시 그렇지는 않을 것이고 문제가 분명히 일어날 것이다.

거의 3 방향에서 충돌이 발생합니다 … 서로 여러 개발자가 동일한 위치의 소스를 수정하는 경우 발생합니다.

다른 위치의 소스를 수정하면 충돌이 발생하지 않습니다.

예를 들어,


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 브랜치로 main을 rebase한다.

git rebase

를 한 후에 head 포인터가 다르므로 맞춰야 한다.

메인 브랜치로 이동하여 git merge 로 머리를 맞춥니다.

약간 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 <[email protected]>
Date:   Mon Mar 20 20:25:34 2023 +0900

    text3.txt 작성

commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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 <[email protected]>
Date:   Mon Mar 20 20:25:34 2023 +0900

    text3.txt 작성

commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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 <[email protected]>
Date:   Mon Mar 20 20:53:06 2023 +0900

    subTest7.txt작성

commit 0102652ba2b9cce508b677c06ca1d86d9adba8b1
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:49:23 2023 +0900

    subTest4.txt작성

commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:25:34 2023 +0900

    text3.txt 작성

commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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 <[email protected]>
Date:   Mon Mar 20 20:52:20 2023 +0900

    text6.txt작성

commit bf6bff9a8bb9dfaa42f538aa85182701983dc6e0
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:51:59 2023 +0900

    text5.txt작성

commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:25:34 2023 +0900

    text3.txt 작성

commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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 <[email protected]>
Date:   Mon Mar 20 20:53:06 2023 +0900

    subTest7.txt작성

commit 494f208d171c428deaa52f26d8bbf51c536208ef
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:49:23 2023 +0900

    subTest4.txt작성

commit e9c3f0c83c947805157a4f75cb7b8ac08dac4271 (main)
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:52:20 2023 +0900

    text6.txt작성

commit bf6bff9a8bb9dfaa42f538aa85182701983dc6e0
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:51:59 2023 +0900

    text5.txt작성

commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:25:34 2023 +0900

    text3.txt 작성

commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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 <[email protected]>
Date:   Mon Mar 20 20:52:20 2023 +0900

    text6.txt작성

commit bf6bff9a8bb9dfaa42f538aa85182701983dc6e0
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:51:59 2023 +0900

    text5.txt작성

commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:25:34 2023 +0900

    text3.txt 작성

commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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 <[email protected]>
Date:   Mon Mar 20 20:53:06 2023 +0900

    subTest7.txt작성

commit 494f208d171c428deaa52f26d8bbf51c536208ef
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:49:23 2023 +0900

    subTest4.txt작성

commit e9c3f0c83c947805157a4f75cb7b8ac08dac4271
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:52:20 2023 +0900

    text6.txt작성

commit bf6bff9a8bb9dfaa42f538aa85182701983dc6e0
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:51:59 2023 +0900

    text5.txt작성

commit efac6bbe2e1071a83acdd01c0a1c35aefd3a3f67
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:25:34 2023 +0900

    text3.txt 작성

commit b09a54d876943ab910d6ac8aa0520011578c62d1
Author: yoonwongoo <[email protected]>
Date:   Mon Mar 20 20:23:02 2023 +0900

    text2.txt 작성

commit 1f4087373d4cd0372f1536662a4b72b8b5d3bfb3
Author: yoonwongoo <[email protected]>
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를 해준다.


커밋 메시지를 하나로 바꿀 수 있지만, 스쿼시되었음을 알리기 위해 했다.

그러나 이미 밀어 넣은 것을 스쿼시하는 것은 좋지 않습니다.

rebase 사용시주의 사항

리베이스는 커밋 위치와 해시 값을 변경합니다.

리포지토리를 외부에 공개한 경우, 공개된 순간부터 커밋은 리베이스를 사용하지 않는 것이 원칙입니다.

리베이스는 코드를 외부로 푸시하거나 게시하기 전에 로컬에서만 실행하는 것이 좋습니다.

외부에 게시된 커밋을 리베이스하면 커밋 위치와 해시 값이 변경되어 너무 혼란스러워집니다.

즉 아직 원격저장소로 들어올리지 않았다.

-> rebase를 사용할 수 있습니다.

아니. -> 이미 올려서 당겨서 사용하고 있습니다.

revert를 한다.


복귀

reset revert 등으로 돌아갈 수 있다.

(특정 시점).

git checkout <ブランチとコミットhashID>에서 커밋 시점으로 단순히 이동하는 것이 아니라, 특정 시점으로 리셋을 하면 그 이후는 전혀 없었다.

주의해서 사용해야 합니다.

다음 정리하자..