Git 2.6以降(2015年9月28日リリース)
の のみ git config
興味深い設定は次のとおりです。
rebase.autoStash
(Git 2.27、2020年第2四半期ではmerge.autostash
、現在も使用可能です。以下を参照してください)
trueに設定すると、操作が始まる前に一時スタッシュが自動的に作成され、操作が終了した後に適用されます。
これは、ダーティなワークツリーでリベースを実行できることを意味します。
ただし、注意して使用してください。リベースが成功した後の最後のstashアプリケーションは、重要な競合を引き起こす可能性があります。デフォルトはfalseです。
それと組み合わせる:
pull.rebase
trueの場合、「git pull」が実行されたときにデフォルトのリモートからデフォルトのブランチをマージするのではなく、フェッチされたブランチの上にブランチをリベースします。
git config pull.rebase true
git config rebase.autoStash true
git pull
汚れた木でも簡単に機能するにはそれで十分でしょう。
その場合、エイリアスは必要ありません。
参照してください53c76dcコミットにより(2015年7月4日)をケビンDaudt( )Ikke
。
(による合併Junio C浜野- gitster
-でe69b408をコミット 2015年8月17日)
pull
:rebase.autostash
有効なときにダーティツリーを許可する
リベースは、ダーティーな作業ツリーに遭遇したときに変更を隠しておくことを学びましたが、git pull --rebase
そうではありません。
rebase.autostash
が有効でない場合にのみ、作業ツリーがダーティかどうかを確認します。
注:autostash を使わずに(rebase.autoStash true
設定されていても)プルしたい場合は、git 2.9(2016年6月)以降です。
pull --rebase --no-autostash
参照450dd1dをコミットし、1662297をコミットし、44a59ffコミット、5c82bcdをコミットし、6ddc97cをコミットし、eff960bをコミットし、efa195dコミット(2016年4月2日)、およびf66398eをコミットし、c48d73bをコミットすることで(2016年3月21日)Mehulジャイナ教(mehul2029
)。
(合併によりJunio 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
は、ローカル履歴がアップストリームに早送りされたときに、「」は自動スタッシングを行いませんでした。
Tyler Brazier()によるcommit f15e7cf(2017年6月1日)を参照してください。(合併によりJunio C浜野- -でコミット35898ea、2017年6月5日)tylerbrazier
gitster
pull
:ff --rebase --autostash
はダーティーリポジトリで動作します
git pull --rebase --autostash
ダーティーリポジトリで早送りが発生した場合、何も自動保存されておらず、プルに失敗しました。
これは、早送りできるときにリベースを実行しないようにするショートカットが原因でしたが、そのコードパスではautostashは無視されます。
更新:Mariusz Pawelskiがコメントで興味深い質問をしています:
したがって、autostash
リベース(またはpull --rebase
)を実行するタイミングについては、誰もが書いています。
しかし、マージで通常のプルを行う場合、自動スタッシングについて誰も気にしていません。
そのための自動スイッチはありませんか?または、何か不足していますか?私はやりたいのですgit pull --rebase
が、OPは「標準」のgit pull について尋ねました
回答:
元のスレッドこのautostash機能を議論は、それがために、本来の両方に実装されたgit pull
(マージ)とgit pull --rebase
。
しかし... Junio C Hamano(Gitメンテナー)は次のように述べています:
pull-merge
このトピックをトリガーした「煩わしさ」を誘発するものであった場合、定義により、ローカルの変更はマージと重複し、この内部の「スタッシュポップ」はマージが触れたパスに影響し、おそらく「ドロップ」にはなりません。 「しかし、解決すべきさらなる紛争を残します。
pull.autostash
構成は悪い、苦痛を引き起こすワークフローを助長するので、良い追加ではないと思います。
単純なケースでは害はないかもしれませんが、ローカルの変更が複雑な場合、それがないことよりも積極的に害を及ぼし、構成は選択するインセンティブを奪います。
「pull-rebase」の場合、方程式は多少異なります。「rebase」ではクリーンな作業ツリーから開始するように要求されるため、「ダウンロードしてから停止」の煩わしさが大きく感じられます。私は本当の問題のより生産的な修正であるかもしれない緩めるのではないかと疑っています。
したがって、古典的なプルマージに関しては、次のようにするのがよいでしょう。
「git pull
」を実行する前に、ユーザーが作業ツリーで持っているWIPの性質について考えることをユーザーに促します。
他の人がしていることに干渉するかもしれないそれはあまりにも複雑な獣ですか、それとも彼が隠してそれを取り戻すことができる些細な変化ですか?
前者の場合、「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
指定されていない場合に警告することを学びました(マージの結果になります)。
Alex Henrie()によるコミットd18c950(2020年3月10日)を参照してください。(合併によりJunio C浜野- -で1c56d6fコミット 2020年3月27日)alexhenrie
gitster
pull
:ユーザーがリベースするかマージするかを言わなかった場合に警告する
サインオフ:Alex Henrie
多くの場合、初心者のGitユーザーは " pull --rebase
"と言うのを忘れて、アップストリームからの不要なマージが発生します。
彼らが通常望んでいるのは、 " pull --rebase
"単純なケースでは " pull --ff-only
" または " "メインの統合ブランチのコピーを更新し、作業を個別にリベースすることです。設定変数は単純な例でそれらを助けるために存在しているが、それのこれらのユーザーに認識させるためのメカニズムはありません。
pull.rebase
--[no-]rebase
コマンドラインからオプションがなく、pull.rebase
構成変数が指定されていない場合、警告メッセージを発行します。
これはpull --rebase
、特別なことをする必要がなかった" "をしたくない人には不便ですが、不便の費用はユーザーごとに1回だけ支払われます。
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年4月7日)、コミット65c425a(2020年4月4日)、およびfd6852cをコミットし、Denton Liu(Denton-L
)によって805d9ea(2020年3月21日)をコミットします。
(合併によりJunio C浜野- gitster
-でbf10200コミット 2020年4月29日)
pull
:--autostashを渡してマージします
サインオフ:Denton Liu
以前はで--autostash
のみ機能していましたgit pull --rebase
。
ただし、前回のパッチでは、マージも学習さ--autostash
れたため、この制限が必要になる理由はありません。リベースの場合と同じように、
プルを渡し--autostash
てマージに渡します。
そして:
rebase
:apply_autostash()
sequencer.cから使用
サインオフ:Denton Liu
のapply_autostash()
関数は、受け入れる引数のタイプを除いて、ほとんど互換性があるという点で関数builtin/rebase.c
と十分に似ていapply_autostash()
ますsequencer.c
。確認しsequencer.c
たバージョンexternをすると、リベースでそれを使用します。
リベースバージョンがで導入された6defce2b02(「リベース組み込み:サポート--autostash
オプション」、2018年9月4日、Gitのv2.20.0-RC0 - マージに記載されているバッチ#8)Cへの変換シェルの一部として。
当時、インタラクティブなリベースをシェルからCに変換する別の進行中のプロジェクトもあり、彼らはのsequencer.c
バージョンをリファクタリングすることでそれらと衝突したくなかったため、関数を複製することにしましたapply_autostash()
。
両方の取り組みが長い間行われているので、自由に組み合わせることができます。