Git repository 생성후 push 안됨 (master -> main)
폴더 및 파일로 코드작성을 다 한 뒤, 원격저장소에 저장하려고 한다.
깃허브 레포지토리에서 초록색 New 버튼을 눌러서 commit-test 라는 레포지토리를 만들어보겠다.
3개의 체크 박스 중 첫 번째 박스를 선택하고 Create 하면
이 레포지토리에서 main 이 디폴트 브랜치로 설정될 것이고 나중에 설정에 들어가서 바꿀 수 있다고 나온다.
레포지토리를 생성하면 이렇게 나오는 것을 볼 수 있다.
README.md 파일을 만들고 싶지 않다면 체크를 하지 않고 생성하면 된다.
(그러면 나중에 커밋 푸쉬 한 후 다음과 같은 알림이 나온다)
일단 나는 README.md 파일을 생성한 방향으로 원격저장소를 사용해보겠다.
내가 사용하는 에디터는 VSC(Visual Studio Code)이다.
test 폴더를 만들고 vsc에 들어가서 해당 폴더를 연다 (맥 : command+O / 윈 : control+O )
test.txt 파일을 만들고 터미널을 열어준다
이 test.txt 를 방금 만든 commit-test 레포지토리(원격저장소)에 올려줄 것이다.
https://kkangsg.tistory.com/82
[6/24 엘리스트랙 이론강의1]CLI&GIT-이고잉코치님
바탕화면에 work폴더를 만들고 vsc로 들어온다 shell이 bash가 되도록 한다. (다른 shell들도 있지만, 명령어가 달라서 bash로 통일 / 운영체제에 따라 초기 shell이 다를 수 있음) nano파일편집기를 이용해
kkangsg.tistory.com
$ git init
$ git add [디렉토리명]
$ git commit -m "commit message"
다음과 같이 하면 로컬 깃 저장소에 test.txt 가 올라갔을 것 이다.
이제 원격저장소와 연결해주자!!! 🧚♀️
혹시라도 다른 원격저장소와 연결되어있는지 확인해보자
//연결된 원격저장소 있는지 확인
$ git remote -v
아무것도 안 나오면 연결된 원격저장소가 없다는 것이고
위와 같이 나오면 이미 연결된 원격저장소가 있다는 뜻이다
이 경우에는 원격저장소를 삭제하면 된다,,!!
(나는 처음에 이걸 몰라서 깃헙 레포지토리도 지우고 파일 백업해두고 폴더 지우고 git init부터 다시 했던 기억이,,,ㄸㄹㄹ)
//이미 존재하는 원격저장소 삭제
$ git remote rm origin
기존의 원격저장소 삭제한 뒤에, 내가 원하는 원격저장소에 연결해보자
//원격 저장소와 연결
$ git remote add origin [깃헙 레포지토리 주소]
위에서 생성한 레포지토리에 들어가서 초록색 code를 클릭하면 아래에 HTTPS로 나오는 주소가 있다 (SSH랑은 다르기 때문에 주의)
(전체선택해서 복사해도 되지만) 옆의 파일모양을 클릭하면 자동으로 원격저장소 주소 전체가 복사된다.
연결이 된 것을 확인할 수 있다.
여기서부턴 시행착오라서 보기만 하기!!!
이제 로컬 깃 저장소 .git 에 커밋되어 있는 우리의 test.txt 파일을 원격저장소 에 push 하기 위해 아래와 같은 명령어를 입력한다.
//원격저장소에 push
$ git push -u origin master
(이 명령어는 방금 연결한 원격저장소의 브랜치 중 이름이 master인 브랜치에 push 해달라는 의미)
하지만 이렇게 하면 깃헙 레포지토리에 갔을 때
원래 하나밖에 없었던 브랜치가 2개가 된 것을 볼 수 있고
레포지토리의 디폴트 브랜치는 main 브랜치이지만 나는 master 브랜치에 푸쉬했기 때문에
푸쉬한 파일을 보고 싶으면 main브랜치를 master브랜치로 바꿔줘야하고,
글 위에서 생성하겠다고 체크한 README 파일도 없는 것을 볼 수 있다. (리드미파일은 메인브랜치에 생성됐기 때문)
알아보니 Github에서 처음 브랜치를 만들고 이름을 붙일 때 master branch 라고 했다. 즉 디폴트 브랜치가 마스터 였지만,
이때의 master가 master-slave 에서의 master이기 때문에, Black lives matter 운동의 연장으로
미국 IT업계에서는 논란이 많은 master-slave, blacklist-whitelist 와 같은 언어적 문제를 해결하려는 움직임이 있다.
그런 의미로 GitHub 에서도 2020년 10월을 기준으로 신규 레포지토리를 생성시 디폴트 브랜치 명이 main으로 생성된다.
그래서 나는 master branch 가 아니라 main branch 에 push 하고 싶어서
원격저장소를 연결해준 뒤에, master 대신 main을 작성했는데
$ git push -u origin main
에러가 나왔다....
👀 띠 👀 용 👀 어떡하지...
찾아보니까
나는 vsc에디터 안에서 terminal을 열어서 사용하는데 vsc에서는 아래와 같이
master branch 가 디폴트 값이어서 그랬던 것이다.
vsc의 왼쪽 하단
내가 현재 있는 브랜치 명을 확인하는 명령어는
$ git branch
이다.
확인해보면 master브랜치 인 것으로 나온다
master 브랜치에서 아무리 main 브랜치로 푸쉬해주세요!! 라고 입력해도
$ git push -u origin main
main과 매칭되지 않는다는 에러가 나오는 것은 당연하다.
그럼 우리는 branch 명을 바꿔주면 된다!!🐥
여기서부터는 따라해도 됩니다!!
$ git branch -M [되고싶은 branch name]
$ git branch -m [현재 branch name] [바꾸고싶은 branch name]
main branch 로 바꿔줌
위와 같은 명령어를 입력하면 브랜치 명 master 에서 main 으로 바뀐 것을 볼 수 있다.
vsc의 왼쪽 하단
( 이때 주의!!
브랜치를 전환하는 것과 브랜치 명을 바꿔주는 것은 다르다.
브랜치를 전환하는 것은 여러 브랜치가 있을 때 $ git branch checkout [전환하고싶은 브랜치명] 으로 입력한다. )
브랜치 전환을 한 다음에
$ git remote add origin [원격저장소 주소]
원격저장소 연결을 해줘도 된다.
브랜치 전환과 원격저장소 연결의 순서는 상관없다!
이제 아까 입력했던 push 명령어를 입력하면
$ git push -u origin main
로컬 깃 저장소 -> 원격저장소 로 스무스하게 이동할거라 생각했지만,,! 또 에러 발생,,,🤦♀️
이유는 우리가 처음 깃허브에서 레포지토리를 생성할 때 README.md 파일을 생성했기 때문에
이 파일을 먼저 pull 로 로컬에 가져오고 (힌트에 나와있는 것 처럼)
그 이후에 test.txt(내가 올리고 싶은 파일)을 push 해야하는 것이다.
(만약, README.md 파일을 생성하는 체크박스를 클릭하지 않고 저장소 생성 했다면 pull 없이 push 바로 하면 된다)
$ git pull origin [branch name]
$ git pull
지금은 브랜치가 하나라서 $ git pull origin main 이든 $ git pull 이든 상관 없지만, 가능하면 전자처럼 브랜치명까지 정확하게 명시해주자
이제 드디어 기다리고 기다리던 PUSHHHHH!!!!!!!!!
$ git push -u origin main
깔끔하게 done. done. 100% 가 나오는 것을 볼 수 있다.
깃허브 레포지토리 페이지에 가서 봐도
main branch 1개로 깔꼼하게 업로드 된 것을 확인할 수 있다.
여기까지 깃헙 레포지토리의 생성부터 첫번째 업로드까지 이다.
이제 두번째 커밋 푸쉬는 처음보다 훠어어어어얼씬 쉽다!!
test.txt 에 왈랄ㄹ랄라 수정하고 새로운 파일인 test2.txt 를 생성하면 아래와 같이 나온다.
(아마 정확하진 않지만 M : modified / U : untracked 아닐까 생각해본다! 오쨋든!)
git status로 확인해보면 다음과 같이 나오고,
$ git add .
//으로 해도 되고
$ git add test.txt
$ git add test2.txt
//으로 각각 해줘도 된다
그 이후에 commit push 를 이어서 해주면, 터미널 창에는 아래와 같이 나오고
깃헙 저장소에 가서 확인해보면 잘 올라온 것을 볼 수 있다.
이렇게 두번째 이후의 커밋&푸쉬 방법도 완료~~ 끝!!😊
[총 정리] VSC에서 github repository에 main branch 로 push 하는 방법
//로컬 깃 저장소 생성(.git 폴더 생성)
$ git init
//Working directory -> Staging Area
$ git add [directory]
$ git add .
//Staging Area -> repository(.git)
$ git commit -m "commit message"
//원격저장소와 연결
$ git remote add origin [원격저장소 주소]
//브랜치 명 바꾸기
$ git branch -M [branch name(main)]
$ git branch -m [현재 branch name] [바꾸고싶은 branch name]
//(선택) README.md가 있다면 : push 보다 pull 먼저
$ git pull origin [branch name(main)]
//로컬 레포지토리 -> 원격 레포지토리
$ git push -u origin [branch name(main)]
//파일 수정 및 추가 이후 : 다음번 commit & push
$ git pull origin [branch name] (선택:다른 장소에서 작업한게 없으면 안해도 됨)
$ git add [directory]
$ git commit -m "commit message"
$ git push -u origin [branch name]
[ git에 대한 여러가지 명령어 ]
//현재 상태 보여줌
$ git status
//현재 브랜치 확인
$ git branch -v
//지금까지의 모든 커밋에 대한 내용 조회(커밋아이디, 사용자이름, 날짜, 브랜치)
$ git log
//git log의 그래프 옵션(그래프로 나타냄)
$ git log --graph
//HEAD가 가리키는 브랜치 바꾸기
$ git check [branch name]
//git init 취소하기 (.git 폴더가 삭제 & 로컬저장소 지정 해제)
$ rm -r .git
$ git log
$ git log --graph
위의 명령어 말고도 더 많이 있지만 그건 그때그때 필요하면 찾아서 사용하는 걸로! :>
이정도만 알고 있어도 현재로는 충분할 것 같다.
[참고]
$ git push 와 $ git push -u origin [branch name] 의 차이
브랜치가 하나일 때는 둘 다 동일한 브랜치로 푸쉬를 해주는 것을 의미
BUT 만약 브랜치가 두 개 이상인 경우에는 후자처럼 반드시 브랜치 이름을 명시해줘야 한다.
우리는 실수하지 않기 위해서 후자로 표현하는 것에 익숙해지면 좋을 것 같다!
REPOSITORY와 로컬저장소의 차이 때문에 해결이 안될시엔
pull 로 레포를 땡겨와 푸쉬 해준다 이 과정에서 pull 이 안되는데 그럴때는 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 해준다.
로컬 저장소에 있는 프로젝트를 깃허브 사이트를 통해 만든 저장소로 push 하는 경우에 이런 메세지가 뜨는 경우가 있다.
1
2
3
4
5
6
7
8
|
C:\Users\gitProject>git push origin master
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/userId/userProject.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
|
cs |
push 전에 먼저 pull을 해서 프로젝트를 병합해 주어야 한다.
1
|
refusing to merge unrelated histories
|
cs |
pull 명령 실행시 이런 문구와 함께 진행되지 않는다면, 다음의 명령으로 실행한다.
1
|
git pull origin 브런치명 --allow-unrelated-histories
|
cs |
--allow-unrelated-histories 이 명령 옵션은 이미 존재하는 두 프로젝트의 기록(history)을 저장하는 드문 상황에 사용된다고 한다. 즉, git에서는 서로 관련 기록이 없는 이질적인 두 프로젝트를 병합할 때 기본적으로 거부하는데, 이것을 허용해 주는 것이다.
요약하자면 init -> remote 설정후 -> add -> commit ->pull(x) -> git pull origin 브런치명 --allow-unrelated-histories
-> pull(O) -> PUSH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
이렇게 하여 성공하였다.