생활코딩

Coding Everybody

원격 저장소와 지역 저장소의 동기화 방법 (Github)

토픽 생활코딩 > 프로젝트 관리 > 버전관리 시스템 > 지옥에서 온 Git (새 수업으로 대체)

수업소개

하나의 원격저장소를 중심으로 두개의 지역저장소가 소스코드를 동기화하는 방법에 대해서 알아봅니다. 

수업

댓글

댓글 본문
  1. 다름다움
    이해가 확실히 되는 영상과 설명이었어요.
    오늘도 감사드립니다^^
  2. software.lee
    감사합니다.
    현재 업무중에는 fork한 repo에서 수정하고 원본(포크해오기 전)의 repo에 PR을 보내는데요,
    pull도 -u upstream 처럼 사용하면 자동으로 tracking할 수 있을까요?
    공부가 필요하네요 ㅎㅎ
  3. 익명
    파일 수정시에도 커밋전에 add 명령을 먼저 해야하는것 같네요

    스테이지 에어리어로 올리는 역할이고요

    스테이지 에어리어에 변경점이 없어서 커밋에러가 나는 상황이네요
    대화보기
    • Jinsungkim
      안녕하세요.

      파일 수정시에 README 파일을 그냥 메모장으로 열어수정하고 Commit 해보려고 합니다.

      이때 Changes not staged for commit 이라는 문구가 뜨네요.

      어떤 내용을 찾아봐야할까요?
    • Deuklyoung Ko
      폴더만 추가 했는데 commit을 할 수 있나요?
      commit 을 할 게 없을 것 같고
      그럼 push 할 것도 없을 것 같은데요.

      오류 내용은 push 하기 전에 pull 한번 해서 버전을 맞추라는 얘기 같은데요.

      아무래도 테스트 하시다가 좀 꼬이신것 같네요.
      대화보기
      • 깃깃깃
        복습을 하고있는데 파일은 변경하지않고 폴더만 몇개 추가를해서 커밋을 한다음에 git push를 하는데 아래와 같은 에러가있는데 무슨 문제인지 아시는분있나요??

        To https://github.com......git
        ! [rejected] master -> master (fetch first)
        error: failed to push some refs to 'https://github.com/awdsza/Interview.git'
        hint: Updates were rejected because the remote contains work that you do
        hint: not have locally. This is usually caused by another repository pushing
        hint: to the same ref. You may want to first integrate the remote changes
        hint: (e.g., 'git pull ...') before pushing again.
        hint: See the 'Note about fast-forwards' in 'git push --help' for details.
      • 제로스
        궁극의 백업이 되겠네요..
      • 김수현
        하나의 원격저장소를 2개의 지역저장소가 사용하는 방법
        집에서 작업 + 회사에서 작업 > 복습의 성격
        ls -al
        git clone 원격저장소의 주소 git_home (저장하고 싶은 디렉토리를 지정) <-- 집에 있는 컴
        git clone 원격저장소의 주소 git_office (저장하고 싶은 디렉토리를 지정) <-- 회사에 있는 컴
        집에서 프로젝트를 할 경우
        vim f1.txt파일의 내용 변경 > 담c > git commit -am 2
        git log
        3으로 했어야 하는데 > 바꾸면 됨 > git commit --amend (--amend개정하다라는 뜻,
        커밋 메시지를 변경가능/커밋할 내용을 누락시켰을 경우에는 add를 한 후 다시 이것을 하면 마지막 메시지를 바꿀 수 있는데
        그것은 원격저장소로 올리전에 해야 함(지역저장소에 있는 경우 > 자신의 컴퓨터에 있는 경우에만 해야 되고 그 이후에는 여러분은 하면 안된다고 생각하면 좋음
        이유: push이후 내용은 수정하지 마라)
        3이라고 내용을 변경하고 :wq
        git log > 2가 3으로 변경된 것을 확인할 수 있음
        git push > ID + 비번 > 요런식으로 푸쉬가 되고
        깃허브에 보니 커밋이 추가되었고 방금 커밋한 것이 올라와 있음(3:55)

        작업을 끝내고 회사로 갈 것임
        회사에서 작업하기 전에 항상
        git pull(당겨온다 )master에 있고 마스터는 오리진에 연결되어 있을 것임
        여러분들이 클로닝을 했기 때문에 그런경우 그냥 git pull만 하면 됨
        원격저장소의 내용을 로컬저장소로 가져오게 됨
        그때 ID와 패스워드를 묻지 않는 것은 여러분이 공개 저장소를 쓰기 때문임
        그럼 여기서 작업을 할 것임
        ls -al > git log > vim f1.txt > d > git commit -am '4' > git push > ID 패스워드 입력

        다시 집으로 와서 (5:17)
        git pull > 또 수정하고 푸시하고 > 회사로 가고 반복하면서
        여러분들이 일을 해나가는 것
        가장 중심적인 것은 백업이 된다는 것
        버젼과 소스코드 모두를 다 올리기 때문에 > 모든 저장소들은 모든 것을 각자 다 가지고 있기 때문에
        요정도 수준의 백업만 되어 있어도 3개가 동시에 파괴될 소지는 현저히 떨어지기 때문에 > 소스코드를 잃어 버린다는 것은 거의 지구수준의 재앙이 아니면 불가능
        이것이 원격저장소의 효용이고 > 여러분이 수련해야 할 시점임 > git pull > git push
        어떤 작업을 할 경우 > 반드시 >(git pull로 당기는 것을 먼저하고 작업이 끝나면 꼭 git push를 하는 것을 여러분이 습관화 시키셔야 함)
      • 김수현
        아래 정영훈님께 답변드립니다.
        https://opentutorials.org......043 <-- 이곳(소스트리사용 강의) 참조하시면 될 것 같습니다.
        커밋을 한 후 커밋하기전 상태로 변경하는 강의입니다.

        이글은 막 깃을 배우는 과정에 있는 초보자가 작성한 글이기 때문에 틀릴 수 있습니다.
        틀린 부분이 있으면 댓글 부탁드립니다.

        결론부터 말씀드리면...
        기록할 필요성이 있을 때 기록합니다.(커밋:지역저장소 > 푸쉬:원격저장소)
        그리고 필요성이 없을 때는 지우고 정리합니다.
        그리고 어차피 지울 것은 처음부터 기록하지 않는다
        입니다.
        -----------------------------------------------------------------------------------------------
        커밋은 아무때나 할 수 있습니다.그렇지만 그렇게 하면 마이너스입니다.
        어떤 마이너스가 올까요?(너무 복잡해집니다, 실제로 해보지 않아서 모르겠지만, 검색해보니
        잘못된 프로그램이 커밋되었을 때는 프로그램이 작동하지 않을 수도 있다고 하네요
        https://tuwlab.com......221)
        그래서 커밋은 필요할 때만 하는 것이 좋습니다.
        커밋을 했을 때 잇점보다는 해로운 점이 많다면 커밋해서는 않됩니다.

        그리고 처음에는 커밋이 필요했는데 나중에 가서 필요없을 때도 있습니다.
        이럴 경우에는 필요없는 커밋들을 정리하는 것이 좋습니다.

        커밋하기 애매한 경우 스태쉬를 하면된다고 여기 강의에서 나옵니다.
        스태쉬가 나오는 이유도
        지금 당장은 어쩔수 없이 커밋을 하지만 의미없는 커밋을 했기 때문에
        어차피 지워야 하는 과정이 필요하게 되는데...
        그 필요없는 과정을 하지 않고 더 편리한 방법으로 보관하자는 것이 스태쉬가 존재하는 이유입니다.(단정적으로 적었지만 위에서 틀릴 수 있다고 했기 때문에 '~이유라고 생각합니다'라고 생각하시고 읽으시면 됩니다) (불필요한 작업을 하지 말자는 것입니다)

        집에서 하는 작업을 회사에 가서 해야 한다면 이것은 필요한 것입니다.
        절대적으로 그렇게 하면 안된다는 것은 없습니다.(이런 경우만 커밋해야 한다)
        주관적이고 상대적입니다. 자기가 필요하면 저장하면됩니다.
        그리고 필요성이 없어졌을 때 지울 수 있습니다.

        새로운 가지를 만들고 가지를 지울수도 있고, 커밋지점을 지울수도 있고...
        복원할 수도 있고 이런 기능을 가지고 있습니다. 이런 기능들을 적절히 이용하면 됩니다.

        커밋하는 경우는 어떤 경우인가:
        각각의 커밋은 의미 있는 변경 단위이고, 변경에 대한 설명을 커밋 로그로 남깁니다. 대개 하나의 커밋은 '회원 가입 기능 추가', '검색 버그 수정'과 같이 하나의 주제로 묶을 수 있는 변경 단위가 됩니다. https://tuwlab.com......202

        하지만 커밋을 절대적으로 꼭 이런 경우에 해야 한다 그런 것은 아닙니다.
        상대적인 주관적인 개념입니다.
        필요한 경우 언제든지 저장할 수 있습니다. 그리고 정리할 필요가 있을 때는 지울 수 있습니다.
        (기준은 사용자가 정하는 것, 커밋을 많이하면-정보를 자세하게 기록하는 것
        https://www.slideshare.net......er/ <-- 슬라이드에 보니 나오네요)

        (상대적개념이기 때문 다르게 생각해보면...)
        회사에서 집에서 저장하는 일은 어떻게 보면 의미없는 커밋을 하는지도 모릅니다.
        그리고 그 의미 없는 커밋은 어차피 정리해야 하는 불피요한 작업이 될 수 있습니다.
        이런 불필요한 작업을 간단하게할 스태쉬와 같은 기능이 있는지 없는지는 모르겠습니다.
        이런 불필요한 커밋을 한방에 더 편리하게 삭제하는 방법은 없을까?
        어차피 삭제할 가지를 새로운 가지로 만들고 병합하고?...새로운 저장소를 만들어서? 잘 모르겠네요...
        새로운 가지에서 처리하다가 버젼가지에 통합(머지)하는 식으로 해결하는 수 밖에 없다고 생각됩니다.
        하나의 버젼이 만들어지기 위해서는 수많은 커밋+(풀/푸쉬)과정이 필요한 것 같습니다.
        https://area51.phpbb.com......tml

        스태쉬(임시저장?)가 원격저장소에? 저장이 될까요? 원격저장소에는 커밋한 것만 저장되는 것 아닌가요?
        만약 스태쉬가 원격저장소에 저장이 된다면...이것이 해결책이 되지 않을까 하는 생각을 해봅니다.
        그렇지만 스태쉬는 저장이 되지 않는 것 같습니다.
        푸쉬라는 행위는 로컬 저장소의 내용 중 원격 저장소에 반영되지 않은 커밋을 원격 저장소로 보내는 과정입니다. https://tuwlab.com......202

        안된다면 저는 새로운 가지를 만들고 그 가지에서 작업을 하다가 버젼가지에 병합하는 식으로 할 것 같습니다.
        그가지에서 커밋지점들을 만들고 태그를 달겠습니다. 집작업20170802, 회사작업20170802...
        아니면 의미 있는 커밋만 남기고 집작업+ 회사작업의 커밋은 삭제하겠습니다. 나중에 가지가 필요 없으면 버젼에 반영하고 가지를 지울 수도 있을 것 같습니다. (MiJey님의 의견에 동의합니다)

        모르는 사람이 쓰려니... 욕하는 사람이 있는 것 같기도 하고...
        그래도 도움이 될 것 같아 적습니다만 틀릴 수도 있습니다.

        다른 저장소를 만들고 할 수 있을 것 같기도 한데...
        이것이 그것과 관련이 된 것인지 모르겠습니다. (Git 도구 - 서브모듈)
        https://git-scm.com......%88
        아래는 서브트리와 서브모듈비교한 부분이 나옵니다.
        http://readme.skplanet.com/?p=8542 <---초보라서 그런지 이해가 안됩니다만...
        초보입장에서는 구글doc+구글쉬트(링크사용)를 사용하는 방법도 있을 것 같습니다.
        (구글doc도 장점이 있다고 생각합니다. 색깔도 넣을 수 있고 링크도 넣을 수 있습니다.
        Git+구글doc+구글쉬트도 하나의 방법이 될 수 있다고 생각합니다. 그런데...
        링크보다는 더 편리한 방법이 있었내요. 구글doc에서 계속 수정한 후 이전 버젼으로 돌아가려면...
        제목밑에 있는 메뉴중 오른쪽 끝 메뉴(도움말) 오른쪽옆에 "몇일몇시에 마지막으로 수정했습니다"라는 곳을 클릭하면...과거 수정했던 내용들이 나옵니다. 수정하려는 것을 클릭한 후 메뉴줄에 버젼복원버튼을 클릭하면 복원됩니다. 이것을 이용하는 것이 더 편리하겠습니다)

        메뉴얼이 있었지요.
        https://git-scm.com....../v2
        구글 검색해보니 잘 정리 돼 있는 것 같습니다.
        https://backlogtool.com......kr/

        추가 : 마스터 가지는 아주 중요한 것만 커밋한다. 그리고 다음 순위의 마스터가지는 그보다 덜 중요한 것도 커밋한다. 그 다음 슬래이브 가지는 사소한 사항도 커밋한다.
        https://stackoverflow.com......phs <-- 그림참조

        브랜치도 다른공간이라고 합니다.(https://www.slideshare.net......er/ < 슬라이더 28P부터 참조) 다른 브렌치에서 커밋한 파일은 다른 브렌치에 영향을 주지 않습니다.(커밋하면...커밋안하면 영향을 줌?) ls -al 하면 같은 디렉토리에 있지만 브랜치를 바꾸고 검색하면 서로 다른 파일 목록이 나옵니다. 다른 브랜치에 있던 파일이 보이지 않기도 합니다. 윈도우 탐색기에서는 브랜치를 변경하면 파일 목록이 달라집니다.
        https://opentutorials.org......088 <-- SourceTree도구 사용시
        https://opentutorials.org......332 <--- 댓글중 김수현글 참조 바랍니다.
        대화보기
        • MiJey
          branch에서 혼자서 작업 중이라면 괜찮지 않을까요? branch를 혼자서 쓰고 아직 작업 중인 코드라는 커밋 메시지를 쓴다면 미완성인 코드라도 원격 저장소의 의미에서 깃헙을 사용할 수 있을 것 같아요.
          master는 기능별로 깔끔하게 commit하구요.
          대화보기
          • 정영훈
            강의 잘 들었습니다.

            강의에서 집과 사무실을 오고 가며 작업하는 경우를 예시를 들어 주셨는데, 그 부분에서 궁금한 점이 있습니다. 깃허브로 push하기 위해서는 먼저 commit을 해야 하는데, commit이라는게 버전을 생성하는 것이라 집이나 혹은 사무실에서 하나의 버전을 완벽히 끝내는 것은 거의 불가능하다고 생각합니다. commit 없이 push가 가능하면 강의 내용처럼 깃허브를 쓸 수 있을 것 같은데 혹시 방법이 있나요?
          • 1234
            키야 클라우드 ide에서 깃헙을 이용하면 개꿀이군
          • Wbbaki Lee
            git pull을 하다 충돌 난것 같아요.
            Merge branch 'master' of https://github.com......eJS

            # Please enter a commit message to explain why this merge is necessary,
            # especially if it merges an updated upstream into a topic branch.
            #
            # Lines starting with '#' will be ignored, and an empty message aborts
            # the commit.
            위에 메세지는 정상적인 git 메세지 같은데
            한칸 띄고 아랫줄에
            -uu-:**-F1 MERGE_MSG All L1 (Fundamental)-----------------------------
            이런 메세지가 뜨고
            :wq입력하려고
            :이걸 누르면
            Eval:이렇게 나오고 wq쓰면
            Debugger entered--Lisp error: (void-variable wq)
            eval(wq)
            eval-expression(wq nil)
            call-interactively(eval-expression)
            이라고 나오는데 왜 그럴까요?ㅠㅠ