C++에 초기 설정 및 깃허브 연동중 에러가 발생할 수 있을법한 과정을 웬만해선 다 포스팅해봤습니다.
VisualStudioCode 에서 발생할만한 에러 & 깃허브 연동 및 업로드 방법에 대해서 많이 겪어보았고,
정말 여러가지 경우의 수에 대해서 보다 자세하게 작성하게 되었습니다.
해당 글로 도움 되시면 좋겠다는 기쁜 마음에 포스팅했습니다.
(반복되는 내용 및 순서가 체계적이지 않다는 것은 참고바랍니다)
(다운로드바로가기)
맥북은 VS에 c++이 지원하지 않습니다. 따라서 VSC를 다운 받아서 확장자 라이브러리를 다운 받아주면됩니다.
(VSC 맥os 다운 -> 확장자에서 C/C++ 다운 - > Code Runner 다운)
이렇게도 안된다면, 아마 json 파일에 문제가 있는 것 같은데 이런 경우
settings.json 파일에서
"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"cpp": "cd $dir && g++ -std=c++14 $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
추가해주면 됩니다.
json 파일은 우측상단에 보이는 톱니바퀴를 누른 후, g++ 누르면 launch.json 파일 뜨고, 한번 더 g++ 누르면 settings.json 이 뜹니다. 여기에 위의 코드를 추가해주시면 됩니다.
#include <iostream>
using namespace std;
int main(){
cout << "hello world\n";
return 0;
}
깃에 해당 소스를 업로드 하려 하였으나 해당 에러가 발생하였습니다.
error: remote origin already exists.
즉, 원격 저장소가 이미 설정되어 있으므로 새로운 원격 저장소를 추가할 필요가 없습니다. 원격 저장소를 변경하고 싶다면, git remote set-url 명령어를 사용하여 원격 저장소의 주소를 변경할 수 있습니다.
필자는
1. git remote remove origin 명령어를 입력하여 기존에 연결되어 있는 원격 저장소와의 연결을 끊어준다
2. git remote add origin (새롭게 연결할 Git 레파지토리 주소) 명령어를 입력한다.
3. git push origin main
그러나,
위와 같은 에러발생.
즉, 다른 사람이나 다른 장소에서 변경된 내용을 우선 가져와서 로컬에 통합한 후에 다시 푸시하는 것입니다. 이를 통해 충돌을 방지하고 변경 사항을 안전하게 푸시할 수 있습니다.
git pull
명령어를 사용하여 로컬에 있는 최신 버전의 코드를 가져옵니다.
충돌이 발생한 파일을 수정합니다. 충돌이 발생한 부분은 <<<<<<< HEAD와 >>>>>>> 사이에 있는 코드입니다. 이 부분을 수정하여 충돌을 해결하면 됩니다.
필요한 경우 변경 사항을 검토하고 다른 변경 사항이 있는지 확인합니다.
변경 사항을 스테이징 영역에 추가하고 커밋합니다. git add
명령어를 사용하여 변경 사항을 스테이징 영역에 추가하고, git commit
명령어를 사용하여 변경 사항을 로컬 저장소에 커밋합니다.
변경 사항을 원격 저장소에 푸시합니다. git push
명령어를 사용하여 변경 사항을 원격 저장소에 푸시합니다.
이렇게 하면 충돌을 해결하고 변경 사항을 병합할 수 있습니다. 만약 충돌이 여전히 발생한다면, 변경 사항을 검토하고 충돌을 해결하는 과정을 반복해야만 합니다.
미치겠다.... 이게 뭐야 ..
당황하지 않고 자연스레 구글링을 해본다..
터미널에 이 명령어를 쳐보자.
git rev-parse --show-toplevel
이 명령어를 치면 내 root repository를 알 수 있습니다다.
/Users/mun
(제 경로)
pwd
로 현재위치를 확인해보고
그럼 이제 해당 경로로 이동해보자.
cd
이동할경로
거기서 해당 디렉토리에 어떤 파일들이 있는지 알아보자.
ls -a
이 디렉토리에 .git이 있을 것이다.
그러면 해당 디렉토리에서 이 명령어를 쳐보자.
rm -r -f .git
(-f는 force의 약자이다.)
이제 명령어가 실행 된 이후에 visual studio code를 동기화하면 말끔하게 10k가 사라진 것을 볼 수 있을 것이다.
git clean -f -d
함부로 치면 절대 절대 안됩니다.
강제로 삭제하는 명령어이기 때문에 복구하기 힘들 수 있다.
정 궁금하면 git clean -d -n
을 해보시면, clean
이 어떻게 되는지 미리 볼 수 있는 코드입니다.
Publish to GitHub라는 버튼이 추가되었지만 GitHub가 아닌 다른 원격 저장소에 올린 경우를 생각해서 Initialize Repository를 클릭하면 됩니다.
이제 로컬 저장소가 초기화됩니다.
소스파일 중 커밋을 원하는 파일 옆에 보이는 Stage Changes 아이콘을 클릭하여 파일 하나씩 추가할 수 있습니다.
또는 CHANGES(변경사항) 항목 옆에 있는 Stage All Changes 아이콘을 클릭하여 Changes에 있는 모든 파일을 추가할 수 있습니다.
Commit시 남길 메모를 입력하고 ( 현재 로컬 repository에 반영한 것이 어떤 작업인지 적어주면 됩니다. ) 바로 아래에 있는 Commit 버튼 (파란색)을 클릭합니다.
현재 변경된 것들이 모두 로컬 저장소에 반영되었기 때문에 아무 파일도 보이지 않습니다.
여기서 파일을 수정하면 위에서 봤던 화면이 보이면서 Changes 항목에 파일이 추가되는 것을 볼 수 있습니다.
앞에서 했던 방법으로 다시 커밋을 다시 해주면 다시 아래 화면처럼 아무 파일도 보이지 않게 됩니다.
git remote add origin
깃헙 주소git pull origin main --allow-unrelated-histories
git push -u origin main
error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/sjMun09/cPlusPlusEx.git'
이 오류는 원격 저장소에 업로드할 수 있는 로컬 브랜치가 없기 때문에 발생합니다. 이 오류를 해결하기 위해서는 다음과 같은 단계를 따르면 됩니다
git add .
명령어를 사용하여 변경 사항을 스테이징 영역에 추가합니다. 이 명령어를 사용하면 모든 변경 사항이 스테이징 영역에 추가됩니다.
git commit -m "커밋 메시지"
명령어를 사용하여 변경 사항을 커밋합니다. 커밋 메시지
부분에는 커밋에 대한 간단한 설명을 입력합니다.
git push -u origin main
명령어를 사용하여 변경 사항을 원격 저장소에 푸시합니다. 이 명령어는 main 브랜치를 원격 저장소에 푸시합니다.
만약 이 오류가 계속 발생한다면, 로컬 저장소에 main 브랜치가 없을 수 있습니다. 이 경우에는 git branch
명령어를 사용하여 브랜치 목록을 확인하고, git checkout -b main
명령어를 사용하여 main 브랜치를 생성하고 체크아웃합니다. 그 다음 위의 단계를 따라서 변경 사항을 커밋하고 원격 저장소에 푸시하면 됩니다.
이 오류는 원격 저장소에 있는 변경 사항이 로컬 저장소에 없어서 발생합니다. 이 경우에는 다음과 같은 단계를 따르면 됩니다:
git pull origin main
명령어를 사용하여 원격 저장소에서 최신 변경 사항을 가져옵니다.
만약 충돌이 발생하면 충돌을 해결합니다. 충돌 해결 방법은 이미 이전에 답변으로 제공해드렸으니 참고해주세요.
변경 사항을 커밋하고 원격 저장소에 푸시합니다. git add .
, git commit -m "커밋 메시지"
, git push origin main
명령어를 사용하여 변경 사항을 원격 저장소에 업로드합니다.
위의 단계를 따라 해결이 되지 않는다면, 원격 저장소에 있는 변경 사항이 로컬 저장소에 없다는 것이 아니라 충돌이 발생해서 자동 병합이 실패한 것일 수 있습니다. 이 경우에는 git pull
대신 git fetch
명령어를 사용하여 원격 저장소에서 변경 사항을 가져온 다음, git merge
명령어를 사용하여 충돌을 해결하고 병합합니다. 그리고 다시 커밋하고 원격 저장소에 푸시합니다.
fetal
git remote add origin (원격 저장소 URL)
명령어를 사용하여 원격 저장소를 추가합니다. 원격 저장소 URL 부분에는 GitHub나 GitLab 등의 호스팅 서비스에서 제공하는 저장소 URL을 입력합니다.
git push -u origin (로컬 브랜치명)
명령어를 사용하여 로컬 브랜치를 원격 저장소에 푸시합니다. 이 명령어는 로컬 브랜치를 원격 저장소에 업로드하고, -u
옵션은 해당 로컬 브랜치가 원격 저장소의 브랜치와 연결되도록 설정합니다.
위의 단계를 따라 원격 저장소를 설정하고 로컬 브랜치를 원격 저장소에 업로드하면 이 오류는 해결됩니다.
ㅋㅋㅋ... 역시 필자를 가만히 안냅두는..
git remote set-url origin (원격 저장소 URL)
명령어를 사용하여 원격 저장소 URL을 업데이트하면 됩니다. 이제 원격 저장소 URL이 업데이트되어 다시 원격 저장소를 추가할 필요가 없습니다.
main
브랜치가 업스트림 브랜치를 가지고 있지 않기 때문에 발생합니다. 이 경우에는 git push --set-upstream origin main
명령어를 사용하여 로컬 브랜치를 원격 저장소의 브랜치와 연결할 수 있습니다.origin
원격 저장소의 main
브랜치와 연결하며, 그 후에는 git push
명령어로 변경 사항을 업로드할 수 있습니다.이제 main
브랜치는 origin/main
브랜치와 연결되었으며, git push
명령어를 사용하여 변경 사항을 업로드할 수 있습니다.
하하하하하하하.....
만만하지 않았던 과정이었다..
차라리 백준 10개 풀라고 하는게..더 나앗다 정말 진짜로..
뒤지게 어렵네... 그래도 에러를 이겨서 엄청나게 뿌듯하다 ㅋㅋㅋㅋ
git remote add origin https://github.com/sjMun09/cPlusPlusEx.git
했는데,error: remote origin already exists.
메시지가 떳습니다. 이유 : 이 에러 메시지는 이미 "origin"이라는 이름으로 등록된 원격 저장소가 있어서 새로운 원격 저장소를 추가할 수 없다는 것을 나타냅니다.
- 등록된 원격 저장소 확인하기: 이미 등록된 원격 저장소를 확인하려면
"git remote -v"
명령어를 실행합니다. 이 명령어는 현재 로컬 저장소에 연결된 원격 저장소의 목록을 보여줍니다. 추가하려는 저장소가 이미 목록에 있는지 확인하고, 있다면 다른 이름으로 등록하거나 해당 원격 저장소를 삭제한 후 다시 시도하세요.
- 원격 저장소 이름 변경하기: 이미 같은 이름으로 등록된 원격 저장소가 있을 경우
"git remote rename <old-name> <new-name>"
명령어를 사용하여 해당 원격 저장소의 이름을 변경할 수 있습니다. 이를 통해 새로운 원격 저장소를 동일한 이름으로 추가할 수 있습니다.
- 등록된 원격 저장소 삭제하기: 기존에 등록한 원격 저장소가 더 이상 필요하지 않은 경우
"git remote rm <name>"
명령어를 사용하여 해당 원격 저장소를 삭제할 수 있습니다.
"git remote add origin https://github.com/sjMun09/cPlusPlusEx.git"
명령어를 다시 실행.git remote rename git remote add origin https://github.com/sjMun09/cPlusPlusEx https://github.com/sjMun09/cPlusPlusEx.git
이렇게 바보같이 사용했따 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ...
취직 후, 깃허브 모르면 욕 먹는다는데... 지금 많이 만져봐야겠다는 생각이 드네요
결론 : 두 가지 명령어는 별개의 명령어이기 때문에 이 방법은 동작하지 않습니다.
이미 "origin"
이라는 이름으로 등록된 원격 저장소를 "cPlusPlusEx"
라는 이름으로 변경하려면 다음과 같은 명령어를 사용해야 합니다.
git remote rename origin cPlusPlusEx
위 명령어를 실행하면 "origin"이라는 이름으로 등록된 원격 저장소가 "cPlusPlusEx"
라는 이름으로 변경됩니다.
그리고 나서 다시 아래와 같이 "git remote add"
명령어를 실행하여 새로운 원격 저장소를 추가하시면 됩니다.
git remote add origin https://github.com/sjMun09/cPlusPlusEx.git
이제 원격 저장소가 "origin"
이라는 이름으로 새롭게 추가됩니다.
usage: git remote rename [--[no-]progress] <old> <new> --progress force progress reporting
이유 : 이 에러는 "old" 인자와 "new" 인자를 정확하게 입력하지 않았기 때문에 발생한 것입니다. "old" 인자는 현재 이름으로 등록된 원격 저장소의 이름이고, "new" 인자는 변경하고자 하는 새로운 이름입니다.
따라서 아래와 같이 명령어를 실행
git remote rename origin cPlusPlusEx
위 명령어에서 "origin"
은 현재 등록된 원격 저장소의 이름이고, "cPlusPlusEx"
은 변경하고자 하는 새로운 이름입니다. 이렇게 실행하면 "origin"
이름이 "cPlusPlusEx"
이름으로 변경됩니다.
git remote rename origin cPlusPlusEx
즉, 다시말해서 이 명령어는 "origin"이라는 이름으로 등록된 원격 저장소를 "cPlusPlusEx"라는 이름으로 변경하는 것입니다. 정상적으로 실행되었다면 아무런 출력이 나타나지 않을 것입니다.
git remote -v
위 명령어를 실행하면 변경된 원격 저장소 이름인 "cPlusPlusEx"
가 나타날 것입니다.
git remote add origin https://github.com/sjMun09/cPlusPlusEx.git
이후, 원격 저장소에 추가해야함으로
"git remote add"
명령어를 실행하여 원격 저장소를 추가하려면 다음과 같이 입력합니다.git remote add origin https://github.com/sjMun09/cPlusPlusEx.git
새로운 원격 저장소가 추가되었으므로, 이제 변경된 원격 저장소로부터 최신 코드를 가져오려면 다음과 같이 git pull
명령어를 실행합니다.
git pull origin main
그리고 나서, 변경된 코드를 로컬 저장소에서 원격 저장소로 업로드하려면 다음과 같이 git push
명령어를 실행합니다.
git push origin main
긴 글 읽어주셔서 감사합니다.
많은 도움 받으셨으면 좋겠습니다.
(혹시라도 이렇게 하셨는데도 안되셨다면.... 마지막으로 정말 깔끔하게 순서만 정리해드리겠습니다.)
git push origin main
명령어는 로컬 저장소의 main 브랜치에 있는 변경 내용을 원격 저장소의 main 브랜치에 업로드하는 명령어입니다. 따라서 이 명령어를 실행하면 변경된 코드가 깃허브의 main 브랜치에 업로드됩니다.
이렇게 하면 변경 내용이 깃허브에 업로드됩니다.
마지막에
error: src refspec push does not match any error: failed to push some refs to 'https://github.com/sjMun09/cPlusPlusEx.git'
"git push" 명령어를 실행할 때 로컬 저장소에 커밋된 변경 내용이 없거나, 커밋된 내용이 원격 저장소의 브랜치와 일치하지 않을 때 발생합니다.
이 에러를 해결하려면 먼저 로컬 저장소에 변경된 내용이 있는지 확인해야 합니다.
변경된 내용이 없는 경우, git add .
명령어를 사용하여 변경된 파일을 스테이징하고, git commit
명령어를 사용하여 커밋합니다.
git add .
git commit -m "커밋 메시지"
위 명령어에서 .은 현재 디렉토리의 모든 변경 내용을 스테이징하겠다는 뜻입니다. git commit
명령어에서 -m
옵션은 커밋 메시지를 작성하겠다는 뜻입니다.
"git push"
명령어를 실행하여 원격 저장소에 변경된 내용을 업로드합니다. 이때 -u 옵션을 추가하여 원격 저장소의 브랜치와 로컬 브랜치를 연동합니다.git push -u origin main
이유,
이 에러는 git pull 명령어를 실행했을 때, 현재 로컬 브랜치와 원격 저장소의 브랜치가 충돌하여 병합(merge) 또는 리베이스(rebase) 방식으로 어떻게 처리할지 지정하지 않아서 발생합니다.
병합과 리베이스는 두 브랜치를 합치는 방법으로, 각각의 방식에는 장단점이 있습니다.
병합 또는 리베이스 중 하나를 선택하여 git config 명령어로 지정해야 합니다. 위에 나열된 git config pull.rebase false(병합), true(리베이스), only(패스트 포워드) 중에서 하나를 선택하여 실행합니다.
예를 들어, 리베이스를 사용하려면 다음 명령어를 입력합니다.
git config pull.rebase true
만약 전역 설정으로 지정하려면 --global
옵션을 추가합니다.
이후, 설정된 값을 다시 확인하려면 다음 명령어를 입력합니다.
git config --get pull.rebase
또한, git pull
명령어 실행 시에 직접 옵션을 지정하여 현재 pull 작업에 대한 방식을 선택할 수 있습니다.
예를 들어, 리베이스 방식으로 pull을 실행하려면 다음과 같이 입력합니다.
git pull --rebase
이전에 PUSH 할때는 에러가 발생했던 것을 알 수 있다. 이것은 위에 REBASE를 하지 않았기 때문이다.
인클루드 경로를 업데이트하기 위해서는 VS Code에서 프로젝트 디렉토리 내부에 .vscode 디렉토리를 만들고, 그 안에 c_cpp_properties.json 파일을 생성해야 합니다. 이 파일은 C/C++ 확장팩에서 인식하고 사용하는 파일이며, JSON 형식으로 작성됩니다.
c_cpp_properties.json 파일을 생성하고 나면, includePath 필드에 원하는 인클루드 경로를 추가해주면 됩니다. 예를 들어, 현재 프로젝트 디렉토리와 같은 디렉토리에 있는 헤더 파일을 인클루드하려면, 다음과 같이 c_cpp_properties.json 파일을 작성할 수 있습니다:
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/<헤더 파일이 있는 디렉토리>"
],
"defines": [],
"macFrameworkPath": [
"/Library/Frameworks",
"/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "${default}"
}
],
"version": 4
}
<헤더 파일이 있는 디렉토리> 부분에는 해당 헤더 파일이 위치한 디렉토리 경로를 입력하시면 됩니다. 이후 VS Code을 다시 실행하면 인클루드 경로가 업데이트되어 정상적으로 컴파일되는 것을 확인할 수 있습니다.