저는 Windows 10 컴퓨터(Cygwin 기반)에서 ROOT 및 Python 스크립트/매크로에 액세스하기 위한 터미널로 mobaXterm을 사용해 왔습니다. 또한 동료들과 저는 Gitlab을 사용하여 이러한 스크립트/매크로를 공유해 왔습니다. 최근 우리는 Gitlab을 사용하여 공유되는 LaTeX 문서 작업을 시작했습니다. 내가 직면한 문제는 LaTeX 편집기로 사용하는 Overleaf와 Gitlab을 통합하려는 것입니다.
나는 주어진 가이드를 따랐다.Overleaf의 git 저장소를 Github와 연결하는 방법은 다음과 같습니다., 방금 몇 가지 성가신 문제가 발생했습니다.
첫째, 다음 줄을 사용하여 Overleaf 저장소를 내 컴퓨터에 git clone할 수 있는 것 같았습니다.git clone https://git.overleaf.com/%%%%%%%%%%%%%% note_name
이어서git remote rename origin overleaf
그러다가 실을 잡아당겼어요git pull overleaf master
이 중 어느 것도 문제를 일으키지 않는 것 같았습니다. 그런 다음 다음 줄을 통해 Gitlab 저장소를 추가했습니다.git remote add gitlab https://gitlab.thing.ty/folder/note_name.git
git config --global push.default matching
그런 다음 Gitlab에 대한 예비 푸시를 수행했습니다.
git push gitlab
Username for 'https://gitlab.thing.ty':
Password for 'https://[email protected]':
Counting objects: 21, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (20/20), done.
Writing objects: 100% (21/21), 50.81 KiB | 0 bytes/s, done.
Total 21 (delta 7), reused 0 (delta 0)
To https://gitlab.thing.ty/folder/note_name.git
ccf7614..596ba69 master -> master`
그런 다음 Overleaf에서 가져오세요.git pull overleaf master
remote: Counting objects: 5, done
remote: Finding sources: 100% (3/3)
remote: Getting sizes: 100% (4/4)
remote: Compressing objects: 100% (7764/7764)
remote: Total 3 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://git.overleaf.com/%%%%%%%%%%%%
* branch master -> FETCH_HEAD
f0173f3..d3bb61b master -> overleaf/master
Merge made by the 'recursive' strategy.
Section2.tex | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)`
이제 변경 사항을 커밋하고 변경 사항을 Gitlab에 푸시해야 할 때 문제가 발생합니다. 다음과 같은 줄이 나타납니다.
git commit -m "configuring git access, no major edits have been made"
On branch master
Your branch is ahead of 'overleaf/master' by 16 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
그리고
git push gitlab
Username for 'https://gitlab.thing.ty':
Password for 'https://[email protected]':
To https://gitlab.thing.ty/folder/note_name.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to
'https://gitlab.thing.ty/folder/note_name.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.
두 개의 서로 다른 저장소를 동시에 관리하는 방법을 알 수 없는 것 같습니다.
답변1
커밋 수가 가장 많은 저장소는 변경을 시도하기 전에 끌어오는 저장소여야 합니다.
git pull upstream master
그런 다음 gitlab 저장소가 업스트림과 동기화되어 있는지 확인하세요.
git push origin master
이렇게 하면 작업할 때 두 저장소가 모두 동기화됩니다.
git log
당신은 다음과 같은 것을보아야합니다
commit 798a0433ad807b6127066cac3f6e33d6551ef0d4 (HEAD -> master, upstream/master, origin/master)
이는 두 저장소가 모두 동일한 커밋에 있음을 의미합니다.
작업을 마친 후에는(별도의 브랜치에서 작업했다면 더 좋음) 해당 변경 사항을 커밋해야 합니다.git commit --all -m "some text"
이 작업을 완료하면 git log
두 가지 모두를 선도하는 새 분기가 표시되어야 하며 upstream
, origin
사용해야 하는 두 가지 중 하나에 변경 사항을 통합하려는 경우 저장소에 하나가 생성 git rebase
됩니다 . 병합할 때 모든 커밋이 녹기 때문에 fast-forward
사용하지 않습니다 . pull
그 후에는 두 저장소 모두에 대한 쓰기 액세스 권한이 없다고 가정합니다.
예를 들어 git fetch
저장소에서 변경 사항을 다운로드 한 git fetch upstream master
다음 커밋을 본 다음 안전한 방식으로 변경 사항을 병합하는 git log
데 사용됩니다 .git rebase
인용하다Git 공식 서적자세한 내용은 처음 3장을 읽고 나면 아이디어를 얻을 수 있습니다.
답변2
여러 개의 git 원격을 사용하는 데에는 세 가지 일반적인 시나리오가 있으며, 이를 처리하는 방법은 필요한 항목에 따라 다릅니다.
- 사용자 정의 패치가 포함된 일부 소프트웨어 포크가 있습니다. 이것은 제가 아는 가장 일반적인 상황이고 제가 개인적으로 경험한 유일한 상황이며 실제로는 매우 일반적인 개발 상황입니다. 좋은 예는 다음과 같습니다https://github.com/Ferroin/linux, 소규모 로컬 패치 모음을 유지 관리합니다.https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
- 작업을 게시하고 서로 동기화를 유지하려는 업스트림 저장소가 여러 개 있습니다. 정기적으로 이 작업을 수행하는 프로젝트는 없지만 프로젝트가 저장소에 대해 서로 다른 호스팅 공급자 간에 전환할 때 가끔 수행합니다.
- 별도의 개발 및 릴리스 저장소가 있습니다. 이는 사례 1과 매우 유사하며 반대입니다.
앞서 언급했듯이 상황을 처리하는 방법은 현재 처한 상황에 따라 다릅니다. 가장 간단한 경우(나의 경우이기도 함)생각하다실제로 문제에 대한 설명을 제공했습니다. 이는 사례 2입니다. 여기서 관리자는 업데이트를 푸시할 때 두 저장소 모두에 푸시하는지 확인합니다(git에서는 명시적으로 각 원격으로 푸시해야 합니다). 사례 3도 매우 간단합니다. 버전을 게시할 때 버전에 태그를 지정하고 두 저장소 모두에 푸시하고, 무언가를 게시하지 않을 때만 개발 저장소에 푸시하면 됩니다.
사례 1은 가장 일반적이지만 푸시 및 풀 명령 이상의 기능을 포함하기 때문에 가장 복잡하기도 합니다. 보조 원격이 중요한 유일한 경우는 업데이트 업스트림이 있을 때입니다. 이때 해당 업데이트를 가져와 그 위에 로컬 분기를 리베이스(또는 로컬 워크플로에 따라 병합)해야 합니다.
또한 공식 문서를 읽는 데 관심이 있을 수도 있습니다.자식 책, 이것은 사물을 잘 설명하는 역할을 합니다. "분산 Git"에 관한 장이 아마도 이 질문과 가장 관련이 있을 것입니다. 그러나 워크플로우를 이해하려면 Git이 소스 제어를 수행하는 방법에 대한 좋은 이해가 필요하므로 전체 기사를 읽는 것이 좋습니다.