1. ホーム
  2. git

[解決済み] チェックアウトを使わずにGitブランチをマージ、アップデート、プルする

2022-03-24 01:14:29

質問

私はAとBの2つのブランチがあるプロジェクトで働いています。私は通常、ブランチAで作業し、ブランチBから何かをマージしています。

git merge origin/branchB

しかし、Bブランチのローカルコピーも残しておきたいと思います。なぜなら、AブランチにマージせずにBブランチをチェックアウトすることがあるからです。

git checkout branchB
git pull
git checkout branchA

上記を1つのコマンドで、しかもブランチを切り替えずに行う方法はないでしょうか?そのためには git update-ref を使うのでしょうか?どのように?

どのように解決するのですか?

簡単な答え

をやっている限りは 早送り を使用することができます。

git fetch <remote> <sourceBranch>:<destinationBranch>

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

一方 アンバーの答え は、早送りの場合にも機能しますが git fetch は、ブランチリファレンスを強制的に移動させるよりも少し安全です。 git fetch を使わない限りは、自動的に非ファストフォワードを防ぐことができます。 + を参照仕様に追加します。

長い答え

ブランチ B をブランチ A にマージする際、Fast-Forward マージにならない場合は、まず A をチェックアウトしなければなりません。これは、潜在的な競合を解決するために作業コピーが必要だからです。

しかし 早送りマージの場合は可能です なぜなら、そのようなマージは、定義上、決してコンフリクトを引き起こすことができないからです。まずブランチをチェックアウトすることなくこれを行うには、次のようにします。 git fetch を refspec で指定します。

を更新する例です。 master (ファストフォワード以外の変更を許可しない)別のブランチがある場合 feature をチェックアウトしています。

git fetch upstream master:master

このユースケースは非常に一般的なので、おそらくこのように git 設定ファイル内にエイリアスを作成することになるでしょう。

[alias]
    sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'

このエイリアスが行うことは、以下の通りです。

  1. git checkout HEAD : これは作業コピーをデタッチドヘッドの状態にします。を更新したい場合に便利です。 master をチェックアウトしている間に、偶然にも というのも、そうしないと master が動かないのですが、それが本当に正しいのかどうか、頭から抜けて覚えていません。

  2. git fetch upstream master:master : これはローカルの master と同じ場所に upstream/master .

  3. git checkout - は、以前にチェックアウトしたブランチをチェックアウトします (これが - はこの場合に行うものです)。

の構文は git fetch (非)早送りマージの場合

もし fetch コマンドを使用すると、更新がfast-forwardでない場合に失敗するようになります。

git fetch <remote> <remoteBranch>:<localBranch>

ファストフォワード以外の更新を許可したい場合は、その前に + を参照仕様の前に追加します。

git fetch <remote> +<remoteBranch>:<localBranch>

なお、ローカルリポジトリをパラメータとして渡すには、以下のようにします。 . :

git fetch . <sourceBranch>:<destinationBranch>

ドキュメント

から git fetch この構文を説明するドキュメント (強調)。

<ブロッククオート

<refspec>

の書式は <refspec> パラメータは、オプションのプラス + の後に、ソース参照 <src> の後にコロンが続きます。 : に続いて、宛先の参照番号 <dst> .

に一致するリモート参照。 <src> が取得され、もし <dst> が空文字列でない場合、それにマッチするローカル参照は <src> . もし、オプションのプラス + を使用すると、早送りの更新にならない場合でも、ローカルの参照が更新されます。

参照

  1. 作業ツリーに手を触れずに Git チェックアウトとマージが可能

  2. 作業ディレクトリを変更せずにマージする