[解決済み] チェックアウトを使わずにGitブランチをマージ、アップデート、プルする
質問
私は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 -'
このエイリアスが行うことは、以下の通りです。
-
git checkout HEAD
: これは作業コピーをデタッチドヘッドの状態にします。を更新したい場合に便利です。master
をチェックアウトしている間に、偶然にも というのも、そうしないとmaster
が動かないのですが、それが本当に正しいのかどうか、頭から抜けて覚えていません。 -
git fetch upstream master:master
: これはローカルのmaster
と同じ場所にupstream/master
. -
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>
. もし、オプションのプラス
+
を使用すると、早送りの更新にならない場合でも、ローカルの参照が更新されます。
参照
関連
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] Git リポジトリでのマージの衝突を解決するには?
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] まだプッシュされていない Git マージを元に戻す
-
[解決済み] git rebase の取り消し
-
[解決済み] Git リポジトリで削除されたファイルを検索して復元する方法
-
[解決済み] Gitブランチをmasterにマージする最も良い(そして最も安全な)方法は何ですか?
-
[解決済み] Git で、別のブランチの変更を選択的にマージしたり選択したりするにはどうすればよいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】gitがローカルバージョンをリモートバージョンに置き換える
-
[解決済み] git rebase fatal: 必要なリビジョンは1つです。
-
[解決済み】未マージファイルがあるため、Gitマージができない
-
[解決済み】git push >> fatal: 設定されたプッシュ先がありません。
-
[解決済み] [Solved] 作業ツリーのディレクトリ 'example.com' を作成できませんでした。パーミッションが拒否されました
-
[解決済み] GIT_DISCOVERY_ACROSS_FILESYSTEM が設定されていない。
-
[解決済み] git rebase: "error: cannot stat 'file': パーミッションが拒否されました"
-
[解決済み] 別ブランチでの git pull
-
[解決済み] developブランチでgit pull origin masterを行うとどうなりますか?
-
[解決済み] 現在のブランチでないブランチに 'git pull' するには?