どのようにしてGitに常に特定のブランチからプルさせるのですか?


485

私はgitマスターではありませんが、いくつかの異なるプロジェクトを使用して、しばらくの間作業を続けています。もちろん、私はいつでもgit clone [repository]、その時点から、いつでもできgit pullます。もちろん、目立った変更がない限り。

最近、前のブランチに戻す必要がありましたgit checkout 4f82a29。もう一度プルする準備ができたとき、自分のブランチをマスターに戻す必要があることに気付きました。今では、ストレートを使用してプルすることはできませんgit pullが、代わりにを指定する必要git pull origin masterがあります。

git pullオリジンマスターを指定せずにストレートを行うことができない変更点と、元に戻す方法

更新:

-bash-3.1$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[branch "master"]
[remote "origin"]
    url = git@github.com:user/project.git
    fetch = refs/heads/*:refs/remotes/origin/*

更新2:明確にするために、元の方法が誤っていた可能性があることを理解していますが、このリポジトリを修正して、git pullもう一度使用できるようにする必要があります。現在、git pullの結果は次のとおりです。

-bash-3.1$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull  ').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.master.remote = 
    branch.master.merge = 
    remote..url = 
    remote..fetch = 

See git-config(1) for details.

git pullマージするブランチを指定できますが、正しく機能しますが、git pull以前のようには機能しませんgit checkout


.git / configはどのように見えますか?そのコミットをチェックアウトした後はどうしましたか?
ライアングラハム、

4f82a29の上でコミットを行いましたか?
Pat Notz

パット、私はその上でコミットをしませんでした。これはサーバー上にあり、作成したバグを隠すために安定版にロールバックする必要がありました。このシステムは開発用ではないため、ロールバックし、バグが修正されるまで待ってから、ヘッドバージョンに戻したいだけでした。
David Smith、

2
ライアン、.git / configを含めるように更新しました。チェックアウト後、私は何もしませんでした。このコンピュータはサーバーであり、開発用ではありません。
David Smith、

回答:


731

の下[branch "master"]で、以下をリポジトリのGit構成ファイルに追加してみてください(.git/config):

[branch "master"]
    remote = origin
    merge = refs/heads/master

これはGit 2に次のことを伝えます。

  1. masterブランチにいる場合、デフォルトのリモートはoriginです。
  2. 使用する場合はgit pullありません、リモートおよびブランチに指定して、masterブランチ上で、リモートのmasterブランチからの変更でデフォルトのリモート(原点)とマージを使用しています。

ただし、この設定が構成から削除された理由はわかりません。他の人が投稿した提案にも従わなければならないかもしれませんが、これはうまくいくかもしれません(または少なくとも助けます)。

手作業で設定ファイルを編集したくない場合は、代わりにコマンドラインツールを使用できます。

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

2
これも私にとってはうまくいき、githubからプロジェクトをチェックアウトしました。私はOS X 10.4を実行しています
Sam Barnum

ありがとう非常に多くの-これは(私はグリッチの前に問題なく、頻繁にプッシュ/プルに使用)1「サーバ」リポジトリと二つのコンピュータを持つ単一の開発プロジェクトに私に起こった、なぜ知っているが、修正が働いていませんいいね!
chesterbr 2010年

1
Under [branch "master"]とはどういう意味ですか
ianj

3
@ianj:Git構成ファイル内(リポジトリルートから.git/config)。
mipadi 2010

1
@ianj:コマンドラインから、$ git config branch.master.remote origin ; git config branch.master.merge refs/heads/master代わりにいつでも実行できます。
mipadi

139

必要に応じて、次のように(構成ファイルを編集する代わりに)コマンド行を介してこれらのオプションを設定できます。

  $ git config branch.master.remote origin
  $ git config branch.master.merge refs/heads/master

または、あなたが私のようなものであり、今後取り組む可能性のあるプロジェクトを含むすべてのプロジェクトでこれをデフォルトにしたい場合は、グローバル構成設定として追加します。

  $ git config --global branch.master.remote origin
  $ git config --global branch.master.merge refs/heads/master

12
魔法の言葉「refs / heads / master」を知るための+1。変数の設定方法を理解するのに問題はありませんでしたが、何に設定するのかまったくわかりませんでし。また、manページはあまり役に立ちませんでした。私はこの答えを見つけた後、最終的にドキュメントの適切な場所を見つけました。好奇心が強い人のために:魔法の言葉は、.gitgitがmaster現在のコミットのハッシュコードを保持しているように見えるファイルパスを指します。
モク2011

84
git branch --set-upstream master origin/master

これにより、次の情報がconfigファイルに追加されます。

[branch "master"]
    remote = origin
    merge = refs/heads/master

あなたが持っている場合branch.autosetuprebase = always、それはまた追加されます:

    rebase = true

1
私はこれがgitを要求されたように動作させる最も簡単な方法だと思っています。特に、リモートだけでなくブランチが多い場合(ブランチごとにこれを行う必要がある場合でも、ブランチごとに1回です)
s3v3n

2
私はこれを試したところ、有効なリモートであり、通常どおり、両方のリポジトリに存在しfatal: Not a valid object name: 'origin/master'.ていますoriginが、エラーが発生しましたmaster
ケンウィリアムズ

2
ケン、リモートブランチ名を取得するには、まず「git fetch origin」を実行する必要があります。
エリックリー

14
新しいgitはあなたに使用を求めていますgit branch --set-upstream-to=origin/master master
orbeckst 2013

52

mipadiとCaseyの回答のように正確なgit configまたはgit branch引数を覚えるのは難しいので、次の2つのコマンドを使用して上流の参照を追加します。

git pull origin master
git push -u origin master

これで同じ情報が.git / configに追加されますが、覚えやすいと思います。


1
同意する。これが最も簡単な答えです。
linbianxiaocao

2
あなたの答えはそれが機能する理由を含み、その理由を説明するドキュメントのセクションを参照する必要があります。
vfclists 2017年

24

Gitプルは2つのアクション組み合わせます。追跡されたブランチのリモートリポジトリから新しいコミットをフェッチし、それらを現在のブランチにマージします

特定のコミットをチェックアウトしたとき、現在のブランチはなく、最後に行ったコミットを指すHEADだけがあります。そのgit pullため、すべてのパラメーターが指定されているわけではありません。それがうまくいかなかった理由です。

更新された情報に基づいて、実行しようとしているのはリモートリポジトリを元に戻すことです。バグを引き起こしたコミットを知っている場合、これを処理する最も簡単な方法git revertは、指定されたバグのあるコミットを元に戻す新しいコミットを記録することです。

$ git checkout master
$ git reflog            #to find the SHA1 of buggy commit, say  b12345
$ git revert b12345
$ git pull
$ git push

変更したいのはあなたのサーバーなので、バグのあるコミットを隠すために履歴を書き換える必要はないと思います。

バグがマージコミットで導入された場合、この手順は機能しません。How-to-revert-a-faulty-mergeを参照してください 。


あなたは私にいくつかの素晴らしい教育を与えています、私は感謝します、しかし私は私の状況を十分に説明していないかもしれないので、これは私のワークフローに完全には一致しません。これに対処するために、別の質問を投稿します。ありがとう、ポール!あなたに+1、サー。
David Smith、

私はあなたの状況を誤解しているだけです。必要な答えが得られてよかったです。
ポール

12

Gitを構成する方法もあるので、常に同等のリモートブランチをプルして、現在作業コピーにチェックアウトされているブランチにプッシュします。これはトラッキングブランチと呼ばれ、Git Readyはデフォルトで設定を推奨しています

現在の作業ディレクトリの上の次のリポジトリの場合:

git config branch.autosetupmerge true

すべてのGitリポジトリについて、それ以外の場合は構成されません。

git config --global branch.autosetupmerge true

一種の魔法、私見ですが、これは特定のブランチ常に現在のブランチである場合に役立ちます

あなたがいるときbranch.autosetupmergeに設定trueして、初めてのブランチをチェックアウト、Gitは対応するリモートブランチを追跡について教えてくれます。

(master)$ git checkout gh-pages
Branch gh-pages set up to track remote branch gh-pages from origin.
Switched to a new branch 'gh-pages'

その後、Gitは対応するブランチに自動的にプッシュします。

(gh-pages)$ git push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1003 bytes, done.
Total 6 (delta 2), reused 0 (delta 0)
To git@github.com:bigben87/webbit.git
   1bf578c..268fb60  gh-pages -> gh-pages

10

私のgit設定ファイルを編集したくないので、@ mipadiの投稿にある情報をフォローして使用しました。

$ git pull origin master

13
指定するのではなく、これを自動的に行うことがポイントでした。
エリック

4

それをプルマスターにする方法についてのあなたの当面の質問、あなたはそれが言うことをする必要があります。ブランチ構成でプルするrefspecを指定します。

[branch "master"]
    merge = refs/heads/master

それは「refs / heads / master」ではないのですか?git-pull(1)によると、これはデフォルトでマージされるリモートサイトのブランチの名前です。
Adam Monsen、2010年

はい、あなたは正しいです。私が例として取り上げたレポは特殊なケースです。修正。
ライアングラハム、

0

いくつかの情報を追加したかっただけgit pullです。ブランチを自動的に参照するかどうかを確認できます。

コマンドを実行した場合git remote show origin(リモートの短縮名としてoriginを想定)、gitは、デフォルトの参照が存在するかどうかにかかわらず、この情報を表示しますgit pull

以下は出力例です(gitのドキュメントから取得)。

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

表示されている部分、git pull用に構成されたローカルブランチに注意してください。

この場合、次git pullを参照しますgit pull origin master

最初に、git cloneを使用してリポジトリのクローンを作成した場合、これらは自動的に処理されます。しかし、git remote addを使用して手動でリモートを追加した場合、これらはgit構成から欠落しています。その場合、「ローカルブランチが 'git pull'用に構成されています:」と表示されている部分がの出力に表示されませんgit remote show origin

の設定が存在しない場合の次の手順git pullは、他の回答ですでに説明されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.