[解決済み] git pull "で保留中の変更を自動的にstashしたりpopしたりできますか?
質問
解決方法がわかりません。
user@host$ git pull
Updating 9386059..6e3ffde
error: Your local changes to the following files would be overwritten by merge:
foo.bar
Please, commit your changes or stash them before you can merge.
Aborting
しかし
git pull
を実行します。
stash
と
pop
を踊ってくれませんか?
このコマンドに違う名前がついていても大丈夫です。
のシェルエイリアスを作成する
git stash; git pull; git stash pop
は解決策ですが、私はより良い解決策を探します。
どのように解決するのですか?
Git 2.6+(2015年9月28日リリース)の場合
は
のみ
git config
の設定に興味があります。
rebase.autostash
(2020年Q2のGit 2.27で、以下も追加されました。
merge.autostash
下記参照)
trueに設定すると、操作開始前に一時的な隠し場所を自動的に作成し、操作終了後にそれを適用します。
これは、ダーティなワークツリーに対してrebaseを実行できることを意味します。ただし、使用には注意が必要です。リベースに成功した後の最終的なスタッシュの適用で、自明ではないコンフリクトが発生する可能性があります。デフォルトはfalseです。
と組み合わせる。
<ブロッククオート
pull.rebase
true の場合、"git pull" を実行したときにデフォルトのリモートからデフォルトのブランチをマージするのではなく、取得したブランチの上にリベースします。
指定されたリポジトリで
git config pull.rebase true
git config rebase.autoStash true
これだけあれば、単純な
git pull
を使えば、ダーティツリーでも動作します。
その場合、エイリアスは必要ありません。
参照
コミット 53c76dc
(2015/07/04)によるものです。
ケビン・ダウト(
Ikke
)
.
(によって統合されました。
ジュニオ・C・ハマノ--。
gitster
--
で
コミット e69b408
, 2015年8月17日)
pull
の場合、ダーティツリーを許可します。
rebase.autostash
有効
<ブロッククオート
rebase は、ダーティなワークツリーに遭遇したときに、変更をためることを学習しました。
しかし
git pull --rebase
はしない。
作業ツリーがダーティであることを確認するのは、以下の場合のみです。
rebase.autostash
がない場合
を有効にします。
注意:もし
を使用せずに
オートスタンプ(たとえ
rebase.autoStash true
が設定されている場合)、git 2.9(2016年6月)以降、そうなっていますね。
pull --rebase --no-autostash
参照
コミット 450dd1d
,
コミット1662297
,
コミット 44a59ff
,
コミット 5c82bcd
,
コミット 6ddc97c
,
コミット eff960b
,
コミット efa195d
(2016年04月02日)、および
コミットf66398e
,
コミットc48d73b
(2016年3月21日)によるものです。
メフル・ジャイン (
mehul2029
)
.
(によって統合されました。
ジュニオ・C・ハマノ--。
gitster
--
で
コミット 7c137bb
, 2016年4月13日)
コミット f66398e を特に含む。
<ブロッククオート
pull --rebase
: 追加--[no-]autostash
フラグ
もし
rebase.autoStash
設定変数が設定されている場合、その変数を使用する方法はありません。
のためにそれを上書きします。
git pull --rebase
"をコマンドラインから実行します。
教えて"。
git pull --rebase
"は
--[no-]autostash
コマンドラインフラグで
の現在の値を上書きします。
rebase.autoStash
が設定されている場合。として、"
git rebase
"
は
--[no-]autostash
オプションに渡すだけです。
というオプションがあります。
git rebase
"時に "
git pull --rebase
"が呼び出されます。
警告:Git 2.14(2017年第3四半期)以前は、"
git pull --rebase --autostash
"は、ローカル履歴が上流に早送りされたときに自動でスタッシュしませんでした。
参照
コミット f15e7cf
(2017年06月01日)による
タイラー・ブレイザー(
tylerbrazier
)
.
(によって統合されました。
ジュニオ・C・ハマノ--。
gitster
--
で
コミット 35898ea
, 2017年06月05日)
pull
: ff
--rebase --autostash
ダーティレポでの動作
<ブロッククオート
いつ
git pull --rebase --autostash
をダーティリポジトリで使用すると、結果的に
を実行すると、何も自動洗浄されず、プルに失敗しました。
これは、fast-forwardできるときにrebaseを実行しないようにするためのショートカットが原因でした。
が、そのコードパスではautostashは無視されます。
更新しました。 マリウシュ・パウエルスキ 尋ねる コメント欄 面白い質問ですね。
ということで、みんなが書いているのは
autostash
を実行すると、リベース(またはpull --rebase
).
で普通にpullしたときの自動スタッシュについては誰も取り上げない。 マージ .
では、そのための自動切り替えはないのでしょうか?それとも私が何か見落としているのか?私はgit pull --rebase
が、OPは"について質問しています。 標準 git pull
回答
は
オリジナルスレッド
このオートスタック機能について議論していますが、元々この機能は
git pull
(マージ)と
git pull --rebase
.
でも... Junio C Hamano (Git メンテナ) はこう指摘しています。
もし
pull-merge
は、quot; annoyance".を誘発するようなものでした。 このトピックのきっかけとなった、ローカルな変更が重なるという定義で この内部的な "stash pop" はマージされた経路に触れることになります。 この場合、マージの結果、ドロップされることはなく、そのままになります。 さらにコンフリクトを解決しなければならない。私は、次のように推測しています。
pull.autostash
の構成は、悪い意味で苦痛を伴うワークフローを助長するため、良い追加とは言えません。
単純なケースでは痛くないかもしれませんが、ローカルな変更が複雑になると、ないより積極的に痛くなり、構成が選択するインセンティブを奪ってしまいます。この方程式は、"pull-rebase" の場合、"rebase" のように、多少異なっています。 はクリーンな作業ツリーから開始するように要求するので、"ダウンロードと という悩みが大きく感じられます。 という疑念があります。 それを緩めることが、本当の問題に対するより生産的な修正になるかもしれません。
だから、古典的なプルマージに関しては、したほうがいい。
を実行する前に、作業ツリーにあるWIPの性質について考えるよう、ユーザに促す。
git pull
" .
他の人がやっていることを邪魔するかもしれない、あまりに複雑な獣なのか、それとも は、彼が隠しておいてポンと戻せるような些細な変更なのでしょうか?前者であれば、「"」をやる方がはるかに良いだろう。
checkout -b
を実行し続けることです。 ローカルでの変更がある程度良い形になるまで作業し "コミット"してから、元のブランチにプルしてください。後者であれば、彼はやったほうがいい。
- "
git pull
"です。- を実行し、コンフリクトを発見したら
git stash
,git merge FETCH_HEAD
とgit stash pop
とはいえ、Git 2.27 (2020年第2四半期) では、"
git pull
がない場合に警告を発するようになりました。
pull.rebase
コンフィギュレーションが存在せず
--[no-]rebase
または
--ff-only
が与えられると、マージが発生します。
参照
コミット d18c950
(2020年3月10日)による
アレックス・ヘンリ(
alexhenrie
)
.
(によって統合されました。
ジュニオ・C・ハマノ--。
gitster
--
で
コミット 1c56d6f
, 2020年3月27日)
pull
: ユーザーがリベースするかマージするかを言わなかった場合に警告します。
<上 署名: Alex Henrie
<ブロッククオート
Git の初心者は、しばしば " と言うのを忘れてしまうことがあります。
pull --rebase
"で、上流からの不要なマージが発生してしまいます。
彼らが通常望むのは、"
pull --rebase
より単純なケースでは "、あるいは "
pull --ff-only
"で、メインの統合ブランチのコピーを更新し、それらの作業を個別にリベースします。
は
pull.rebase
の設定変数は、より単純なケースで彼らを助けるために存在しますが、これらのユーザーにそれを認識させるメカニズムはありません。
がない場合は、警告メッセージを表示する。
--[no-]rebase
オプションがなく、かつ
pull.rebase
設定変数が与えられます。
これは、決して " を望んでいない人に不便を強いることになります。
pull --rebase
"、これまで特別なことをする必要はなかったのですが、不便の代償はユーザーごとに一度だけ支払われるため、多くの新規ユーザーを助けるためには妥当なコストと言えるでしょう。
Git 2.27(2020年第2四半期)で、"
git merge
"を学習します。
--autostash
"オプションと、新しい
merge.autostash
の設定です。
参照
コミットd9f15d3
,
コミット f8a1785
,
コミット a03b555
,
コミット 804fe31
,
コミット 12b6e13
,
コミット 0dd562e
,
コミット 0816f1d
,
コミット 9bb3dea
,
コミット 4d4bc15
,
コミットb309a97
,
コミットf213f06
,
コミット 86ed00a
,
コミット facca7f
,
コミットbe1bb60
,
コミット efcf6cf
,
コミット c20de8b
,
コミットbfa50c2
,
コミット 3442c3d
,
コミット 5b2f6d9
(2020年04月07日)をご参照ください。
コミット 65c425a
(2020年04月04日)、および
コミットメントfd6852c
,
コミット 805d9ea
(2020年3月21日)による
デントン リウ (
Denton-L
)
.
(によって統合されました。
ジュニオ・C・ハマノ--。
gitster
--
で
コミットbf10200
2020年4月29日)
pull
: --autostashを渡すとマージされます。
署名: Denton Liu
<ブロッククオート
以前は
--autostash
としか機能しません。
git pull --rebase
.
しかし、前回のパッチで、mergeが学習した
--autostash
のように、この制限を設ける必要はないでしょう。
プルをパスするように教える
--autostash
をマージするようにしました。
そして
<ブロッククオート
rebase
使用apply_autostash()
sequencer.c よりサインオフバイ:Denton Liu
は
apply_autostash()
の関数は
builtin/rebase.c
とは十分似ています。
apply_autostash()
の関数は
sequencer.c
というように、受け取るargの種類を除けば、ほとんど同じようなものです。そこで
sequencer.c
のバージョンを extern にして、rebase で使用します。
リベース版が導入されたのは
6defce2b02
("組み込みのリベース: サポート
--autostash
option", 2018-09-04, Git v2.20.0-rc0 --。
マージ
に記載されている
バッチ#8
) を、シェルからCへの変換の一部として使用することができます。
当時、対話型リベースをシェルからCに変換する別のプロジェクトが進行中で、リファクタリングによってそれらと衝突することを避けたかったため、この関数を複製することを選択したのだそうです。
sequencer.c
のバージョンです。
apply_autostash()
.
どちらの取り組みもとっくに終わっているので、今は自由に組み合わせてもいいのです。
Git 2.30 (2021年第1四半期) では、UIが改善されました。
参照
コミット e01ae2a
(2020年11月19日)によるものです。
ヨハネス・シンデリン(
dscho
)
.
(によって統合されました。
ジュニオ・C・ハマノ--。
gitster
--
で
コミット 290c940
, 2020年11月30日)
pull
: 設定に関するヒントを色付けします。
pull.rebase
ポインテッドバイ Ævar Arnfjörð Bjarmason(エバール・アルンフィヨルズ・ビャルマソン
サインオフ:Johannes Schindelin
で
d18c950a69f
("
pull
: リベースするかマージするかをユーザーが指定しなかった場合に警告するようになりました", 2020-03-09, Git v2.27.0-rc0 --。
マージ
に記載されている
バッチ2号
を設定することで、プルをマージするのかリベースするのかを意識的に判断するようユーザーに促すための新しいヒントが導入されました。
pull.rebase
という設定があります。
この警告は、明らかにユーザーへの助言を意図したものですが、指摘されているように
このスレッド
を使用しています。
warning()
の代わりに
advise()
.
その結果、他の似たようなメッセージと同じようにアドバイスが色づけされないということがあります。
そこで
advise()
の代わりに
Git 2.33 (Q3 2021) で、git pull --rebase が簡略化されました。
参照
コミット a7d18a1
,
コミットa751e02
,
コミット 3400622
(2021年6月17日)による
フェリペ・コントレラス(
felipec
)
.
(によって統合されました。
ジュニオ・C・ハマノ--。
gitster
--
で
コミット221ec24
2021年07月08日)
pull
: クリーンアップ オートスタッシュチェック
署名: Felipe Contreras
<ブロッククオート
現在、"。
git pull --rebase
"
(
男性
)
は、早送りマージが可能な場合にショートカットを取ります。
run_merge()
は --ff-only で呼び出されます。
ただし、"
git merge
"
(
男性
)
を搭載していました。
--autostash
というオプションがあるため、"
git
引っ張る
--rebase
--autostash``
"
(
男性
)
というのがありました。
と
を使用すると、早送りマージのショートカットが使用され、その後プルに失敗しました。
で修正されました。
コミット f15e7cf
("
pull
: ff
--rebase
--autostash works in dirty repo", 2017-06-01, Git v2.14.0-rc0 --。
マージ
に記載されている
一括7位
) を、マージの早送りのショートカットをスキップするだけです。
後日談 "
git merge
"を学びました。
--autostash
オプション [
a03b555
("
merge
教える
--autostash
option", 2020-04-07, Git v2.27.0-rc0 --。
マージ
に記載されている
バッチ5号
)]、"もそうでした。
git pull
"
(
男性
)
[
d9f15d3
("
pull
: パス
--autostash
to merge", 2020-04-07, Git v2.27.0-rc0 --。
マージ
に記載されている
バッチ5号
)].
そのため、早送りマージのショートカットをスキップする必要はなくなりました。
--rebase --autostash
.
を本質的に元に戻すことで、常に早送りのマージのショートカットを取るようにしましょう。 f15e7cf .
関連
-
[解決済み] テスト
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] Git で、ステージされていない変更を破棄するにはどうしたらいいですか?
-
[解決済み] Gitで変更された複数のファイルのうち、1つのファイルだけを隠す?
-
[解決済み] 特定のファイルを git stash するにはどうしたらいいですか?
-
[解決済み] git stash popとgit stash applyの違いについて
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】Git リポジトリに空のディレクトリを追加するには?
最新
-
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 error: failed to push some refs to remote
-
git push reports an error ! [リモート拒否] master -> master (受信前のフックが拒否されました)
-
[解決済み】ローカルGitブランチとそのリモートブランチを比較する方法
-
[解決済み] git: fatal: リモートリポジトリから読み取れませんでした。
-
[解決済み] git update-index --assume-unchanged <file> を元に戻す。
-
[解決済み] Gitのエラー「object file ... is empty」はどうすれば直せますか?
-
[解決済み] masterブランチとorigin/masterが分岐してしまったので、分岐を解除する方法を教えてください。
-
[解決済み] git で特定のコミットを別のブランチに移動させるには?
-
[解決済み] リベースの完全なキャンセル
-
[解決済み] git rebase、'local' と 'remote' を追跡する