私は最近プロジェクトを分岐し、いくつかの修正を適用しました。次にプルリクエストを作成し、それが受け入れられました。
数日後、別の貢献者によって別の変更が行われました。したがって、私のフォークにはその変更が含まれていません。
どうすればその変化をフォークに取り入れることができますか?貢献するためにさらに変更がある場合、フォークを削除して再作成する必要がありますか?または更新ボタンはありますか?
私は最近プロジェクトを分岐し、いくつかの修正を適用しました。次にプルリクエストを作成し、それが受け入れられました。
数日後、別の貢献者によって別の変更が行われました。したがって、私のフォークにはその変更が含まれていません。
どうすればその変化をフォークに取り入れることができますか?貢献するためにさらに変更がある場合、フォークを削除して再作成する必要がありますか?または更新ボタンはありますか?
回答:
フォークしたリポジトリのローカルクローンに、元のGitHubリポジトリを「リモート」として追加できます。(「リモート」は、リポジトリのURLのニックネームのようなorigin
ものです。たとえば、1です。)次に、そのアップストリームリポジトリからすべてのブランチをフェッチし、作業をリベースして、アップストリームバージョンでの作業を続行できます。次のようなコマンドの観点から:
# 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
masterブランチの履歴を書き直したくない場合(たとえば、他の人がそれを複製した可能性があるため)、最後のコマンドをに置き換える必要がありgit merge upstream/master
ます。ただし、できるだけクリーンなプルリクエストをさらに行うには、リベースすることをお勧めします。
ブランチをリベースしたupstream/master
場合は、GitHubの独自のフォークされたリポジトリーにブランチをプッシュするために、強制的にプッシュする必要がある場合があります。あなたはそれを行うでしょう:
git push -f origin master
-f
リベースした後、初めて使用する必要があるだけです。
-f
れ、バージョンを複製した可能性のあるすべてのユーザーを混乱させる履歴を書き直す必要がなくなります。
git merge --no-ff upstream/master
これにより、コミットが最優先されなくなりました。
2014年5月から、GitHubから直接フォークを更新できるようになりました。これはまだ2017年9月のように動作し、しかしそれは歴史をコミット汚れにつながります。
Update from original
。これで3つのオプションがありますが、いずれもコミット履歴がクリーンではなくなります。
This branch is X commits ahead, Y commits behind <original fork>
。つまり、GitHubウェブUIを使用して、アップストリームでリポジトリを更新し続けることができますが、そうすることで、コミット履歴が汚くなります。固執するコマンドラインの代わりに-それは簡単です。
フォークの同期に関する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)
同期しています
リポジトリをアップストリームと同期するには、2つの手順が必要です。最初にリモートからフェッチし、次に目的のブランチをローカルブランチにマージする必要があります。
フェッチ
リモートリポジトリからフェッチすると、そのブランチとそれぞれのコミットが取り込まれます。これらは、特別なブランチの下のローカルリポジトリに保存されます。
$ 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でリポジトリを更新する場合は、こちらの手順に従ってください
git push origin master
--follow-tags
:stackoverflow.com/a/26438076/667847
git merge upstream/master
にそれをしなければならず、次にブランチを開発して実行するためにチェックアウトしますgit merge upstream/develop
Permission denied (publickey). fatal: Could not read from remote repository.
、FacebookのGithubアカウントアップストリームから取得しようとしたときに取得していたため、役に立ちました。
多くの答えは、あなたのフォークを親リポジトリの前に1つのコミットを移動させることになります。この回答は、フォークを親と同じコミットに移動する、ここにある手順を要約しています。
ディレクトリをローカルリポジトリに変更します。
git checkout master
親をリモートリポジトリとして追加し、 git remote add upstream <repo-location>
git fetch upstream
問題 git rebase upstream/master
git status
問題 git push origin master
これらのコマンドの詳細については、ステップ3を参照してください。
私のように、何も直接masterにコミットしない場合は、次のようにすることができます。
フォークのローカルクローンから、アップストリームリモートを作成します。あなたは一度だけそれをする必要があります:
git remote add upstream https://github.com/whoever/whatever.git
次に、上流のリポジトリマスターブランチに追いつきたいときはいつでも:
git checkout master
git pull upstream master
自分でマスターに何かをコミットしたことがないと仮定すると、すでに完了しているはずです。これで、ローカルマスターをオリジンのリモートGitHubフォークにプッシュできます。また、最新のローカルマスターに基づいて開発ブランチをリベースすることもできます。
最初のアップストリームのセットアップとマスターのチェックアウトが終わったら、次のコマンドを実行してマスターをアップストリームと同期させるだけです:git pullアップストリームマスター。
序:フォークは「元」であり、フォークしたリポジトリは「上流」です。
次のようなコマンドを使用して、すでにフォークをコンピューターに複製したと仮定します。
git clone git@github.com:your_name/project_name.git
cd project_name
それが指定されている場合は、この順序で続行する必要があります。
「upstream」を複製したリポジトリー(「origin」)に追加します。
git remote add upstream git@github.com:original_author/project_name.git
「上流」からコミット(およびブランチ)をフェッチします。
git fetch upstream
フォークの「master」ブランチ(「origin」)に切り替えます。
git checkout master
「マスター」ブランチの変更を隠しておきます。
git stash
「upstream」の「master」ブランチからの変更を「origin」の「master」ブランチにマージします。
git merge upstream/master
マージの競合があれば解決し、マージをコミットします
git commit -am "Merged from upstream"
変更をフォークにプッシュする
git push
隠された変更(ある場合)を取り戻す
git stash pop
完了です!おめでとう!
GitHubはこのトピックの手順も提供しています:フォークの同期
git remote add upstream git@github.com:original_author/project_name.git
単なるエイリアスgit remote add upstream https://github.com/original_author/project_name.git
ですか?
git stash
そしてgit stash pop
一部非常に有用
2013年11月以降、GitHubで非公式の機能リクエストが開かれ、ローカルフォークをアップストリームと同期させる非常にシンプルで直感的な方法を追加するように依頼されています。
https://github.com/isaacs/github/issues/121
注:機能のリクエストは非公式なので、support@github.com
このような機能を実装するためのサポートを追加するために連絡することもお勧めします。上記の非公式の機能リクエストは、実装されていることに対する関心の高さの証拠として使用できます。
この回答の日付の時点で、GitHubはWebインターフェースにこの機能を備えていません(または、もう言う必要はありませんか?)。ただし、support@github.com
そのための投票を追加するように依頼できます。
それまでの間、GitHubユーザーbardiharborowがこれを行うためのツールを作成しました: https ://upriver.github.io/
ソースはここにあります:https://github.com/upriver/upriver.github.io
WindowsまたはMacでGitHubを使用している場合は、ワンクリック機能でフォークを更新できます。
実際には、ブラウザのアップストリームのコミットからフォークにブランチを作成することが可能です:
https://github.com/<repo>/commits/<hash>
、ここでrepoはフォークで、hashはコミットの完全なハッシュで、上流のWebインターフェースで見つけることができます。たとえば、https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990を開くことができます。これlinux
master
は、執筆時点を示しています。その後、そのブランチをローカルクローンにフェッチできます。そのコミットの上に編集をプッシュするときに、すべてのデータをGitHubにプッシュする必要はありません。または、Webインターフェースを使用して、そのブランチの何かを変更します。
どのように機能するか(推測ですが、GitHubが正確にどのように機能するかわかりません):フォークはオブジェクトストレージを共有し、名前空間を使用してユーザーの参照を分離します。したがって、フォークの時点までに存在していなかったとしても、フォークを介してすべてのコミットにアクセスできます。
以下の手順に従ってください。私はそれらを試しました、そしてそれは私を助けました。
ブランチにチェックアウト
構文: 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
git push HttpsForYourForkOfTheRepo BRANCH_NAME
次の1行で、分岐したリポジトリを更新します。
git pull https://github.com/forkuser/forkedrepo.git branch
他のソリューションがここに投稿されているため、プロジェクトに別のリモートエンドポイントを追加したくない場合は、これを使用します。
この答えを補完するものとして、私はクローンされたリポジトリのすべてのリモートブランチ(origin)を上流のブランチから一度に更新する方法を探していました。これは私がやった方法です。
これは、ソースレポジトリ(オリジンが分岐された場所)を指すアップストリームリモートをすでに設定し、それをと同期していることを前提としています。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>
リモート側)のリモートブランチに直接プッシュします。
これらのブランチ同期コマンドは、次の2つの理由のいずれかで失敗する可能性があります。上流のブランチが書き直されたか、そのブランチのコミットをフォークにプッシュしたかのいずれかです。フォークのブランチに何もコミットしていない最初のケースでは、強制的にプッシュしても安全です(-fスイッチを追加します;つまりgit push -f
、上記のコマンドで)。他のケースでは、これは正常です。フォークブランチが分岐し、コミットがアップストリームにマージされるまで、syncコマンドが機能することは期待できません。
「プル」アプリが自動セットアップと、忘れているソリューションを。フォークのデフォルトブランチをアップストリームリポジトリと同期します。
URLにアクセスし、緑色の[インストール]ボタンをクリックして、自動同期を有効にするリポジトリを選択します。
ブランチはGitHubで直接1時間に1回更新されます。ローカルマシンでは、ローカルコピーが同期していることを確認するためにマスターブランチをプルする必要があります。
mergemethod
。詳細はこちら
Android Studioは、GitHubフォークリポジトリの操作方法を学習しました(コンソールコマンドで「上流」のリモートリポジトリを追加する必要さえありません)。
メニューVCS → Gitを開く
最後の2つのポップアップメニュー項目に注意してください。
GitHubフォークをリベース
プルリクエストを作成
それらを試してください。最初のリポジトリを使用して、ローカルリポジトリを同期しています。とにかく、「リモートGitHubフォーク」をクリックすると、Android Studioで親リモートリポジトリ(「アップストリーム」)のブランチにアクセスできるようになり、ブランチを簡単に操作できるようになります。
(「Git統合」および「GitHub」プラグインを備えたAndroid Studio 3.0を使用しています。)
フォークしたリポジトリのクローンを作成したら、クローンが存在するディレクトリパスと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」を実行する場合にのみ、同僚がリモートサーバーにプッシュした変更について通知されます。
詳細なクエリについては、ここにアクセスできます
それは、リポジトリのサイズとそれをどのようにフォークしたかによって異なります。
それが非常に大きなリポジトリである場合、特別な方法で管理したいと思うかもしれません(たとえば、ドロップ履歴)。基本的に、現在のバージョンと上流のバージョンの違いを取得し、それらをコミットしてから、マスターに戻すことができます。
これを読んでみてください。大きなGitリポジトリを処理する方法と、最新の変更でそれらをアップストリームする方法について説明します。
最初は、フォークされたリポジトリーには次の名前のブランチが1つありますmaster
。新しい機能や修正に取り組んでいる場合は、通常、新しいブランチfeature
を作成して変更を加えます。
フォークされたリポジトリーを親リポジトリーと同期させたい場合は、次のように(機能ブランチで)Pullアプリの構成ファイル(pull.yml
)を設定できます。
version: "1"
rules:
- base: feature
upstream: master
mergeMethod: merge
- base: master
upstream: parent_repo:master
mergeMethod: hardreset
これmaster
により、フォークされたリポジトリのブランチが親リポジトリと一緒に最新の状態に保たれます。feature
フォークされたレポのmaster
ブランチをマージして、フォークされたレポのブランチを介して更新されたブランチを維持します。これは、feature
ブランチが構成ファイルを含むデフォルトのブランチであることを前提としています。
ここで2つmergemethods
が機能しhardreset
ます。1つはmaster
、フォークされたレポのブランチの変更を親レポと強制的に同期させるのに役立ち、もう1つはですmerge
。このメソッドは、feature
ブランチで行った変更とブランチでの強制同期によって行われた変更をマージするために使用されますmaster
。マージの競合が発生した場合、プルアプリを使用すると、プルリクエスト中に次のアクションコースを選択できます。
mergemethods
ここでは、基本的な構成と高度な構成、およびさまざまな構成について読むことができます。
私は現在、ここでフォークされたリポジトリでこの設定を使用して、ここでリクエストされた拡張機能が更新されたままであることを確認しています。
フォークされたリポジトリを常に最新の状態に保つには、主に2つの点があります。
1.フォークマスターからブランチを作成し、そこで変更を行います。
したがって、プルリクエストが受け入れられると、貢献したコードがアップストリームで更新されたときにフォークされたリポジトリのマスターに存在するため、ブランチを安全に削除できます。これにより、マスターは常にクリーンな状態になり、新しいブランチを作成して別の変更を行うことができます。
2.フォークマスターが自動的に更新するようにスケジュールされたジョブを作成します。
これはcronで実行できます。Linuxで実行する場合のコード例を以下に示します。
$ crontab -e
このコードをに配置しcrontab file
て、1時間ごとにジョブを実行します。
0 * * * * sh ~/cron.sh
次に、cron.sh
スクリプトファイルとssh-agentとのgit対話を作成し、以下のように期待します
#!/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 でもあります。