GitHub 분기 저장소를 어떻게 업데이트합니까?


3603

나는 최근에 프로젝트를 포크하고 몇 가지 수정 사항을 적용했습니다. 그런 다음 풀 요청을 작성하여 수락했습니다.

며칠 후 다른 기고자가 다른 변경을가했습니다. 그래서 내 포크에는 그 변화가 없습니다.

포크로 바꾸려면 어떻게해야합니까? 기여할 추가 변경 사항이있을 때 포크를 삭제하고 다시 작성해야합니까? 아니면 업데이트 버튼이 있습니까?


120
이것은 github UI에서도 가능합니다. [이 다른 포스터에] [1]의 크레딧을주고 싶습니다. [1] : stackoverflow.com/a/21131381/728141
Mike Schroll

2
이에 대한 또 다른 좋은 블로그 게시물 - GitHub의 포크를 유지 업데이트
Arup에 Rakshit에게

3
이것을 Github의 도움말 기사에서 찾았습니다 : help.github.com/articles/syncing-a-fork
Pranav

2
이것은 stackoverflow.com/questions/3903817/… 의 복제본 입니까?
David Cary

다음은 두 개의 github 계정을 사용하여이 작업을 수행하는 비디오 데모입니다. youtube.com/watch?v=kpE0gTX4ycE
lifebalance

답변:


3979

분기 저장소의 로컬 클론에서 원래 GitHub 저장소를 "원격"으로 추가 할 수 있습니다. ( "Remotes"는 리포지토리의 URL에 대한 별명과 같습니다 origin. 예를 들어 하나입니다.) 그런 다음 해당 업스트림 리포지토리에서 모든 분기를 가져오고 업스트림 버전 작업을 계속하기 위해 작업을 리베이스 할 수 있습니다. 다음과 같은 명령 측면에서 :

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

마스터 브랜치의 히스토리를 다시 작성하지 않으려면 (예 : 다른 사람들이이를 복제했을 수 있음) 마지막 명령을로 바꾸어야합니다 git merge upstream/master. 그러나 최대한 깔끔한 추가 풀 요청을 만들려면 리베이스하는 것이 좋습니다.


지점을 기반으로 한 경우 upstream/masterGitHub의 자체 포크 저장소로 푸시하기 위해 푸시를 강제해야 할 수도 있습니다. 당신은 그것을 할 것입니다 :

git push -f origin master

-f리베이스 한 후 처음으로 만 사용해야합니다 .


94
포크는 github에만 존재하고 github에는 웹 인터페이스를 통해 병합을 수행하는 도구가 없으므로 업스트림 병합을 로컬로 수행하고 변경 사항을 다시 포크로 푸시하는 것이 정답입니다.
Tim Keating

29
다음은 github 작업에 대한 훌륭한 튜토리얼입니다. gun.io/blog/how-to-github-fork-branch-and-pull-request
Tim Keating

50
클린 상태로 시작하기 위해 자신의 마스터 브랜치를 리베이스하지 않고 별도의 브랜치에서 작업하여 풀 요청을해야한다는 점을 참고하십시오. 이렇게하면 향후 병합에 대해 마스터를 깨끗하게 유지하고 -f버전을 복제했을 수있는 모든 사람을 망쳐 놓은 기록을 다시 작성하지 않아도됩니다 .
Mateusz Kowalczyk 2016 년

11
rebase 명령 대신 다음을 사용했습니다. git merge --no-ff upstream/master이렇게하면 커밋이 더 이상 최상위에 있지 않습니다.
Steckdoserich

51
또 다른 힘내 실패. 이 도구가 분산 협업을 지원해야한다면 왜 기본 워크 플로우를 수행하기가 어렵습니까? 4 백만의 사람들과 2200 개의 공감 율은 도구가 실패했음을 의미합니다. "원격"당신이로 원래의 GitHub의 저장소를 추가 할 수 있습니다 " ? -?는 포크 동안 수행되지 왜 왜 하나에도 이렇게 할 필요가 무엇 때문에이 도구에 대한 고장?
jww

739

2014 년 5 월부터 GitHub에서 직접 포크를 업데이트 할 수 있습니다. 이것은 여전히 ​​2017 년 9 월부터 작동 하지만 커밋 기록이 더러워집니다.

  1. GitHub에서 포크를 엽니 다.
  2. 를 클릭하십시오 Pull Requests.
  3. 를 클릭하십시오 New Pull Request. 기본적으로 GitHub는 원본을 포크와 비교하므로 변경하지 않은 경우 비교할 내용이 없습니다.
  4. switching the base해당 링크가 표시되면 클릭 하십시오. 그렇지 않으면 base fork드롭 다운을 수동으로 포크와 head fork업스트림 으로 설정하십시오 . 이제 GitHub는 포크와 원본을 비교할 것이며 모든 최신 변경 사항을 볼 수 있습니다. 여기에 이미지 설명을 입력하십시오
  5. Create pull request풀 요청에 예측 가능한 이름을 지정하십시오 (예 :) Update from original.
  6. 로 스크롤 Merge pull request하지만 아직 아무것도 클릭하지 마십시오.

이제 세 가지 옵션이 있지만 각 옵션은 명확하지 않은 커밋 기록으로 이어집니다.

  1. 기본적으로 못생긴 병합 커밋이 만들어집니다.
  2. 드롭 다운을 클릭하고 "스쿼시 및 병합"을 선택하면 모든 중재 커밋이 하나로 스쿼시됩니다. 이것은 대부분 원하지 않는 것입니다.
  3. 를 클릭 Rebase and merge하면 모든 커밋이 "함께"이루어지고 원래 PR이 PR에 연결되고 GitHub가 표시됩니다 This branch is X commits ahead, Y commits behind <original fork>.

따라서 GitHub 웹 UI를 사용하여 리포를 업스트림으로 업데이트 할 수 있지만 그렇게하면 커밋 기록이 완전히 바뀌게됩니다. 스틱 명령 행 대신 - 그것은 간단합니다.


19
이것은 한 번 훌륭하게 작동했습니다. 이 프로세스가 두 번째로 같은 방식으로 작동하지 않았습니다. "베이스 전환"링크가 표시되지 않았습니다. 그리고 "Click to create pull request"를 누르면 SOURCE 저장소에 PR이 생성됩니다. 내가 원하는 것이 아닙니다.
javadba

29
"베이스 전환"링크가 더 이상 존재하지 않지만 여전히 작동합니다 (Marchi 2015). "베이스"드롭 다운을 변경하여 포크를 가리 키도록 한 다음 "레 포지션 비교"메시지가 표시되어 원하는 위치로 이동합니다.
mluisbrown

8
2015 년 4 월. 작품. 감사. "베이스로 전환"을 받았습니다. 그러나 6 단계는 "풀 요청 작성"-> 주석 입력-> "풀 요청 작성"이었습니다. 원본보다 1 커밋보다 먼저 끝납니다.
cartland

5
@cartland (또는 다른 사람들)-예, "이 지점은 1 커밋보다 앞서 있습니다 ..."라고 걱정해야합니까? 그 메시지를 없앨 수 있습니까?
RenniePet

11
단순히 업데이트 또는 동기화 버튼으로 더 좋을 것입니다!
변압기

456

포크 동기화에 대한 GitHub 공식 문서는 다음과 같습니다 .

포크 동기화

설정

동기화하기 전에 업스트림 저장소를 가리키는 리모트를 추가해야합니다. 원래 분기했을 때이 작업을 수행했을 수 있습니다.

팁 : 포크를 동기화하면 리포지토리의 로컬 복사본 만 업데이트됩니다. GitHub에서 리포지토리를 업데이트하지 않습니다.

$ git remote -v
# List the current remotes
origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)

$ git remote add upstream https://github.com/otheruser/repo.git
# Set a new remote

$ git remote -v
# Verify new remote
origin    https://github.com/user/repo.git (fetch)
origin    https://github.com/user/repo.git (push)
upstream  https://github.com/otheruser/repo.git (fetch)
upstream  https://github.com/otheruser/repo.git (push)

동기화

리포지토리를 업스트림과 동기화하는 데 필요한 두 단계가 있습니다. 먼저 원격에서 가져와야하고 원하는 분기를 로컬 분기로 병합해야합니다.

가져 오는 중

원격 저장소에서 가져 오면 브랜치와 해당 커밋이 발생합니다. 이들은 특수 저장소 아래의 로컬 저장소에 저장됩니다.

$ git fetch upstream
# Grab the upstream remote's branches
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
 * [new branch]      master     -> upstream/master

이제 업스트림의 마스터 브랜치가 업스트림 / 마스터의 로컬 브랜치에 저장되었습니다.

$ git branch -va
# List all local and remote-tracking branches
* master                  a422352 My local commit
  remotes/origin/HEAD     -> origin/master
  remotes/origin/master   a422352 My local commit
  remotes/upstream/master 5fdff0f Some upstream commit

합병

업스트림 리포지토리를 가져 왔으므로 변경 사항을 로컬 지점에 병합하려고합니다. 이렇게하면 로컬 변경 사항을 잃지 않고 해당 지점이 업스트림과 동기화됩니다.

$ git checkout master
# Check out our local master branch
Switched to branch 'master'

$ git merge upstream/master
# Merge upstream's master into our own
Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

로컬 브랜치에 고유 한 커밋이 없으면 git은 대신 "빨리 감기"를 수행합니다.

$ git merge upstream/master
Updating 34e91da..16c56ad
Fast-forward
 README.md                 |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

팁 : GitHub에서 리포지토리를 업데이트하려면 여기 지침을 따르십시오


1
이것은 로컬 포크를 업데이트하지만 Github.com의 포크는 여전히 "43 commits behind"라고 말합니다. lobzik의 기술을 사용하여 마스터 변경 사항을 Github.com 포크에 병합하기위한 풀 요청을 만들어야했습니다.
Michael McGinnis

11
@MichaelMcGinnis 로컬로 병합 한 후에는 변경 사항을 github로 푸시해야합니다. git push origin master
jumpnett

1
로 밀어 스마트 될 수있다 --follow-tags: stackoverflow.com/a/26438076/667847
케니

1
모든 지점에 대해 별도의 작업을 수행 git merge upstream/master한 다음 지점을 개발하고 수행해야 할 사항을 확인하십시오git merge upstream/develop
Shobi

stackoverflow.com/a/14074925/470749Permission denied (publickey). fatal: Could not read from remote repository.Facebook의 Github 계정 업스트림에서 가져 오려고 할 때 유용했기 때문에 도움이되었습니다 .
Ryan

98

많은 답변 이 부모 저장소 보다 한 번 커밋을 포크로 이동시킵니다 . 이 답변은 발견 단계 요약 여기같은 당신의 포크를 이동 부모 커밋을 .

  1. 디렉토리를 로컬 저장소로 변경하십시오.

    • 그렇지 않은 경우 마스터 브랜치로 전환 git checkout master
  2. 부모를 원격 저장소로 추가하십시오. git remote add upstream <repo-location>

  3. 발행물 git fetch upstream
  4. 발행물 git rebase upstream/master

    • 이 단계에서는 다음을 입력하여 병합 할 내용을 커밋했는지 확인합니다. git status
  5. 발행물 git push origin master

이 명령에 대한 자세한 정보는 3 단계를 참조하십시오 .


13
@MT : 그러나이 명령들을 어디에 입력합니까? 내가 이해하는 것처럼 질문의 요지는 개인 GitHub 포크를 기본 프로젝트와 다시 동기화하는 방법 이며 GitHub 에서이 작업을 모두 수행합니다 . 즉, 로컬 저장소 없이 원격 포크 어떻게 업데이트 할 수 있습니까?
John Y

4
@JohnY GitHub를 사용하면 항상 추가 커밋이 생성됩니다. 추가 커밋을 피하려면 로컬 리포지토리의 셸에서이 모든 작업을 수행해야합니다.
Jonathan Cross

48

서문 : 포크는 "원본"이고 포크 한 저장소는 "업스트림"입니다.

다음과 같은 명령으로 이미 포크를 컴퓨터에 복제했다고 가정 해 봅시다.

git clone git@github.com:your_name/project_name.git
cd project_name

그것이 주어진 경우 다음 순서로 계속 진행해야합니다.

  1. "업스트림"을 복제 된 저장소 ( "origin")에 추가하십시오.

    git remote add upstream git@github.com:original_author/project_name.git
    
  2. "업스트림"에서 커밋 (및 분기)을 가져옵니다.

    git fetch upstream
    
  3. 포크의 "마스터"분기 ( "origin")로 전환하십시오.

    git checkout master
    
  4. "마스터"지점의 변경 사항을 보관하십시오 :

    git stash
    
  5. "업스트림"의 "마스터"브랜치에서 "원본"의 "마스터"브랜치로 변경 사항을 병합하십시오.

    git merge upstream/master
    
  6. 병합 충돌이있는 경우 해결하고 병합을 커밋

    git commit -am "Merged from upstream"
    
  7. 포크로 변경 사항을 밀어

    git push
    
  8. 숨겨둔 변경 사항을 다시 가져옵니다 (있는 경우).

    git stash pop
    
  9. 끝났습니다! 축하합니다!

GitHub는이 주제에 대한 지침도 제공합니다 . 포크 동기화


1
부분적으로 도움이 : git remote add upstream git@github.com:original_author/project_name.git에 대한 별칭 git remote add upstream https://github.com/original_author/project_name.git입니까?
Wolf

2
Wolf , 지금까지 이것을 알고 있지만 후손을 위해 ... ssh의 형식입니다. help.github.com/articles/configuring-a-remote-for-a-fork
Brad Ellis

2
대단히 감사합니다. git stash그리고 git stash pop일부 매우 도움이
सत्यमेव जयते

이것은 효과가 있었다. git merge upstream / master 후에 git add -A를 실행 한 다음 git commit -m "message"를 실행해야하는 병합되지 않은 경로로 인해 자동 병합이 실패했습니다.
highcenbug

47

나와 같이 master에 직접 아무것도 커밋하지 않으면 실제로 다음을 수행 할 수 있습니다.

포크의 로컬 클론에서 업스트림 리모컨을 만듭니다. 한 번만 수행하면됩니다.

git remote add upstream https://github.com/whoever/whatever.git

그런 다음 업스트림 리포지토리 마스터 브랜치를 따라 잡을 때마다 다음을 수행해야합니다.

git checkout master
git pull upstream master

마스터 자신에게 아무것도 약속하지 않았다고 가정하면 이미 완료해야합니다. 이제 로컬 마스터를 오리진 원격 GitHub 포크로 푸시 할 수 있습니다. 또한 최신 로컬 마스터에 개발 브랜치를 리베이스 할 수도 있습니다.

초기 업스트림 설정 및 마스터 체크 아웃을 지나면 다음 명령을 실행하여 마스터를 업스트림과 동기화하기 만하면됩니다. git pull upstream master .


45

2013 년 11 월부터 GitHub에서 비공식 기능 요청을 통해 로컬 포크를 업스트림과 동기화 할 수있는 매우 간단하고 직관적 인 방법을 추가하도록 요청했습니다.

https://github.com/isaacs/github/issues/121

참고 : 기능 요청은 비공식적이므로 support@github.com구현할 기능에 대한 지원을 추가하기 위해 연락 하는 것이 좋습니다 . 위의 비공식 기능 요청은이 구현에 대한 관심의 증거로 사용될 수 있습니다.


23

이 답변 날짜 현재 GitHub는 웹 인터페이스에서이 기능을 사용 하지 않습니다 ( 또는 더 이상 말하지 않겠습니까? ). 그러나 이에 support@github.com대한 투표를 추가 하도록 요청할 수 있습니다.

한편, GitHub 사용자 bardiharborow는 https://upriver.github.io/ 를 수행하기위한 도구를 만들었습니다.

출처는 다음과 같습니다 : https://github.com/upriver/upriver.github.io


2
나는 도구가 좋은 아이디어라고 생각하지만 현실은 깨진 것입니다. 내 계정에서 20 개의 저장소를로드했으며 바닥 글조차 존재하지 않는 웹 사이트로 리디렉션합니다. 그것이 고쳐지면 나는 큰 지지자가 될 것입니다.
sorin

2
오늘부터 업스트림 리포지토리와 포크를 동기화하기 위해 업 리버를 성공적으로 사용 했으므로 목적에 따라 작동하며 계속 사용할 것입니다.
NauticalMile

1
@sorin이 20 개의 repo / branch 제한 (지금은 30 임)은 GitHub 기본 페이징 설정에서 비롯됩니다. 이를 처리하려면 코드에 약간의 적응이 필요합니다.
Andreas


11

실제로, 브라우저에서 업스트림 커밋을 통해 분기에 분기를 만들 수 있습니다.

  • 열기 https://github.com/<repo>/commits/<hash>, REPO는 포크, 그리고 해시 당신이 업스트림 웹 인터페이스에서 찾을 수있는 커밋의 전체 해시입니다. 예를 들어, 내가 열 수 있습니다 https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990를 하는 점, linux master쓰기의 시간이있다.
  • "Tree : ...."버튼을 클릭하십시오.
  • 새 지점의 이름을 입력하고 Enter

여기에 이미지 설명을 입력하십시오

그런 다음 해당 분기를 로컬 클론으로 가져올 수 있으며 해당 커밋 위에 편집 내용을 푸시 할 때 해당 데이터를 모두 GitHub로 다시 푸시하지 않아도됩니다. 또는 웹 인터페이스를 사용하여 해당 분기에서 무언가를 변경하십시오.

작동 방식 (추측, GitHub가 정확히 어떻게하는지 모르겠습니다) : 포크는 객체 스토리지를 공유하고 네임 스페이스 를 사용 하여 사용자 참조를 분리합니다. 따라서 포크 시점에 존재하지 않더라도 포크를 통해 모든 커밋에 액세스 할 수 있습니다.


2
대단해! 이것은 커밋이 github에 완전히 무의미하게 업로드되는 것을 방지합니다.
Rotsor

9

아래 단계를 따르십시오. 나는 그들을 시험해 보았고 그것은 나를 도왔다.

지점으로 결제

구문 : git branch yourDevelopmentBranch
예 : git checkout master

최신 코드를 얻기위한 풀 소스 리포지토리 분기

구문 : git pull https://github.com/tastejs/awesome-app-ideas master
예 : git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME


1
GitHub를 사용하는 경우 변경 사항을 GitHub 지점으로 푸시 할 수도 있습니다. git push HttpsForYourForkOfTheRepo BRANCH_NAME
user3731622

9

이 한 줄로 포크 리포지를 업데이트합니다.

git pull https://github.com/forkuser/forkedrepo.git branch

다른 솔루션이 여기에 게시 된 것처럼 프로젝트에 다른 원격 엔드 포인트를 추가하지 않으려면이 옵션을 사용하십시오.


2
이것에 제한이 있습니까? 즉, 커밋, 병합, 풀 요청을 추가하지 않았거나 마지막 업데이트 이후 풀 요청을 업스트림으로 병합하지 않은 경우에만 적용됩니까?
LightCC

1
원격 브랜치에서 일반 풀처럼 작동합니다. 로컬 리포지토리에서 X 커밋을 수행했지만 이제 원래 리포지토리 뒤에서 Y 커밋하면 Y 커밋이 로컬 분기로 가져오고 아마도 해결해야 할 충돌이 생길 수 있습니다.
R.Bravo

1
@LightCC이 이전에 전혀 원격 추가로 당겨 다른되지 않습니다, 당신은 추가하지 않은 것을 제외하고는 리모컨을 . 단점은 원할 때마다 전체 리포지토리 URL을 입력해야한다는 것 pull입니다.
Marc.2377

1
원본 리포지토리에서 여러 번 가져와야 할 필요가 없거나 포크 된 프로젝트가 비교적 간단한 경우 완벽한 솔루션입니다.
AxeEffect

7

이 답변을 보완하기 위해 업스트림 브랜치에서 복제 된 리포지토리 ( 원점 ) 의 모든 원격 브랜치를 한 번에 업데이트하는 방법을 찾고있었습니다 . 이것이 내가 한 방법입니다.

이는 소스 리포지토리 ( 원점 이 포크 된)를 가리키는 업스트림 원격 을 이미 구성하고 와 동기화했다고 가정합니다 .git fetch upstream

그런 다음 다음을 실행하십시오.

for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done

이 명령의 첫 번째 부분은 업스트림 원격 저장소 의 모든 헤드를 나열 하고 SHA-1과 refs/heads/분기 이름 접 두부를 제거합니다 .

그런 다음 각 지점에 대해 업스트림 원격 추적 지점 ( refs/remotes/upstream/<branch>로컬 측) 의 로컬 사본 을 원점 ( refs/heads/<branch>원격 측) 의 원격 지점으로 직접 푸시합니다 .

이러한 분기 동기화 명령은 다음 두 가지 이유 중 하나로 실패 할 수 있습니다. 업스트림 분기가 다시 작성되었거나 해당 분기의 커밋을 분기로 푸시했습니다. 포크의 브랜치에 아무것도 커밋하지 않은 첫 번째 경우 강제로 푸시하는 것이 안전합니다 ( 위의 명령에서 -f 스위치를 추가하십시오 git push -f). 다른 경우에는 분기가 분기되어 커밋이 다시 업스트림 으로 병합 될 때까지 sync 명령이 작동 할 것으로 예상 할 때 이는 정상 입니다.


6

"풀"응용 프로그램은 자동 솔루션을 셋업이 앤 잊지이다. 포크의 기본 브랜치를 업스트림 저장소와 동기화합니다.

URL을 방문하여 녹색 "설치"버튼을 클릭 한 후 자동 동기화를 사용하려는 저장소를 선택하십시오.

지점은 GitHub에서 시간당 한 번 직접 업데이트되며 로컬 시스템에서는 로컬 사본이 동기화되도록 마스터 지점을 가져와야합니다.


2
기본 설정을 사용하면 분기 저장소에서 변경 한 내용을 잃을 수 있습니다. 변경 사항을 유지하려면 구성 파일을 설정하고을 지정하십시오 mergemethod. 이에 대한 자세한 여기
Saurabh P 반 다리

1
기본 설정은 풀 요청을 보내고 병합합니다 (문서에 명시된 것과 반대). 이것은 약간 성가 시지만 데이터 손실 문제를 해결합니까?
krlmlr

4

Android Studio는 이제 GitHub 포크 리포지토리를 사용하는 방법을 배웠습니다 (콘솔 명령으로 "업스트림"원격 리포지토리를 추가 할 필요조차 없음).

메뉴 열기 VCSGit

마지막 두 팝업 메뉴 항목에주의하십시오.

  • 내 GitHub 포크 리베이스

  • 풀 요청 생성

사용해보십시오. 첫 번째 것을 사용하여 로컬 저장소를 동기화합니다. 어쨌든 "GitHub 포크 리베이스"를 클릭하면 Android Studio에서 상위 원격 저장소 ( "업스트림")의 브랜치에 액세스 할 수 있으며이를 사용하여 쉽게 조작 할 수 있습니다.

( "Git 통합"및 "GitHub"플러그인과 함께 Android Studio 3.0을 사용합니다.)

여기에 이미지 설명을 입력하십시오


4

분기 저장소를 복제했으면 복제본이있는 디렉토리 경로와 Git Bash 터미널의 몇 줄로 이동하십시오.

$ cd project-name

$ git remote add upstream https://github.com/user-name/project-name.git
 # Adding the upstream -> the main repo with which you wanna sync

$ git remote -v # you will see the upstream here 

$ git checkout master # see if you are already on master branch

$ git fetch upstream

그리고 당신은 갈 수 있습니다. 기본 저장소에서 업데이트 된 모든 변경 사항이 포크 저장소로 푸시됩니다.

"fetch"명령은 프로젝트에서 최신 상태를 유지하는 데 반드시 필요합니다. "git fetch"를 수행 할 때만 동료가 원격 서버에 푸시 한 변경 사항에 대한 정보가 제공됩니다.

추가 질문이 있으시면 여기 를 방문 하십시오


4

업스트림을 설정 한 경우 로 확인 git remote -v하면 충분합니다.

git fetch upstream
git checkout master
git merge --no-edit upstream/master
git push

2

이는 저장소의 크기와 분기 방법에 따라 다릅니다.

저장소가 매우 큰 경우 특별한 방법으로 관리하고 싶을 수도 있습니다 (예 : 삭제 기록). 기본적으로 현재 버전과 업스트림 버전 간의 차이점을 확인하고 커밋 한 다음 다시 마스터로 선택할 수 있습니다.

이것을 읽어보십시오 . 또한 큰 Git 리포지토리를 처리하는 방법과 최신 변경 사항으로 업스트림을 처리하는 방법에 대해 설명합니다.


2

@ krlmlr 's answer 에 추가하고 싶습니다 .

처음에는 분기 저장소에 이름이 하나 인 분기가 master있습니다. 새 기능 또는 수정 사항을 작업중인 경우 일반적으로 새 분기 feature를 작성하고 변경합니다.

당신이 갈래 저장소 부모 저장소와 동기화하고 싶다면, 당신은 설정 파일 (설정할 수 pull.yml에 대한) 풀 응용 프로그램 ( 기능 분기를 다음과 같이) :

version: "1"
rules:
  - base: feature
    upstream: master
    mergeMethod: merge
  - base: master
    upstream: parent_repo:master
    mergeMethod: hardreset

이렇게하면 master분기 리포지토리 의 분기가 부모 리포지토리와 함께 최신 상태로 유지 됩니다. 그것은 유지 feature를 통해 업데이트 갈래의 repo의 지점 master과 동일한를 병합하여 갈래 REPO의 지점을. 이것은 feature브랜치가 구성 파일을 포함하는 기본 브랜치 라고 가정 합니다.

여기서 두 가지 mergemethods가 사용됩니다. 하나는 분기 된 저장소의 분기에서 상위 저장소와 hardreset강제로 동기화 변경을 돕는 데 master사용되고 다른 방법은 merge입니다. 이 방법은 feature지점 에서 수행 한 변경 사항 과 지점에서 강제 동기화로 인해 수행 된 변경 사항을 병합하는 데 사용됩니다 master. 병합 충돌의 경우 풀 앱을 사용하여 풀 요청 중 다음 작업 과정을 선택할 수 있습니다.

기본 및 고급 구성에 대한 정보는 mergemethods 여기를 참조하십시오 .

나는 현재 내 갈래의 repo에서이 구성을 사용하고 여기에 있는지 향상 요청하기 위해 여기에 숙박이 업데이트되었습니다.


1

분기 저장소를 항상 업데이트하기 위해 유지해야 할 두 가지 주요 사항이 있습니다.

1. 포크 마스터에서 분기작성하고 변경하십시오 .

따라서 풀 요청 이 수락되면 업스트림으로 업데이트 할 때 기여 코드가 분기 저장소의 마스터에 라이브되므로 분기를 안전하게 삭제할 수 있습니다. 이를 통해 마스터는 항상 새로운 상태를 유지하여 다른 변경을 수행 할 수 있습니다.

2. 포크 마스터가 자동으로 갱신 되도록 스케줄 된 작업작성하십시오 .

이것은 cron 으로 수행 할 수 있습니다 . 다음은 리눅스에서 코드를 작성하는 예제 코드입니다.

$ crontab -e

이 코드를 위에 두어 crontab file시간 단위로 작업을 실행하십시오.

0 * * * * sh ~/cron.sh

다음 작성 cron.sh스크립트 파일과 자식의 상호 작용SSH-에이전트 및 / 또는 기대 아래로

#!/bin/sh
WORKDIR=/path/to/your/dir   
REPOSITORY=<name of your repo>
MASTER="git@github.com:<username>/$REPOSITORY.git"   
UPSTREAM=git@github.com:<upstream>/<name of the repo>.git  

cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent` && expect ~/.ssh/agent && ssh-add -l
git clone $MASTER && cd $REPOSITORY && git checkout master
git remote add upstream $UPSTREAM && git fetch --prune upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
    echo "all the same, do nothing"
else
    echo "update exist, do rebase!"
    git reset --hard upstream/master
    git push origin master --force
fi
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent -k`

갈래 저장소를 확인하십시오. 때때로 항상이 알림이 표시됩니다.

이 브랜치는 <upstream>: master 와도 같습니다 .

여기에 이미지 설명을 입력하십시오


0

이 명령을 사용하십시오 (행운의 경우)

git remote -v
git pull
git fetch upstream
git checkout master
git merge upstream/master --no-ff
git add .
git commit -m"Sync with upstream repository."
git push -v
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.