자식으로 한 번에 여러 가지를 가져 오는 방법은 무엇입니까?


13

리포지토리에는 "master"와 "develop"라는 여러 지점이 있으며 원격 지점 "origin / master"및 "origin / develop"를 추적하도록 설정되어 있습니다.

마스터와 개발을 한 번에 병합 (빨리 감기)하도록 지정할 수 있습니까?

내가 git pull지금 할 때 나는 다음과 같은 것을 얻는다 :

remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
   5386563..902fb45  develop    -> origin/develop
   d637d67..ba81fb2  master     -> origin/master
Updating 5386563..902fb45
Fast-forward

모든 원격 브랜치가 페치되지만 현재 사용중인 브랜치 만 해당 원격 브랜치와 병합됩니다.

그래서 나는해야합니다 git checkout master...

Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.

... 그리고 git pull다시 개발 한 다음 다시 개발로 전환하여 원하는 결과를 얻습니다.

이 단계를 수행하는 별칭 / 스크립트를 만들 수 있다는 것을 알고 있습니다. 그러나 오류가 발생하기 쉽고 효율적이지 않기 때문에 가능하면 피하고 싶습니다 .
편집 : 좋아, 그것을 바꾸어 보자. 내 목표는 git의 스크립트 / 별칭 사용자 정의에 낙담하거나 찌푸 리지 않는 것이 었습니다. 존재하는 경우 내장 솔루션을 선호합니다. :)


나는 시도 git pull origin refs/heads/develop:refs/remotes/origin/develop refs/heads/master:refs/remotes/origin/master했지만 원격 마스터를 개발에 통합시켰다.
Superole

1
왜 오류가 발생하기 쉽거나 비효율적입니까? 힘내는 이와 같이 사용자 정의됩니다. BTW, 피할 각 지점을 확인하는 데에, 당신은 당신을 분할 할 수 있습니다 pullfetcha로 다음 merge각 지점에.
jjlin

@jjlin 잘하면 효율성에 도움이 될 수있는 각 지점을 확인하지 않고 할 수 있습니다. 잘못 될 수있는 것의 매트릭스와 스크립트의 나머지 부분에 미칠 수있는 영향이 다소 복잡하기 때문에 오류가 발생하기 쉽습니다. 나는 그것을 안전하게 만드는 것이 불가능하다고 말하지는 않지만 트레이드 오프가 될 것입니다. 그래서 나는 그것이 존재한다면 내장 솔루션을 선호합니다 :)
Superole

답변:


11

git fetchrefspec과 함께 사용하는 별칭을 설정하여 하나의 명령으로 분기를 빨리 병합 할 수 있습니다. 이것을 사용자 .gitconfig파일 에서 별명으로 설정 하십시오.

[alias]
    sync = "!sh -c 'git checkout --quiet --detach HEAD && \
                    git fetch origin master:master develop:develop ; \
                    git checkout --quiet -'"

사용법 : git sync.

작동하는 이유는 다음과 같습니다.

  1. git checkout --quiet HEAD현재 커밋을 직접 확인하여 분리 된 헤드 상태로 만듭니다. 이렇게하면 master또는 에있는 경우 develop작업 포인터를 분기 포인터에서 분리하여 이동할 수 있습니다 (Git은 작업 복사본이 체크 아웃되어있는 동안 분기 참조를 이동할 수 없습니다).

  2. git fetch origin master:master develop:developrefspecs를 사용 하여 로컬 리포지토리 fetchmasterdevelop분기 를 빨리 감습니다 . 이 구문은 기본적으로 Git에게 "여기서 양식 <source>:<destination>의 참조 사양이 <destination>있으며, 같은 지점으로 가져 가서 빨리 감습니다 <source>"라고 말합니다. 따라서 별칭의 소스는의 분기 origin인 반면 대상은 해당 분기의 로컬 리포지토리 버전입니다.

  3. 마지막으로, git checkout --quiet -이전 명령에서 실패가 있었는지 여부에 관계없이 마지막에 있던 브랜치를 확인합니다. 따라서 당신이 master달릴 때 켜져 git sync있었고 모든 것이 성공하면 분리 된 헤드 상태를 떠나서 새로 업데이트 된을 확인하십시오 master.

git에 대한 내 답변을 참조하십시오 : 체크 아웃하지 않고 로컬 브랜치를 업데이트합니까? .


나는 분리 된 마술을 이해하지 못한다. 개발이 체크 아웃 될 때 왜 마스터 포인터가 움직일 수 없습니까? 어쨌든 나는 이것을 시도했지만 지금은 "당신의 지점은 1 커밋으로 '원점 / 개발'보다 앞서 있습니다."
Superole

... 다음에 뽑을 때 해결되는
Superole

@Superole 별명을 사용할 때 어느 분기 보다 앞서 origin/develop있습니까? 그것이 현지 develop지사 라면 이해가되지 않습니다 . 또한 체크 아웃 된 경우 포인터를 master 이동할 수 있습니다develop . 포인트가 master체크 아웃 된 경우 master작업 복사본에 영향을 줄 수 있으므로 빨리 감을 수 없으므로 작업 복사본을 분리해야합니다. 를 사용하여 처음부터 git checkout head. 나는 그것이 "바위에 서있다"고 묘사 한 또 다른 대답을 보았습니다. 바위를 옮겨야 움직일 수 있습니다.
40XUserNotFound

그것은 실제로 나의 지역 발전이었다. 그리고이 페치는 추적 분기를 업데이트하지 않기 때문입니다. 내가 이해 한대로; 풀은 원점 / 개발로 가져온 다음 개발에 병합합니다.
Superole

이 답변이 발생하는 것이 매우 중요합니다 fatal: bad config line xx in file xxx. 세미콜론으로 인해 발생합니다. 이 문제를 피하려면 전체 명령을 큰 따옴표로 묶어야합니다.
William Leung

1

git-up을 설치하십시오 . git-up리포지토리의 모든 로컬 분기를 가져올 명령 을 제공 합니다.


단! 나는 그것을 확인합니다.
Superole

2
heh : P Windows 지원에 대한 진술 은 없을 것으로 예상됩니다. 그리고 엄격한 증거는 아직이 사용자를 대신 해커 뉴스에 당신의 자식 설정, 데이터 삭제 또는 사후 어리석은 농담과 엉망 확실히하지 않습니다 것을 공식화해야한다. , 루비의 필요성과 함께 저를 몰아 냈습니다. 나는 개념을 좋아한다.
Superole

모든 단일 방법에는 일부 타사 도구 가 필요하지만 방법 이 전혀 기쁘다 . 이것과 일부 쉘 명령 "레시피"또는 특정 (플랫폼 특정) 쉘을 사용하는 별명을 가진 것들과 같은 것들.
0xC0000022L

0

git이 여러 분기로 가져 오는 기본 옵션이없는 것 같습니다. 버전 1.8.0 이상은 아닙니다. 하지만 @ 컵 케이크의 대답은 그 부근에 자리 잡고 있습니다.

그러나 @jjlin의 의견 은 적어도 두 번 당길 필요가 없다는 것을 깨달았습니다.

따라서 약간 더 효율적인 순서는 다음과 같습니다.

git pull
git checkout master
git merge origin/master
git checkout -

필자는 필연적으로 별명을 만들었지 만 별명을 없애기로 결정하고 다른 지점을 빨리 감기에 집중했습니다.

[alias]
ffwd = "!_() { git checkout $1 && git merge --ff-only origin/$1 && git checkout -; }; _"

물론, 테스트하지 않고이 별칭은 ff'able 분기의 유효한 이름을 첫 번째 인수로 제공한다고 가정하고 그렇지 않으면 정의되지 않은 동작을합니다. 또한 브랜치가 두 개 이상인 유스 케이스에는 최적이 아니지만 지금 필요한 것을 얻을 수 있습니다.

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