복습을 하고있는데 파일은 변경하지않고 폴더만 몇개 추가를해서 커밋을 한다음에 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://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에서 계속 수정한 후 이전 버젼으로 돌아가려면...
제목밑에 있는 메뉴중 오른쪽 끝 메뉴(도움말) 오른쪽옆에 "몇일몇시에 마지막으로 수정했습니다"라는 곳을 클릭하면...과거 수정했던 내용들이 나옵니다. 수정하려는 것을 클릭한 후 메뉴줄에 버젼복원버튼을 클릭하면 복원됩니다. 이것을 이용하는 것이 더 편리하겠습니다)
강의에서 집과 사무실을 오고 가며 작업하는 경우를 예시를 들어 주셨는데, 그 부분에서 궁금한 점이 있습니다. 깃허브로 push하기 위해서는 먼저 commit을 해야 하는데, commit이라는게 버전을 생성하는 것이라 집이나 혹은 사무실에서 하나의 버전을 완벽히 끝내는 것은 거의 불가능하다고 생각합니다. commit 없이 push가 가능하면 강의 내용처럼 깃허브를 쓸 수 있을 것 같은데 혹시 방법이 있나요?
# 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)
이라고 나오는데 왜 그럴까요?ㅠㅠ