私は最近プロジェクトをフォークし、いくつかの修正を加えました。私はその後プルリクエストを作成し、それはその後受け入れられました。
数日後、別の貢献者によって別の変更が加えられました。だから私のフォークはその変更を含んでいません。
その変更をどうやったらフォークに反映させることができますか?貢献するためのさらなる変更があるとき、私は私のフォークを削除して作り直す必要がありますか?または更新ボタンがありますか?
フォークしたリポジトリのローカルクローンでは、元のGitHubリポジトリを「リモート」として追加できます。 ( "Remotes"はリポジトリの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
あなたがあなたのマスターブランチの履歴を書き換えたくないのなら(例えば他の人がそれをクローンしているかもしれないので)、あなたは最後のコマンドをgit merge upstream/master
で置き換えるべきです。ただし、できるだけクリーンなプル要求をさらに作成するには、おそらくリベースすることをお勧めします。
ブランチをupstream/master
にリベースした場合は、GitHubの自分のフォークリポジトリにプッシュするためにプッシュを強制する必要があるかもしれません。次のようにします。
git Push -f Origin master
あなたがリベースした後初めて-f
を使う必要があります。
2014年5月から、GitHubから直接forkを更新することが可能です。これはまだ2017年9月現在で動作しています、しかしそれはダーティコミット履歴につながるでしょう。
Update from original
)。今、あなたは3つのオプションを持っています、しかし、それぞれは、クリーンではないコミット履歴につながります。
This branch is X commits ahead, Y commits behind <original fork>
を表示します。そのため、GitHub Web 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
これで、アップストリームのマスターブランチはローカルブランチ、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コミット先に移動することになります。この回答は、見つかった手順を要約します here これは、フォークを親と同じコミットに移動します。
ディレクトリをローカルリポジトリに変更します。
git checkout master
でない場合は、masterブランチに切り替えます親をリモートリポジトリとして追加しますgit remote add upstream <repo-location>
git fetch upstream
問題git rebase upstream/master
git status
と入力して、マージされる内容をコミットすることを確認します問題git Push Origin master
これらのコマンドの詳細については、 手順 を参照してください。
2013年11月以降、GitHubに公開されているローカルフォークとアップストリームの同期を保つための非常に単純で直感的な方法を追加するよう求める非公式の機能要求がありました。
https://github.com/isaacs/github/issues/121
注:機能の要求は非公式なので、実装するためにこのような機能に対するサポートを追加するために[email protected]
に連絡することをお勧めします。上記の非公式の機能要求は、これが実行されていることに対する関心の量の証拠として使用することができます。
はじめに: あなたのフォークは "Origin"であり、あなたがフォークしたリポジトリは "upstream"です。
次のようなコマンドを使って、すでに自分のフォークを自分のコンピュータにクローンしたとしましょう。
git clone [email protected]:your_name/project_name.git
cd project_name
それが与えられているなら、あなたはこの順番で続ける必要があります:
クローンリポジトリ( "Origin")に "upstream"を追加します。
git remote add upstream [email protected]:original_author/project_name.git
「アップストリーム」からコミット(およびブランチ)を取得します。
git fetch upstream
フォークの "master"ブランチ( "Origin")に切り替えます。
git checkout master
あなたの "master"ブランチの変更を隠します。
git stash
"上流"の "マスター"ブランチから "オリジン"の "マスター"ブランチへの変更をマージします。
git merge upstream/master
マージの競合があれば解決し、マージをコミットします。
git commit -am "Merged from upstream"
フォークへの変更をプッシュする
git Push
(もしあれば)あなたの隠した変更を取り戻す
git stash pop
これで終わりです!おめでとうございます。
GitHubはまたこのトピックのための指示を提供します: フォークの同期
私のように、あなたが直接マスターに直接コミットすることは絶対にしないでくださいであれば、それはあなたが本当にすべきことですが、あなたは次のことができます。
あなたのフォークのローカルクローンから、あなたのアップストリームリモートを作成します。あなたは一度だけそれをする必要があります:
git remote add upstream https://github.com/whoever/whatever.git
それから、上流のリポジトリマスターブランチに追いついたいときはいつでも、あなたはする必要があります:
git checkout master
git pull upstream master
あなたが自分自身をマスターすることに何もコミットしていないと仮定すれば、あなたはすでに終わっているはずです。これでローカルマスターをOriginのリモートGitHubフォークにプッシュできます。開発ブランチを最新のローカルマスターにリベースすることもできます。
最初のアップストリームセットアップとマスターチェックアウトを過ぎて、あなたのマスターをアップストリームと同期させるために次のコマンドを実行するだけです:git pull upstream master。
この回答の時点で、GitHubはウェブインターフェースにこの機能を持っていません( もう言わないでしょうか? )。ただし、[email protected]
に投票を追加するよう依頼することはできます。
それまでの間、GitHubユーザーbardiharborowはこれを行うためのツールを作成しました。 https://upriver.github.io/
ソースはここにあります: https://github.com/upriver/upriver.github.io
Windows用のGitHubを使用している場合は、ワンクリックでフォークを更新できます。
実際には、ブラウザのアップストリームのコミットからフォークにブランチを作成することが可能です。
https://github.com/<repo>/commits/<hash>
を開きます。ここでrepoはあなたのフォークで、hashはフルハッシュです。上流のWebインターフェースで見つけることができるコミットの。たとえば、 https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d2899 を開くことができます。これは、執筆時点でlinux
master
を指しています。その後、そのブランチをローカルクローンに取得することができます。そのコミットの上で編集をプッシュするときに、そのすべてのデータをGitHubにプッシュバックする必要はありません。あるいはWebインターフェースを使用して、そのブランチの何かを変更してください。
それがどのように動作するか(推測ではありません、GitHubがそれを正確に行う方法はわかりません):フォークはオブジェクトストレージを共有し、 名前空間 を使用してユーザーの参照を分離します。そのため、フォークするまでにそれらが存在していなくても、あなたはあなたのフォークを通してすべてのコミットにアクセスすることができます。
以下の手順に従ってください。私はそれらを試してみました、そしてそれは私を助けました。
あなたのブランチへのチェックアウト
構文: git branch yourDevelopmentBranch
例: gitチェックアウトマスター
最新のコードを取得するためのソースリポジトリブランチを取得する
構文: git pull https://github.com/tastejs/awesome-app-ideas master
例: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME
この答えを補足するものとして、私はクローンリポジトリのすべてのリモートブランチ( Origin )を upstream branchesから一度に更新する方法を探していました。これが私のやり方です。
これは、ソースリポジトリを指す upstream リモートがすでに設定されていて( 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
このコマンドの最初の部分は、 upstream remoteリポジトリ内のすべてのヘッドを一覧表示し、SHA-1とそれに続くrefs/heads/
ブランチ名プレフィックスを削除します。
次に、これらの各ブランチに対して、 upstream リモートトラッキングブランチ(ローカル側のrefs/remotes/upstream/<branch>
)のローカルコピーを Origin (リモート側のrefs/heads/<branch>
)のリモートブランチに直接プッシュします。
これらのいずれかのbranch syncコマンドは、次の2つのうちの1つの理由で失敗する可能性があります。 upstream ブランチが書き直されたか、またはそのブランチでコミットをコミットしました。あなたがあなたのフォークのブランチに何もコミットしていない最初のケースでは、それは強制的にプッシュするのが安全です( -f スイッチを追加します;すなわち上記のコマンドでgit Push -f
)。それ以外の場合は、forkブランチが分岐していてコミットが upstream にマージされるまでsyncコマンドが機能することを期待できないため、これは正常です。
フォークしたリポジトリを次の1行で更新します。
git pull https://github.com/forkuser/forkedrepo.git branch
他のソリューションがここに掲載されているように、あなたのプロジェクトに別のリモートエンドポイントを追加したくない場合はこれを使用してください。
Android StudioはGitHubのforkリポジトリと連携するようになりました(コンソールコマンドで "上流"のリモートリポジトリを追加する必要すらありません)。
メニューを開く _ vcs _ → Git
そして最後の2つのポップアップメニュー項目に注意してください。
GitHubフォークを元に戻します
プルリクエストを作成
試してみてください。最初のものを使って私のローカルリポジトリを同期させます。とにかく親のリモートリポジトリ( "upstream")からのブランチは "Rebase my GitHub fork"をクリックした後にAndroid Studioでアクセス可能になり、あなたはそれらを簡単に操作できるようになります。
(私はAndroid Studio 3.0を "Git integration"と "GitHub"プラグインと共に使っています。)
フォークしたリポジトリのクローンを作成したら、クローンが存在するディレクトリパスと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リポジトリをどのように扱うか、そしてそれらを最新の変更でアップストリームする方法について説明します。
アップストリームを設定する場合。 git remote -v
で確認すると、これで十分です。
git fetch upstream
git checkout master
git merge --no-edit upstream/master
git Push
フォークされたリポジトリを常に最新の状態に保つには、2つの主なものがあります。
1.分岐マスターを作成しますフォークマスターからそこで変更を行います。
したがって、Pull Requestが受け入れられると、ブランチを安全に削除できます。アップストリームで更新すると、寄贈されたコードがフォークされたリポジトリのマスターに反映されます。これにより、マスターは常にクリーンな状態になり、新しいブランチを作成して別の変更を行うことができます。
2.スケジュールされたジョブを作成しますfork masterに対して自動的に更新を行います。
これはcronで実行できます。 Linuxで実行する場合のサンプルコードを次に示します。
$ crontab -e
このコードをcrontab file
に配置して、ジョブを1時間ごとに実行します。
0 * * * * sh ~/cron.sh
次に、cron.sh
スクリプトファイルとgit interactwithssh-agent を作成します=および/またはexpect以下のように
#!/bin/sh
WORKDIR=/path/to/your/dir
REPOSITORY=<name of your repo>
MASTER="[email protected]:<username>/$REPOSITORY.git"
[email protected]:<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でもあります。