📜 제목으로 보기

타인repo를 clone후 commit, tag 코드 옮겨다니기

commit_hash or tag로 점프: git checkout [hash or tag]

  • 환경변수를 파악하고 code .

  • vscode로 리조지토리 초기화

  • vscode push 버튼으로 올리기

    image-20211001005629523

  • git fetch는 해두는 게 좋다

    • 내 repo에 누가 작업을 추가했는지 파악만 해주는 것
  • 강의별로 commit을 한다면?

    • 커밋별로 tag를 추가로 만들어준다.

    • 예를 들어

      • 5화 작업

        • 5화 커밋
          • git tag 5
      • 6화 작업

        • 6화 커밋
          • git tag 6
      • push by vscode push버튼

        image-20211001010739579

  • git checkout [git_id]으로 5화 이전의 4화로 점프띄어보자.

    • 4화 부분의 git id 복사 image-20211001010912582

    • 해당 폴더의 vscode 터미널에서 git checkout [git_id]

        git checkout fefc0cacbf262ae0794e64a632afa2da095b622a
      
      • 이때 brunch자체가 [git_id]로 변하면서 과거로 돌아간다 image-20211001011150526
    • 현재로 돌아오려면, 기존 branch(master)로 checkout한다

        git checkout master
      
  • git checkout [tag명]으로 점프띄어보자

    • 각 커밋마다 커밋후 쉬운 이름표인 tag를 만들어준다.

      • 아까 5화 작업 끝나고, git tag 5

        • 5화 끝난후의 소스를 보고 싶을 땐 이렇게 이동한다

            #git checkout [tag명]
            git checkout 5
          

          image-20211001012120166

    • 다 참조가 끝났다면, 다시 최근소스의 branch로 오면된다.

        git checkout master
      
  • tag는 대신 따로 push를 해줘야한다.

    • 커밋들을 push한거로는 tag까지 push가 안됨. image-20211001012541909
      git push --tags
    
    • 버튼으로는 잘 안보이고 팔레트 > push 검색 > git push tags를 선택해준다. image-20211001012458748 image-20211001012626189

    • 참고)

      • 맨첨 커밋에는 0.0.0의 tag를 만들어주고 image-20211001012710133

      • 그 이후로는 1.0.0부터 쭉 만들면된다.

        image-20211001012719525

내 repo 돌아가기, 되돌리기

기본 세팅

  • /home/is2js/workspace/git-practice
  1. 소스트리 설치

    • vscode에서는 설정(ctrl+,)에서 exclude 검색후 .git을 삭제하여 보이게 하기
  2. 디렉토리에서 vscode열기

    • vscode 터미널 열여서 git설정 저장하기

        git config --global user.name "is2js"
        git config --global user.name "tingstyle1@gmail.com"
      
  3. .git폴더를 삭제후 소스트리에서 해보기

    • create를 통해 해당폴더를 선택해서 만들어준다.
      • 이미 폴더가 있는데 이 내부에 .git생성할까 물어보면 OK image-20211001232956631
  4. 2개의 파일을 만들고 이 상태를 저장하기

    • cat
    • mouse
  5. git status(gst)를 통해 아직 untracked 파일들 확인 후 add

    git add -A

    git status

  6. 메세지(-m)와 함께 묻기(commit 해주기) git commit -m "First commit"

  7. 묻은 것을 소스트리에서 확인해보기 image-20211001233642989

    터미널에서 히스토리 확인하기 git log --oneline

  8. 소스트리는 git status없이 묻을 파일을 자동으로 알려준다.

    • vscode도 extensiont쪽에 알려줌?
    • dog라는 파일을 만들고
      • 소스트리에서 확인해서 add + 커밋까지해보자. image-20211001233956185 image-20211001234010365
  9. 파일 삭제 + 변경 + 생성을 한꺼번에 한 뒤 git status로 보자.
    • 삭제+변경과 생성을 따로따로 알려주며 다 알려주긴 한다. image-20211001234218325
    • 소스트리도 아이콘으로 알려준다. image-20211001234255141
  10. git log로 이때까지 묻은 캡슐들을 한꺼번에 볼 수 있음. 소스트리에서는 History탭에서 보면 된다.

    image-20211001234615685

과감한 돌아가기: git reset [commit_hash] –hard

image-20211001234706364

  • 돌아갈때는 과감한방법신중한방법이 있다.

    • 과감한방법(--hard) : 복원이후시점은 완전히 지우겠다. image-20211001234739005

      • git log상의 commit_id 앞6글자만 복사

      • git reset [commit_id] --hard

        image-20211001234901365 image-20211001234933860

    • 다시 한번 cat삭제 + dog이름변경 + 펭귄추가를 해주고 commit한뒤 소스트리로 reset –hard해보자.

      • 이 커밋까지 현재브린치를 초기화 image-20211001235606020
      • Hard(버림) 선택 image-20211001235653620
  • 신중한방법(--soft): 시점만 돌아가고 + 그 이후는 커밋되지 않은 상태로 파일은 유지

(반대동작으로 취소시켜, 돌아갈 미래를 남긴체) 되돌리기 : git revert

  • **[reset으로 돌아갈 수 있는 미래]를 남겨두기 위해, [반대동작으로 취소시켜] 되돌리기 **

  • 다시 3번째 커밋까지 만들어준다.
  • 이번에는 돌아갈시점 6자리 for reset이 아닌 취소할 시점 6자리 for revertgit log에서 찾는다.
    • 취소할 커밋revert(취소)했다는 커밋이 그대로 이어서 남는다.
      • 소스트리를 통해 확인하면, 정확히 취소할 커밋이, 커밋시 수행한 동작을 정확히 반대로 수행하여 취소함.
      • 취소할커밋이 커밋기록으로 남아있으니, reset --hard(이 커밋까지 현재브런치를 초기화)을 통한 해당 커밋으로 과감하게 돌아갈 수도 있다.
  • **즉, [reset으로 돌아갈 수 있는 미래]를 남겨두는 [반대동작으로 취소시켜] 되돌리기 **
  1. 가장 최근 것을 revert로 취소시켜보자.

    git log

    • 제일 최근시점을 취소시키기 위해, 최근 커밋(현재커밋) 6글자 복붙
  2. git revert [취소시점6자리] + :wq

    • 커밋메세지 작성화면으로 들어온다.
    • 여기선 :wq로 나와야 해당 revert 커밋메세지가 전달된다. image-20211002000722292 image-20211002000855922
  3. 3번째 커밋이 취소된 것을 파일이 reset처럼 과거상태로 돌아감을 보면 알 수 있다. image-20211002000933963

  4. git log를 확인해보니, 돌아간시점이후로 가 삭제된 것(reset –hard, 과감한 돌아가기)가 아니라 새 커밋이 형성되었다. image-20211002001052979

    • 소스트리에서 보아도 3번째 커밋을 상쇄시키는 커밋이 추가로 발생함 image-20211002001109106

    image-20211002001152074

    • 자세히 보면, 소스트리를 통해 확인하면, 정확히 취소할 커밋이, 커밋시 수행한 동작을 정확히 반대로 수행하여 취소함
      • 3번째 커밋(취소할 커밋) 때 한 동작들 image-20211002001555974
      • 4번째 커밋인 3번째 커밋을 취소함(revert)를 할때의 동작들 image-20211002001659195
  5. revert를 통해 취소할커밋도 reset-hard와 다르게 기록으로 남아있으니 reset을 통해 취소하기 전의 3번째 커밋상태로 과감하게 돌아갈 수도 있다.

    image-20211002001758225 image-20211002001804553

  6. 소스트리를 통한 revert는 커밋 되돌리기다.

    • 역시.. (반대동작으로 취소시켜) 되돌리기 = revert image-20211002001952906

      • 커밋 되돌리기 == 반대동작을 통해 해당 커밋을 취소시킴

        image-20211002002040361

내repo branch(평행우주) 만들기 for 기존플젝에 새로운 도전

  • 회사 프로젝트를 내가 함부로 수정할 수 없으니
    • 현재 프로젝트에서 다른 시도를 해보고 싶을 때, branch를 만들어 평행우주로 넘어간다.

평행우주로 이동도:git checkout [브랜] or 더블클릭 in 소스트리

  1. 브랜치 생성

    • 브랜치 : 현 시점에서 2개의 미래로 분기를 시작하겠다.
      • 현 시점과 동일한 상태 그대로 가져가면서 분기함.
     #git branch [만들 브랜치명]
     git branch my-idea
    

    image-20211003000041156

    • 확인은 git branch

      image-20211003000221840

  2. 브랜치 이동도 git checkout

    • 과거로 점프갔다오기 : git checkout [commit_id or tag]

      • 과거로 돌아가기 : git reset –hard or git revert [commit_id]
    • 과거가 아닌 현재->다른평행우주(branch)로 이동git checkout + 브랜치명

        #git checktout [브랜치명]git checktout my-idea
      

      image-20211003000651235

      • branch변경해도, 내 파일상태에는 변함이 없음. 현재 상태를 그대로 가지고 평행우주를 만들어서
  3. 데이터 변경 후 커밋하기 in my-idea브랜치

    • mouse 삭제, dinosaur 추가

      • 용이름 둘리
    • 현 branch에서 커밋하기

        git add -Agit commit -m "Add dino"
      

      image-20211003000859291

  4. 상사가 부를 땐, 원래 우주로 돌아간다.

    • 원래 브랜치는 master였다.

      • 이동 전 image-20211003001332003

      • 이동 후 (파일이 원래대로 돌아옴)

          git checkout master
        

        image-20211003001400307

    • git을 처음 배울때는 파일이 잘못될까바 불안해서 사용안할 수도 있는데, 앞으로 계속 사용해보자~

  5. 소스트리에서 다시 해보자. 더블클릭으로도 우주를 왔다갔다 하며 확인할 수 있다.

    • 브랜치 부분에 my-idea가 추가됨. 여기서 각 브랜치를 더블클릭할 때마다, vscode의 파일도 같이 바뀌더라. image-20211003001456954 image-20211003001621866 image-20211003001633841

브랜치에서 새 브랜치 따기

  1. my-idea로 checkout된 상태에서, 상단의 브랜치탭에서 새로 생성해보자. image-20211003001857763

    • 이 때, 새 브랜치로 체크아웃을 체크해주면, 자동으로 새 브랜치로 넘어가진 상태가 된다. image-20211003001921089

    image-20211003001935250

    • my-idea에서 파생된 브랜치라 그 상태를 그대로 가져갔다.
  2. 브랜치의 브랜치 상태에서, 데이터를 변경후 커밋까지

    • cat 이름을 변경:tom to nyang

    image-20211003002136494

연결된 3개의 평행우주에서 상황맞이

  1. 상사가 master의 내용을 바꾸길 원함.

    image-20211003002904029

    • 요구 대로 바꿔고, commit한다.

        git add -Agit commit -m "EDIT dog name"
      

      image-20211003002942121

  2. 평행우주에서, 타 브랜치의 base가 되는 branch(여기선 maser)가 한발(commit) 나서게 되면, 분기된 branch가 나눠서 그려진다.

    image-20211003003147169

다른 우주(의지를 이은 가장 바깥가지 브랜치)에서 변화 가져오기: [ 받을놈branch이동후] git merge [줄놈branch]

  1. 현재 메인프로젝트 master의 변경내용과는 서로다른 평행우주끼리 다른파일 수정이라면, 브랜치의 브랜치라도 편하게 master로 merge되는 것을 권유할 수 있다.

    • 아래 내용을 상사에게 권해본다.

      • my-idea에서 mouse삭제 후 dino 추가했고
      • my-idea - my-another-idea에서 cat이름을 변경했는데
        • 이것들을 메인프로젝트에 적용해도될까요? Okay 승인

      image-20211003003446450

    • 2개의 평행우주에서 일어난 일을 master브랜치로 가져야가한다.

      • 이 때, 브랜치1의 브랜치2는 생성부터 브랜치1의 변화를 그대로 가져와서 생성되므로 브랜치2만 반영시키면 된다. image-20211003003549273 image-20211003003715241

        image-20211003003725288

  2. merge를 위해서는

    • 먼저 받는놈 브랜치(master)로 이동(checkout)한 상태여야한다.

      • git merge [줄놈 브랜치명]
        git checkout mastergit merge my-another-idea
      

      image-20211003003957105

    • 변화를 보니 master의 상사지시 + 평행우주에서 한 것들이 모두 반영되어있다.

      • master에서의 dog name to 바꾼 것도 반영되어이있지만 image-20211003004307823
      • my-another-idea에서의 쥐삭제+용추가 한 것도 동시에 반영된 상태다. image-20211003004333159
  3. 확인은

    • 소스트리
    • vscode git graph가 아니라면
    • git log --graph --all --decorate로 확인하란다
      • git log --graph --oneline정도면 충분할듯?

reset –hard로 merge전으로 돌아간 후, 소스트리로 merge하기

  • 소스트리로 실습하기 위해 merge전으로 돌아가보자.
  1. merge 직전의 받는놈 브랜치가장 마지막 커밋 == merge전 커밋으로

    • git reset –hard

    • 소스트리: 이 커밋까지 현재 브랜치를 초기화

      image-20211003005017239 image-20211003005025695

  2. 소스트리로 merge하려면 더 간단한데
    • 받는놈의 branch를 더블클릭해서 이동
    • 주는놈 branch우클릭 > 현재 브랜치(받는놈 더블클릭 상태)로 my-another-idea(주는놈, 우클리상태) 병합 image-20211003005204959
  3. 나중에는.. 수많은 폴더와 파일을 다뤄야하기 때문에,
    • 기존프로젝트에 새 도전을 하려면 반드시 git branch써야함. image-20211003005845391

아름답지 않은 merge + conflict후에는 메세지없이 git commit

  • 원래 merge가 성공하면 git이 자동 add + commit까지 한다.
  1. bark-wang브랜치 생성후, dog 파일 수정 -> commit

     ❯ git branch bark-wang❯ git checkout bark-wangSwitched to branch 'bark-wang'❯ git add -A❯ git commit -m "EDIT dog file"
    

    image-20211003010526993

  2. 이제 받는놈인 master로 돌아와서 같은 dog파일 수정하자.

     ❯ git checkout masterSwitched to branch 'master'❯ git add -A❯ git commit -m "EDIT dog file bar warlwarl"
    
    • master가 한발짝 나가는 순간부터 분기가 갈라져 보인다. image-20211003010655293
  3. 현재, masterbark-wang이 서로 같은 파일을 수정한 상태다.

    • 아까의 merge는 서로 다른파일이 수정된 상태라 merge가 쉽게 되었다.

    • 한번 merge해보자

        ❯ git checkout masterAlready on 'master'❯ git merge bark-wangAuto-merging dogCONFLICT (content): Merge conflict in dogAutomatic merge failed; fix conflicts and then commit the result.
      

      image-20211003011007118 image-20211003011038253

  4. merge시 conflict가 뜨는데 같은 파일을 여러 평행우주에서 수정했기 때문이다.
    1. conflic가 없었을 때의 merge는?
      • merge를 자동으로 커밋까지 해주는 커밋메세지 확인이 떴었다.
    2. terminal에 안내문이 뜬다
    3. 소스트리에서는 그래프가 회색으로 연결안되어있으면서 "커밋하지 않은 변경사항"의 상태로 뜬다. image-20211003011147302
    4. vscode에서는 conflict된 부분을 나눠서 알려준다. image-20211003011213533
  5. conflict는 vscode에서 택1해서 지울건 지운 뒤, addgit commit-m 없는 상태로 커밋을 날리면 자동으로 merge 메세지가 뜬다.

    • accept incoming ~ in vscode
     git add -Agit commit
    

    image-20211003011547877

    • conflic후 commit은 메세지없이 git commit만 날리며 알아서 merge 메세지가 미리 작성되어있다.

      image-20211003011632308

  6. 앞으로 다른 브랜치끼리는 같은파일을 수정안하도록 작업하면 merge가 편안해진다.

다른우주도 1줄로 만들어 통합: git rebase(재배치)

  • 프로젝트의 성격에 따라 필요한 것을 선택해서 사용하면 된다.

    image-20211003020510088

  • 지금은 git log상 2갈래 정도만 나오지만

    • 실제로는 엄청나게 많은 줄기가 생기게 된다.

      image-20211003015700954 image-20211003015710426

  • 딱 1줄로 통합되도록 merge하는 방법이 git rebase다

    • 소스트리상으로는 master(받는놈)에서 주는놈(bark-warl) 우클릭 > 재배치(rebase)를 클릭한다.

      image-20211003020742481

    • 같은 파일을 건들인 상황이니 똑같이 conflict해결후 add+commit한다.

    • 재배치가 끝나면 분기가1 줄로 나타난다.

      • 브랜치라도 합쳐지는 모양이 아니다.

      image-20211003020920872image-20211003020953896

다 쓴 브랜치 삭제: git branch -D

  • rebase는 1줄로 받는놈(masetr)에 통합되어버린다.

    • 그럼 작업한 branch(주는놈)은 더이상 필요 없을 것이다.

    • 대문자로 -D옵션을 준다
    • 소스트리는 우클릭으로 바로 할 수 있다.
      ❯ git branch -D bark-wang
      Deleted branch bark-wang (was 5fefbe0).
    

  • merge를 통해 분기가 합쳐졌던 branch들도 git branch -D로 삭제하였더니

    • 분기 표기는 남아있는데, branch만 사라졌다.

    image-20211003021224185