힘내 푸시 오류 '[원격 거부 됨] 마스터-> 마스터 (지점은 현재 체크 아웃 됨)'


961

어제 Git 리포지토리를 내 컴퓨터 중 하나 에서 다른 컴퓨터 로 복제하는 방법에 대한 질문을 게시했습니다. 다른 컴퓨터에서 어떻게 'git clone'할 수 있습니까? .

이제 소스 (192.168.1.2)에서 대상 (192.168.1.1)으로 Git 저장소를 성공적으로 복제 할 수 있습니다.

그러나 파일 a git commit -a -m "test"및 a를 편집하면 git push대상 (192.168.1.1) 에서이 오류가 발생합니다.

git push                                                
hap@192.168.1.2's password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error: 
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

두 가지 버전의 Git을 사용하고 있습니다 (원격에서는 1.7, 로컬 컴퓨터에서는 1.5). 그게 가능한 이유입니까?


5
이전 타이머가 수락 된 답변을 stackoverflow.com/a/9283833/397872로 변경 하고 스레드를 아카이브 또는 다른 것으로 이동할 수 있습니까? 또는 소유권을 변경 하시겠습니까?
rishta

9
당신은 실제로 이제 망할 놈의 2.3.0 (2015 년 2 월)와 비 베어 REPO에 전달할 수있는 안전한 방법을 가지고 git config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309
VonC

: 그 @stigi 언급했다고이 책의 새로운 링크의 git-scm.com/book/en/v1/Git-on-the-Server
Abdelilah 엘 Aissaoui


그러나 왜 그리고 어떻게 작동하는지 이해하지 못합니까? 작동하지만 예입니다.
Tilak Maddy 2016 년

답변:


1149

원격 저장소를 Bare 저장소로 간단히 변환 할 수 있습니다 (Bare 저장소에는 작업 사본이 없으며 폴더에는 실제 저장소 데이터 만 포함됨).

원격 저장소 폴더에서 다음 명령을 실행하십시오.

git config --bool core.bare true

그런 다음 .git해당 폴더를 제외한 모든 파일을 삭제하십시오 . 그러면 git push오류없이 원격 저장소 를 수행 할 수 있습니다.


4
감사. 나도 이것이 필요했다. 나는 Git Community Book 의 서브 모듈 튜토리얼을 따르고 있었고이 장애물에 부딪쳤다.
Shiki

6
서버 또는 클라이언트에서 파일을 삭제할 것인지 확실하지 않으므로 아무것도 삭제하지 않았으며 문제를 해결 한 후에 문제가 해결되었습니다 git config --bool core.bare true. 일부 파일을 삭제해야하는 특별한 이유가 있습니까? 그렇다면 삭제해야 할 항목에 대해 더 정확하게 설명 할 수 있습니까?
브라이언 반덴버그

24
가장 좋은 답변이며 아무도 Interwebs에 제공하지 않았습니다. 나는 우리 모두가 같은 오류 메시지를 봤으며 이것을 읽게되어 매우 기뻤습니다.
Sebastián Grignoli

40
많은 표를 얻었지만 이것이 특정 질문에 대한 적절한 답변이라고 생각하지 않습니다. Bare Repo를 깨끗하게 작성하는 방법을 사용자에게 지시하는 것은 반 정도 나쁘지만 파일이 체크 아웃 상태를 유지해야하는 경우 (예 : 사용자가 두 컴퓨터에서 작업하는 저장소 인 경우) 어떻게해야합니까?
Nowhere man

9
소스 저장소를 베어로 변경하는 것은 과도합니다. @Robert가 지적한대로 당신이해야 할 모든 소스의 repo에 새로운 지점에 푸시입니다 : stackoverflow.com/a/2933656/402949 .
Dan Solovay 1

707

나는 Git을 배우기 시작하면서 같은 오류가 발생했습니다 . 다른 답변 중 일부는 Git을 처음 사용하는 사람에게는 적합하지 않습니다!

어쨌든, 일어나고있는 일은 두 개의 저장소가 있고, 하나는 처음에 만든 것과 다른 하나는 방금 만든 것입니다.

현재 작업 저장소에 있으며 "마스터"분기를 사용하고 있습니다. 그러나 원래 저장소에서 동일한 "마스터"지점에 "로그인"된 경우도 있습니다. 이제 원본에 "로그인"되었으므로 Git은 원본을 작업하고 문제를 일으킬 수 있기 때문에 혼란 스러울 수 있습니다. 따라서 원래 저장소로 돌아가서 "git checkout someotherbranch"를 수행해야하며 이제 아무 문제없이 푸시 할 수 있습니다.

이게 도움이 되길 바란다.


76
+1 훨씬 도움이되었습니다. Robert 감사합니다. 필자의 경우 베어 리포지토리로 변환하는 것이 의미가 없었습니다. 푸시하려는 지점을 '비활성화'하면됩니다. 맞는 말이다.
Eric Muyser

32
@ FMaz008 : 그냥 더미 브랜치를 만듭니다 (git checkout -b dummy)
Dror Cohen

14
남자 이것은 대부분의 투표 답변보다 훨씬 낫습니다 :) 감사합니다. 다른 답변도 좋은 지적이지만 :)
Ivan Ivanić

102
그냥 푸시의 대상 년대의 repo에서이 명확하게합니다 : git checkout -b tmp. 그런 다음 소스 저장소에서 : git push. 그런 다음 목표물로 돌아갑니다 (선택 사항) :git checkout master; git branch -d tmp
Hari Karam Singh

18
Hari의 의견은 가장 간단한 레시피입니다. git은 svn 또는 다른 RV에서 오는 여러 가지면에서 훌륭 할 수 있지만이 모든 것은 놀랍도록 직관적이지 않습니다.
UnconditionallyReinstateMonica

128

오류 메시지는 발생한 일을 설명합니다. 최신 버전의 Git은 분기가 체크 아웃되면 푸시를 통해 분기 업데이트를 거부합니다.

두 개의 비 베어 리포지토리간에 작업하는 가장 쉬운 방법은

  1. 항상 가져 오기 (또는 가져 오기 및 병합) 또는 리포지토리를 업데이트하여 리포지토리를 업데이트해야합니다.

  2. 별도의 분기 (가져 오기 분기)로 푸시 한 다음 해당 분기를 원격 시스템의 마스터 분기로 병합합니다.

이 제한의 이유는 푸시 작업이 원격 Git 리포지토리에서만 작동하고 인덱스 및 작업 트리에 액세스 할 수 없기 때문입니다. 따라서 허용 된 경우 체크 아웃 된 분기를 푸시 하면 원격 저장소의 색인 및 작업 트리와 일치하지 않도록 변경 HEAD 됩니다.

이렇게하면 실수로 변경 사항을 커밋하여 푸시 된 모든 변경 사항을 취소하고 커밋 되지 않은 로컬 변경 사항과 새 HEAD트리, 인덱스 및 작업 트리 간의 차이점을 구분하기가 매우 어려워집니다 푸시 이동으로 인해 발생합니다 HEAD.


1
감사. 내 문제를 어떻게 해결할 수 있습니까? 내 192 상자에서 '$ cd (프로젝트 디렉토리) $ git init $ (일부 파일 추가) $ git add.' 그런 다음 191 상자에서 'git clone'을 수행하고 일부 파일을 편집하고 'git push'를 시도했습니다.
hap497

16
글쎄, 나는 내 대답의 가능성을 설명했다. - 어느 쪽이든 당신은 192 상자로 이동하여 191 상자에서 가져 오기 (봐 원격라는 이름으로 191 상자를 추가 할 수 있습니다 git remote add box191 <191url>, 또는 당신은 양자 택일라는 이름의 브랜치 (예 :에 191 상자에서 밀어 수 있습니다) git push origin master:refs/heads/upload다음) 192 상자에 넣고 병합합니다 (예 :) git merge upload.
CB Bailey

3
당신은 실제로 이제 보안 힘내 2.3.0 (2015 년 2 월)와 비 베어의 repo에 밀어 방법 및이 git config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309을 : 당신은 더 이상 옵션이 필요하지 않습니다.
VonC

122

요약

데이터 및 기록 손실로 끝날 수있는 방식으로 해당 리포지토리의 사용자를 망칠 수 있으므로 리포지토리의 체크 아웃 된 분기로 푸시 할 수 없습니다 . 그러나 동일한 저장소의 다른 지점으로 푸시 할 수 있습니다.

베어 리포지토리에는 분기가 체크 아웃되지 않으므로 항상 베어 리포지토리의 모든 분기로 푸시 할 수 있습니다.

필요에 따라 여러 가지 솔루션이 있습니다.

해결 방법 1 : 베어 Repostiory 사용

제안한 바와 같이 한 시스템에서 작업 디렉토리가 필요하지 않은 경우 베어 저장소로 이동할 수 있습니다. 저장소를 엉망으로 만들지 않으려면 복제하면됩니다.

machine1$ cd ..
machine1$ mv repo repo.old
machine1$ git clone --bare repo.old repo

이제 원하는 모든 주소를 이전과 동일한 주소로 푸시 할 수 있습니다.

해결 방법 2 : 점검되지 않은 지점으로 푸시

그러나 리모컨의 코드를 확인해야하는 경우 <remote>특수 분기를 사용하여 푸시 할 수 있습니다. 로컬 리포지토리에서 리모컨을 호출 origin했으며 지점 마스터에 있다고 가정 해 봅시다 . 그럼 넌 할 수있어

machine2$ git push origin master:master+machine2

그런 다음 origin원격 저장소 에있을 때 병합해야합니다 .

machine1$ git merge master+machine2

문제 부검

지점이 체크 아웃되면 커밋은 현재 브랜치의 헤드를 부모로하여 새로운 커밋을 추가하고 브랜치의 헤드를 새로운 커밋으로 이동시킵니다.

그래서

A ← B
    ↑
[HEAD,branch1]

된다

A ← B ← C
        ↑
    [HEAD,branch1]

그러나 누군가가 그 사이에서 그 지점으로 밀 수 있다면, 사용자는 git 호출 분리 헤드 모드 에 도달 할 것입니다 :

A ← B ← X
    ↑   ↑
[HEAD] [branch1]

이제 사용자는 다른 지점을 명시 적으로 체크 아웃하지 않아도 더 이상 branch1에 없습니다. 더 나쁜 것은 사용자가 이제 지점 외부 에 있으며 새로운 커밋이 매달려 있다는 것입니다 .

      [HEAD]
        ↓
        C
      ↙
A ← B ← X
        ↑
       [branch1]

이 시점에서 사용자가 다른 지점을 체크 아웃하면이 매달려있는 커밋은 Git의 가비지 수집기에 대한 공정한 게임이됩니다 .


3
"부검"에 대한 한 가지 기술적 수정 : git은 실제로 HEAD푸시 된 저장소에서 분리되지 않습니다 . HEAD여전히 브랜치를 가리키고 브랜치는 푸시 된 새로운 커밋을 차례로 가리 킵니다. 그러나 작업 디렉토리 및 색인 / 스테이징 영역은 수정되지 않습니다. 푸시 된 리포지토리에서 작업하는 사람은 이제 푸시의 영향을 복구하기 위해 열심히 노력해야합니다. 저장할 변경 사항이 있는지 확인하고, 저장할 경우 신중하게 정리합니다.
torek

답변에 추가 정보를 추가하려면 사람들이 공개하지 않는 원격 저장소를 원치 않는 이유가 거의 없으므로 베어 저장소를 사용하는 것이 가장 좋습니다.

2
실제로, 비 저장소 저장소로 푸시해야 할 때 많은 상황을 발견했으며 솔루션 2를 많이 사용합니다. 또한 비 베어 리포지토리를 푸시하는 지점은 임시 지점이 아니며 원격 추적 지점과 비슷한 목적으로 사용됩니다.
아무데도 남자

SourceTree를 사용하여 여러 사용자가 만든 모든 리포지토리를 호스팅하는 GIT 폴더를 서버에 만들었습니다. master로컬 PC에 리포지토리를 만들었습니다 . remotes서버 폴더에 서버를 추가하고 리포지토리를 서버로 푸시하려고 시도하여 다른 사용자가 작업을 위해 가져 오거나 가져올 수 있습니다. 다음과 같은 오류가 발생합니다. ! [remote rejected] master -> master (branch is currently checked out)어떻게 체크인 할 수 있습니까?
SearchForKnowledge

1
@SearchForKnowledge, 내가 대답하고있는 질문을 정확히하고 있다는 것을 알고 있습니까?!
Nowhere man

65

.git/config대상 서버에서 를 편집하여이 "제한"을 해결할 수 있습니다 . git 저장소가 "체크 아웃"된 경우에도 푸시되도록 다음을 추가하십시오.

[receive]
denyCurrentBranch = warn

또는

[receive]
denyCurrentBranch = false

첫 번째는 분기를 엉망으로 만들 가능성을 경고하면서 푸시를 허용하는 반면 두 번째는 조용히 허용합니다.

이것은 편집 용이 아닌 서버에 코드를 "배치"하는 데 사용될 수 있습니다. 이것이 최선의 방법은 아니지만 코드 배포를위한 빠른 방법입니다.


7
이것을 사용하여 서버에 코드를 "배치"하면 작동하지 않습니다. 체크 아웃 한 분기로 푸시 할 수 있도록 경고를 비활성화하더라도 작업 복사본은 푸시시 업데이트되지 않습니다.
Arrowmaster

10
cd .. && git reset --hard수신 후 후크 와 함께 위의 방법을 사용하여 배포하고 있습니다. 해 키시지만 작동합니다.
jholster

9
후자의 명령 행 버전이 될 것이다git config receive.denyCurrentBranch warn
앙드레 HOLZNER

4
이것이 정답입니다. 우리 중 일부는 우리가하는 일을 알고 있으며 Git 초보자가 아닙니다. 이것이 그 사람들의 대답입니다.
Qix-MONICA가 MISTREATED

2
하,하지만 문제는 한 하지 BYT 요청 하는 사람.
아무데도 남자

46

git config --local receive.denyCurrentBranch updateInstead

https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155

서버 리포지토리에서이를 사용하고 추적되지 않은 덮어 쓰기가 발생하지 않으면 작업 트리도 업데이트합니다.

주석에서 VonC언급 한 것처럼 Git 2.3 에 추가되었습니다 .

나는 Git 2.3을 컴파일하고 시도했다. 샘플 사용법 :

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

산출:

a
b

예, b밀렸어요!


@VonC 감사합니다! 그것은 :-) 직장에서 최소한의 예제와 함께 내 강박 관념이다
치로 틸리冠状病毒审查六四事件法轮功

서버에 최신이 아닌 변경 사항을 커밋하는 데 문제가 있습니까?
akozi

@akozi 나는 당신이 무엇을 의미하는지 잘 모르겠습니다. 당기기 전에 로컬로 커밋하면 전통적인 --bare클론 처럼 작동 --force합니다. 푸시해야하며 리모콘에서 커밋을 "손실"시킵니다.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功 걱정하지 마십시오. 옵션의 의미를 찾았습니다. 나는 updateInstead가 힘과 동의어라고 생각했다.
akozi

updateInstead는 더 이상 receive.denyCurrentBranch에 유효한 값입니다
Xalorous

41

원격 상자에 여전히 사용 가능한 저장소가 있다는 아이디어가 좋지만 더미 브랜치 대신 다음을 사용하고 싶습니다.

git checkout --detach

이것은 Git의 새로운 기능인 것 같습니다 . git 버전 1.7.7.4를 사용하고 있습니다.


8
그런 다음 변경 사항을 적용한 후 다음을 사용 git checkout master하여 마스터 분기로 돌아갈 수 있습니다 . 그때만 변경 사항이 적용됩니다.
MAZDAK

30

나는 같은 문제가 있었다. 나를 위해 Git push를 사용하여 코드를 서버로 옮깁니다. 서버 측에서 코드를 변경하지 않으므로 안전합니다.

저장소에서 다음을 입력하려고합니다.

git config receive.denyCurrentBranch ignore

이렇게하면 작업중인 복사 본인 저장소를 변경할 수 있습니다.

Git 푸시를 실행 한 후 원격 시스템으로 이동하여 다음을 입력하십시오.

git checkout -f

이렇게하면 변경 한 내용이 원격 컴퓨터의 작업 복사본에 반영됩니다.

추진중인 작업 사본을 변경하는 경우 항상 안전하지는 않습니다.


감사 로그, 나는 당신에게 제안을 병합 denyCurrentBranch넣어 git checkout -f내부 hooks잭 - senechal 게시 @처럼 폴더를 여기에
에 데르 송 T. Szlachta

파일을 이동하지 않고이 명령을 수행하지 않고 파일을 원격 저장소에 표시하는 방법이 있습니까? 즉, 지역의 명령으로?
Royi

24

서버 저장소를 다시 작성하고 로컬 지점 마스터에서 서버 마스터로 푸시 할 수 있습니다.

원격 서버에서 :

mkdir myrepo.git
cd myrepo.git
git init --bare

현지 지사에서 확인하십시오.

git push origin master:master

3
감사합니다. 원격 서버에서 '-베어'를 생략했기 때문에 이것이 나를위한 솔루션이었습니다. 이 질문에 대한 답변은 원격 서버 저장소를 작업 디렉토리로 사용하는지 여부에 달려 있으며 후자의 경우 이것이 정답입니다.
Cas

2
나는 이해하지 못한다 : SI는 베어 레포를 생성하고 복제하려고했지만 클론은 아무것도 다운로드하지 않고 아무 것도 업로드하지 않았다. 그래서 이것은 작동하지 않는다. 파일이 포함되어 있지 않습니다 ... 확실히 내가 찾는 것이 아닙니다 ...
inf3rno

22

아마 당신이 이것을 일으킨 것 :

이런 종류의 일은 작은 프로그램을 시작하려고 할 때 발생합니다. 이미 작동중인 것을 변경하려고하므로 레벨 3의 영구적 인 실행 취소 주문을 시전하십시오.

machine1:~/proj1> git init

추가 / 커밋을 시작합니다. 그러나 다음 프로젝트의 시작은 더 관여하고 같은 일을 할 수 있도록 당신이 (당신의 가정의 PC 또는 노트북과 같은) 다른 컴퓨터에서 작업 할

machine2:~> git clone ssh://machine1/~/proj1

복제되고 모든 것이 좋아 보이므로 machine2에서 코드를 작업합니다.

그런 다음 ... machine2에서 커밋을 푸시하려고하면 제목에 경고 메시지가 나타납니다.

이 메시지의 이유는 가져온 git repo가 ​​machine1의 해당 폴더에만 사용되기 때문입니다. 잘 복제 할 수는 있지만 밀면 문제가 발생할 수 있습니다. 서로 다른 두 위치에서 코드를 관리하는 "적절한"방법은 제안 된 "맨손"저장소를 사용하는 것입니다. 베어 REPO는 모든 작업이 수행되는 것으로 설계되지 않았습니다 에서 그것, 여러 소스에서 커밋을 조정하기위한 것입니다. 이것이 최상위 답변 이 .git 폴더 이외의 모든 파일 / 폴더를 삭제하도록 제안 하는 이유 git config --bool core.bare true입니다.

최고 답변을 명확하게 설명 : 그 답변에 대한 많은 의견은 "machine1에서 비 .git 파일을 삭제하지 않았으며 여전히 machine2에서 커밋 할 수 있습니다"와 같은 내용을 말합니다. 맞습니다. 그러나 다른 파일은 이제 git repo와 완전히 "이혼"되었습니다. git status거기에 들어가서 "치명적인 :이 작업은 작업 트리에서 실행되어야합니다"와 같은 것을 보게 될 것입니다. 따라서 파일을 삭제하라는 제안은 machine2의 커밋이 작동 하지 않습니다 . 혼란스럽지 않고 git이 여전히 해당 파일을 추적한다고 생각합니다. 그러나 machine1의 파일을 계속 사용하려면 파일을 삭제하는 것이 문제가됩니까?

그래서 어떻게해야합니까?

machine1 및 machine2에서 얼마나 많은 작업을 계속할 것인지에 따라 ...

machine1에서 개발을 완료하고 모든 개발을 machine2로 옮겼 다면 최상위 답변에서 제안하는대로하십시오. git config --bool core.bare true선택적으로 해당 폴더에서 .git 이외의 모든 파일 / 폴더를 삭제하십시오. 추적되지 않아 혼동을 일으킬 가능성이 있습니다.

machine2에 대한 작업이 일회성이고 개발을 계속할 필요가 없다면 ... 맨손으로 리포지토리를 만드는 데 신경 쓰지 마십시오. ftp / rsync / scp / etc 만 있으면됩니다. machine * 1 *의 파일 위에 machine * 2 *의 파일이 있고 machine * 1 *의 commit / push를 누른 다음 machine * 2 *에서 파일을 삭제하십시오. 다른 사람들은 지점을 만들 것을 제안했지만 다른 컴퓨터에서 한 번에 수행 한 일부 개발을 병합하려는 경우 약간 지저분하다고 생각합니다.

machine1과 machine2 둘 다에서 개발을 계속해야하는 경우 올바르게 설정해야합니다. 레포를 베어로 변환 한 다음 machine1에서 복제하여 작업 해야합니다 . 아마도 가장 빠른 방법은 수행하는 것입니다.

machine1:~/proj1> git config --bool core.bare true
machine1:~/proj1> mv .git/ ../proj1.git
machine1:~/proj1> cd ..
machine1:~> rm -rf proj1
machine1:~> git clone proj1.git
machine1:~> cd proj1

매우 중요합니다. repo의 위치를 ​​proj1에서 proj1.git로 이동했기 때문에 machine2의 .git / config 파일에서이 위치를 업데이트해야합니다 . 그런 다음 machine2에서 변경 사항을 커밋 할 수 있습니다. 마지막으로, 작업 트리에서 떨어진 맨 손으로 repos를 중앙 위치에 유지하려고합니다 (예 : 'proj1'과 동일한 상위 폴더에 'proj1.git'을 넣지 마십시오). 나는 당신도 똑같이 할 것을 권고하지만, 위의 단계를 가능한 한 단순하게 유지하고 싶었습니다.


매우 상세하고 도움이됩니다. 내 사건은 마지막 사건이었고, 당신의 지시는 매력처럼 작동했습니다.
pojda

나는 경우 3에 있고 약간 다른 것을했다 : mk git-server; mv .git git-server / proj.git 다음 머신 2에 적절한 ssh : // 접두사를 사용하여 git-server / proj.git을 1과 2 (또는 git remote origin ...)로 복제합니다. 나는 일반적으로 GH 또는 다른 HTTP 서버에있는 것과 같은 베어 마스터 사본을 유지하고 두 컴퓨터에서 푸시 / 풀을 계속 사용합니다.
zakmck

18

몇 가지 설정 단계를 통해 다음과 같은 단일 라이너를 사용하여 웹 사이트에 변경 사항을 쉽게 배포 할 수 있습니다

git push production

어느 것이 좋고 간단하며 원격 서버에 로그인하거나 풀 등을 할 필요가 없습니다. 프로덕션 체크 아웃을 작업 지점으로 사용하지 않는 경우 가장 효과적입니다! (OP는 약간 다른 맥락에서 작동하고 있었고 @Robert Gould의 솔루션이 잘 해결했다고 생각합니다.이 솔루션은 원격 서버에 배포하는 데 더 적합합니다.)

먼저 웹 루트 외부의 서버 어딘가에 베어 저장소를 설정해야합니다.

mkdir mywebsite.git
cd mywebsite.git
git init --bare

그런 다음 파일을 만듭니다 hooks/post-receive.

#!/bin/sh
GIT_WORK_TREE=/path/to/webroot/of/mywebsite git checkout -f

그리고 파일을 실행 가능하게 만드십시오.

chmod +x hooks/post-receive

로컬 컴퓨터에서

git remote add production git@myserver.com:mywebsite.git
git push production +master:refs/heads/master

모든 설정! 이제 앞으로 git push production변경 사항을 배포 하는 데 사용할 수 있습니다 !

이 솔루션에 대한 크레딧은 http://sebduggan.com/blog/deploy-your-website-changes-using-git/ 로 이동 하십시오 . 진행 상황에 대한 자세한 설명은 여기를 참조하십시오.


귀하의 제안은 나에게 많은 도움이,하지만 난 사용하지 않은 bare, 내가 따라 함께하고 병합을 hooks(당신이 제안 있음)와 완벽하게 일했다.
Éderson T. Szlachta

11

베어 저장소로만 밀어야합니다. 베어 리포지토리는 체크 아웃 된 분기가없는 리포지토리입니다. 베어 리포지토리 디렉토리로 CD를 넣으면 .git 디렉토리의 내용 만 볼 수 있습니다.


9
비 베어 리포지토리에서 체크 아웃되지 않은 분기로 푸시하는 데 아무런 문제가 없습니다. 이것은 완벽하게 유효한 작업 방법입니다.
CB Bailey

충분히 공평합니다. 그러나 그것은 사용자가하고있는 것이 아닙니다.
RibaldEddie

13
그가 잘못된 저장소를 사용하고 있지 않다는 것은 아닙니다. 그가 체크 아웃 된 지점으로 밀고 있다는 사실입니다. 그가 별도의 베어 리포지토리를 가지고 있거나 원한다는 증거는 없기 때문에 맨발이 아닌 리포지토리에만 푸시해야한다는 담요 진술은 어커에게 모든 옵션을 제공하지 않습니다. 그 중 하나는 그의 즉각적인 문제를 더 쉽게 해결할 수 있습니다.
CB Bailey

10

3 가지 옵션이 있습니다

  1. 당기고 다시 누르십시오.

    git pull; git push
    
  2. 다른 지점으로 밀기 :

    git push origin master:foo
    

    원격으로 병합 (by git또는 pull-request )

    git merge foo
    
  3. 강제로 (당신이 의도적으로 커밋을 변경하지 않는 한 권장되지 않음 rebase) :

    git push origin master -f
    

    경우 여전히 비활성화, 거부 denyCurrentBranch 원격 저장소 :

    git config receive.denyCurrentBranch ignore
    

옵션 2가 나를 위해 일합니다. 원격 git init 로컬 git push origin master : branch 원격 git merge DONE
Jacky Chong

7

실제로, 원격을 체크되지 않은 분기로 설정하면 충분합니다. 다른 지점에서 리모컨을 체크 아웃 한 후 푸시 할 수 있습니다.


7

.git/config대상 프로젝트에서 확인하십시오 .

$ cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[receive]
    denyCurrentBranch = updateInstead

core. bare가 false 인 경우 true로 설정할 수 있습니다.

$ git config core.bare true

그런 다음 원격으로 로컬 푸시하십시오.

git push remote_repo   // suppose the destination repo is remote_repo

remote_repo에서 git 버전을 확인할 수 있습니다.

$ git log -1
commit 0623b1b900ef7331b9184722a5381bbdd2d935ba
Author: aircraft < aircraft_xxx@126.com>
Date:   Thu May 17 21:54:37 2018 +0800

이제 "작업 공간"에서 git을 사용할 수 없습니다 :

$ git status
fatal: This operation must be run in a work tree

bare.bare다시 false로 설정해야합니다 .

$ git config core.bare false

5

Git을 사용하여 Android 휴대 전화와 랩톱의 리포지토리를 동기화하는 것과 동일한 문제가있었습니다. @CharlesBailey가 제안한 것처럼 나를위한 해결책은 푸시 대신 당기는 것이 었습니다.

git push origin master Android 저장소에서 저장소 + 작업 복사의 베어 체크 아웃으로 인해 @ hap497과 동일한 오류 메시지가 표시되어 나에게 실패합니다.

git pull droid master랩톱 저장소 및 작업 복사에서 작동합니다. 물론 이전에와 같은 것을 실행해야합니다 git remote add droid /media/KINGSTON4GB/notes_repo/.


4

구 버전의 Git은 현재 체크 아웃 된 비 저장 저장소의 브랜치를 푸시하는 데 사용되었습니다.

이것은 매우 혼란스러운 일이었습니다. 그래서 그들은 당신이 보는 경고 메시지를 추가했습니다.

첫 번째 리포지토리가 서버의 역할 만하는 경우 다른 답변에서 권장하는대로 베어 리포지토리로 변환하고 완료하십시오.

그러나 두 저장소 사이에 공유 분기가 있어야하는 경우 모두 다음 설정으로 얻을 수 있습니다

Repo1-서버 역할을하며 개발에도 사용됩니다

Repo2-개발 전용입니다

다음과 같이 Repo1을 설정하십시오

작업을 공유 할 지사를 만듭니다.

git branch shared_branch

안전을 위해, 사람들이 개인 브랜치와 함께 뭉치지 않도록하기 위해 shared_branch 이외의 변경은 거부하는 $ (REPO) .git / hooks / update도 작성해야합니다.

repo1/.git/hooks  (GIT_DIR!)$ cat update
#!/bin/sh
refname="$1"
oldrev="$2"
newrev="$3"

if [ "${refname}" != "refs/heads/shared_branch" ]
then
   echo "You can only push changes to shared_branch, you cannot push to ${refname}"
   exit 1
fi

이제 실제 작업을 수행 할 repo1에 로컬 브랜치를 만듭니다.

git checkout -b my_work --track shared_branch
Branch my_work set up to track local branch shared_branch.
Switched to a new branch 'my_work'

(일 git config --global push.default upstream하기 위해 필요할 수 git push있습니다)

이제 당신은 repo2를 만들 수 있습니다

git clone path/to/repo1 repo2 
git checkout shared_branch 

이 시점에서 shared_branch오류 메시지에 대해 걱정하거나 작업 디렉토리가 repo1에서 동기화되지 않도록 할 필요없이 repo1 에서 밀고 당기는 로컬 브랜치에서 작동하도록 repo1 및 repo2 설정이 있습니다 . 어떤 일반적인 워크 플로를 사용해야합니다.


3

정상 원격 저장소를 원할 경우 추가 분기를 작성하여 확인하십시오. 체크 아웃되지 않은 하나의 브랜치로 푸시하고 로컬에서 푸시 한 후 현재 활성화 된 브랜치와 병합하십시오.

예를 들어, 원격 서버에서 :

git branch dev
git checkout dev

로컬 설정에서 :

git push 

원격 서버에서 :

git merge dev

2

다음은 테스트 방법 중 하나입니다. bare 서버 작동 .

워크 스테이션과 라이브 사이트가 호스팅 된 서버가 있고이 사이트를 수시로 업데이트하려고한다고 가정합니다 (두 개발자가 작업을 중개인을 통해주고받는 상황에도 적용됨).

초기화

로컬 컴퓨터에 디렉토리 cd를 작성한 후 다음 명령을 실행하십시오.

# initialization
git init --bare server/.git
git clone server content
git clone server local
  1. 먼저 베어를 만듭니다 server 디렉토리 하십시오 (끝의 .git에 유의하십시오). 이 디렉토리는 저장소 파일의 컨테이너 역할 만합니다.
  2. 그런 다음 서버 저장소를 새로 작성된 서버 저장소로 복제하십시오 content 디렉토리에 . 서버 소프트웨어가 제공하는 라이브 / 프로덕션 디렉토리입니다.
  3. 처음 두 디렉토리는 서버에 있으며 세 번째 디렉토리는 워크 스테이션의 로컬 디렉토리입니다.

워크 플로우

이제 기본 워크 플로우는 다음과 같습니다.

  1. local디렉토리를 입력하고 파일을 작성한 후 커밋하십시오. 마지막으로 서버로 푸시하십시오.

    # create crazy stuff
    git commit -av
    git push origin master
    
  2. 이제 content디렉토리를 입력하고 서버의 내용을 업데이트하십시오 :

    git pull
    
  3. 1-2를 반복하십시오. 여기에 content너무 서버에 밀어 수있는 또 다른 개발자 수 있으며, local당신은 그에게서로 당겨 수 있습니다.


2

이것을 사용하여 원격 업스트림 브랜치로 푸시하면이 문제가 해결되었습니다.

git push <remote> master:origin/master

리모컨은 업스트림 저장소에 액세스 할 수 없었으므로이 변경 사항은 해당 리모컨으로 최신 변경 사항을 가져 오는 좋은 방법이었습니다


1
보다 일반적으로 (이것은 명령의 순 효과이므로)를 사용하십시오 git push <remote> master:newbranch. 새로운 브랜치를 원격으로 푸시 한 다음 병합 할 수 있습니다. 이렇게하면 오류 메시지에 언급 된 불일치 문제를 피할 수 있습니다.
Clay

1

git --init기존 Bare Repository에서 다시 실행 해야 .git했으며 Bare Repository Tree 내부 에 디렉토리를 만들었 git status습니다. 나는 그것을 삭제하고 모든 것이 다시 잘되었다 :)

(이러한 모든 답변은 훌륭하지만 제 경우에는 설명대로 완전히 다른 것입니다.)


1

나는이 질문을 보는 대부분의 사람들이 처음 두 가지 큰 답변에서 멈출 것이라고 확신하지만 여전히 내 솔루션을 제공하고 싶습니다.

설명 된 오류가 발생했을 때 Eclipse + EGit 웹 프로젝트 설정이있었습니다. 내가 도움이 된 것은 단순히 문제를 해결하는 것처럼 보이는 GitHub 앱을 사용하는 것이 었습니다. EGit은 항상 푸시를 거부하지만 GitHub 데스크톱 앱은 어깨를 으 rug하고 변경 사항을 푸시합니다. 아마도 다중 로그인 상황을보다 우아하게 처리 할 수 ​​있습니다.


1

다른 사람들에게 유용 할 수있는 기사 는 5 분 안에 Git입니다. .

나는 한 엑스 코드 나는까지 밀어 싶다고 힘내 버전 제어에서 프로젝트를 가상 분산 이더넷 내가 DC에있는 (VDE). VDE는 Centos를 실행합니다 5를 합니다.

Git에 대해 읽은 기사 중 베어 리포지토리에 대해서는 언급하지 않았습니다. SVN 에서 쉽게 나올 수 있다고 생각되는 것을 시도 할 때까지 모두 간단하게 들렸습니다. 배경 .

여기에서 원격 저장소를 만드는 제안이 효과적이었습니다. 내 요구 사항에 대한 더 나은 Xcode 프로젝트를 복제하는 것이 었습니다.projectname.git 하여 원격 서버에 복사하는 . 마법처럼 작용합니다. 다음 단계는 커밋에 대한 오류없이 Xcode가 푸시하도록하지만 지금은 터미널에서 Xcode를 수행하는 것이 좋습니다.

그래서:

cd /tmp (or another other directory on your system)<br/>
git clone --bare /xcode-project-directory projectname.git<br/>
scp -r projectname.git sshusername@remotehost.com:repos/<br/>

Xcode를 커밋 한 후 Xcode 프로젝트에서 변경 사항을 푸시하려면

cd /xcode-project-directory<br/>
git push sshusername@remotehost.com:repos/projectname.git<br/>

나는 위의 작업을보다 부드럽고 더 정교한 방법이 있다고 확신하지만 최소한 이것이 효과가 있습니다. /xcode-project-directoryxcode 프로젝트가 저장된 디렉토리입니다. 아마도 모든 것이 명확 합니다./Users/Your_Name/Documents/Project_Name . projectname은 말 그대로 프로젝트의 이름이지만 호출하는 것은 무엇이든 가능합니다. Git은 상관하지 않습니다.

scp를 사용하려면 SSH 가 허용 된 원격 서버에 사용자 계정이 있어야합니다 액세스 . 자신의 서버를 운영하는 사람이라면 누구나 이것을 가질 수 있습니다. 공유 호스팅 등을 사용하는 경우 운이 좋지 않을 수 있습니다.

remotehost.com원격 호스트의 이름입니다. IP 주소를 쉽게 사용할 수 있습니다. 더 명확하게하기 위해 SSH 키가있는 원격 호스트에서 Gitosis 를 사용 하고 있으므로 푸시 할 때 암호를 묻는 메시지가 표시되지 않습니다. Git 리포지토리 호스팅, 쉬운 (그리고 안전한) 방법 기사에서는 모든 것을 설정하는 방법을 설명합니다.


1

이를 수행하는 가장 좋은 방법은 다음과 같습니다.

mkdir ..../remote
cd ..../remote
git clone --bare .../currentrepo/

그러면 리포지토리가 복제되지만에 작업 복사본이 만들어지지 않습니다 .../remote. 리모컨을 보면, 하나의 디렉토리가 생성 된 것을 볼 수 있습니다.currentrepo.git 되어 있으며 원하는 일 것입니다.

그런 다음 로컬 Git 저장소에서 :

git remote add remoterepo ..../remote/currentrepo.git

변경 한 후에는 다음을 수행 할 수 있습니다.

git push remoterepo master

1

방금 Heroku 의 배포 git 저장소 에서이 문제에 부딪 쳤습니다 .

왜 Heroku에 비 베어 리포지토리가 있는지 모르지만 해결 방법으로 원격 리포지토리를 재설정하고 다시 업로드 할 수있었습니다.

협업을 위해 Heroku의 저장소 사본을 유일한 git 저장소로 사용해서는 안되지만, 명확하게 말할 것입니다. 헤 로쿠. 재설정하면 리포지토리 내용이 삭제됩니다.

재설정하려면

  1. Heroku 툴 벨트 설치아직 명령 행 클라이언트가 포함 된 .
  2. heroku-repo 플러그인을 아직 설치 하지 않았다면 설치하십시오 .

    heroku plugins:install https://github.com/heroku/heroku-repo.git
    
  3. 재설정을 수행하면 저장소가 삭제되고 비어있는 새 저장소가 작성됩니다.

    heroku repo:reset
    
  4. 평상시처럼 Heroku 리모컨으로 밀어 넣으십시오. 모든 것을 다시 업로드합니다.


이것이 작동하려면 Heroku repo 도구를 설치해야 할 수도 있습니다. 수행heroku plugins:install https://github.com/heroku/heroku-repo.git
노아

1

빈 저장소를 만든 후에는 원격 서버에서 구성 파일을 변경해야합니다.

root@development:/home/git/repository/my-project# cat config 

거기에서 볼 수 있습니다

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true

이것을 false로 true로 만들고 logallrefupdates = true를 제거했습니다 (사용의 확실하지 않습니다!)

[core]
repositoryformatversion = 0
filemode = true
bare = true

다음을 테스트 할 수 있습니다

$ git remote show origin
* remote origin
Fetch URL: my-portal@development:/home/XYZ/repository/XYZ
Push  URL: my-portal@development:/home/XYZ/repository/XYZ
HEAD branch: (unknown)

PUSH 할 수없는 경우이 HEAD 분기 : (알 수 없음)이 표시됩니다. 따라서 HEAD 분기를 모르는 경우 bare를 true로 변경해야하며 푸시 성공 후

git remote show origin

그리고 당신은 볼 것이다

 HEAD branch: master

0

나를 위해 일하는 해결책은 다음과 같습니다.

원격 :

git checkout -b some_tmp_name

현지에서 :

git push

원격 :

git checkout master
git branch -d some_tmp_name

그러나 이것은 실제 해결 방법이 아닙니다.


중앙 리포지토리가없는 경우 유효한 솔루션입니다.
Rick

0

누군가가 유용하다고 생각하는 경우를 대비하여. 나를 위해 그것은 자식 서버 권한 문제였습니다. 시작에서 프로젝트를 확인하고 간단한 파일을 푸시 한 다음 "푸시 거부 : 원점으로 푸시 / 마스터가 거부되었습니다"라는 메시지가 나타납니다.


-1

Git을 사용하면 두 개의 일반 (맨손이 아닌) 리포지토리가 파일을 직접 앞뒤로 밀거나 당길 수 없습니다. 중간 베어 저장소가 있어야합니다. 분명히 아이를 낳은 결혼 한 부부와 비슷하며 부부는 이혼하고 있습니다. 부모는 서로 대화하지 않지만 아이를 통해 의사 소통합니다.

따라서 하나의 리포지토리가 있고이 리포지토리를 베어 리포지토리에 복제 한 다음 세 번째 리포지토리에 복제합니다. 첫 번째와 세 번째는 두 번째 저장소 인 베어 저장소를 통해 정보를 교환 할 수 있습니다. 병합 충돌 등을 일으킬 수 있으므로 누군가가 동의하지 않고 저장소에서 물건을 체크인 할 수 있기를 원하지 않기 때문에 이것이 의미가 있다고 생각합니다.

예를 들면 다음과 같습니다.

PC에서 ~ / 작업 공간

git init
echo "line 1" > afile.txt
git add .
git commit -m ‘initial import’
git clone --bare . ../remote-repository.git
git remote add origin ../remote-repository.git
git push --set-upstream origin master

랩톱, ~ / 작업 공간 (git init 등을 수행하지 마십시오)

git clone //LJZ-DELLPC/remote-repository.git/ .

// 다양한 커밋을 만들고 푸시합니다.

echo "line 2" > afile.txt
git add afile.txt
git commit -m 'added line 2'
git push    

그런 다음 ~ / 작업 공간에서 PC로 돌아갑니다.

git pull

// 다양한 커밋을 만들고 푸시합니다.

git push

노트북 git pull

기타 등등..

다음은 명령 창에서 직접 복사 한 하나의 컴퓨터에 대한 구체적인 예입니다.

lylez@LJZ-DELLPC ~
$ cd gitdir
/home/lylez/gitdir

lylez@LJZ-DELLPC ~/gitdir
$ ls

lylez@LJZ-DELLPC ~/gitdir
$ mkdir repo1

lylez@LJZ-DELLPC ~/gitdir
$ cd repo1
/home/lylez/gitdir/repo1

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git init
Initialized empty Git repository in /home/lylez/gitdir/repo1/.git/

lylez@LJZ-DELLPC ~/gitdir/repo1
$ echo "line 1" > afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git add afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git commit -m 'initial import'
[master (root-commit) f407e12] initial import
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git clone --bar . ../repo1-bare-clone
Cloning into bare repository '../repo1-bare-clone'...
done.

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git remote add origin ../repo1-bare-clone

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git push --set-upstream origin master
Branch master set up to track remote branch master from origin.
Everything up-to-date

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cd ..

lylez@LJZ-DELLPC ~/gitdir
$ ls
repo1  repo1-bare-clone

lylez@LJZ-DELLPC ~/gitdir
$ mkdir repo1-remote

lylez@LJZ-DELLPC ~/gitdir
$ cd repo1-remote
/home/lylez/gitdir/repo1-remote

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git clone ../repo1-bare-clone .
Cloning into '.'...
done.

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ ls
afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cat afile.txt
line 1

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ echo "line 2" >> afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git add afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git commit -m 'added line 2'
[master 5ad31e0] added line 2
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 260 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/lylez/gitdir/repo1-remote/../repo1-bare-clone
   f407e12..5ad31e0  master -> master

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cd ../repo1

lylez@LJZ-DELLPC ~/gitdir/repo1
$ ls
afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cat afile.txt
line 1

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git pull
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../repo1-bare-clone
   f407e12..5ad31e0  master     -> origin/master
Updating f407e12..5ad31e0
Fast-forward
 afile.txt | 1 +
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cat afile.txt
line 1
line 2

lylez@LJZ-DELLPC ~/gitdir/repo1
$ echo "line 3" >> afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git add afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git commit -m 'added line 3'
[master 3fa569e] added line 3
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 265 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../repo1-bare-clone
   5ad31e0..3fa569e  master -> master

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cd ../repo1-remote/

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ ls
afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cat afile.txt
line 1
line 2

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git pull
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/lylez/gitdir/repo1-remote/../repo1-bare-clone
   5ad31e0..3fa569e  master     -> origin/master
Updating 5ad31e0..3fa569e
Fast-forward
 afile.txt | 1 +
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cat afile.txt
line 1
line 2
line 3

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git --version
git version 2.1.1

lylez@LJZ-DELLPC ~/gitdir/repo1-remote

작동하는 예와 그 이유에 대한 설명입니다. 귀하의 의견을 제외하고는 여기에 잘못된 정보가 없습니다.
Lyle Z

1
"Git을 사용하면 두 개의 일반 (베어 리가 아닌) 리포지토리가 파일을 직접 앞뒤로 밀거나 당길 수 없습니다."
Andrew C

좋아, 공격 대신 구체적인 예를 게시하십시오.
Lyle Z

아니면 당신은 구글 그것을 할 수 있습니까? stackoverflow.com/questions/1764380/…
Andrew C

쓰레드의 첫 번째 응답은 "..."으로 시작하지만 "git ready 및 공식 git wiki에 따르면 맨손으로 리포지토리로 푸시해야합니다." 다음 응답은 "마스터-> 마스터를 푸시하려고하면 명령은 그냥 : git push origin"이며 단순히 작동하지 않으며 그 영향에 대한 치열한 게시물이 있습니다. 마지막 응답은 "서버에 베어 리포지토리와 로컬 작업 (비 베어) 리포지토리를 제안하는 것"으로 시작합니다. 이것이 바로 내가 제안한 것입니다.
Lyle Z

-3

내 솔루션 (사용 중)

  1. 원격 서버에서 "마스터"체크 아웃
  2. "dev"브랜치에서 로컬로 작업
  3. 변경 사항을 원격 개발자에게 푸시
  4. 원격에서 마스터로 개발자 병합

빙고

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.