1. ホーム
  2. git

[解決済み] git pull "で保留中の変更を自動的にstashしたりpopしたりできますか?

2022-05-05 08:34:07

質問

解決方法がわかりません。

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 を実行します。 stashpop を踊ってくれませんか?

このコマンドに違う名前がついていても大丈夫です。

のシェルエイリアスを作成する 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 .