web-dev-qa-db-ja.com

git rebaseで保存/ポップの変更を自動的に隠しますか?

私のgitワークフローはリベースを多く使用します。私は常にアップストリームの変更(私が分岐したメインリポジトリ)をフェッチしてからブランチにマージし、リベースして不要な(私にとっては:D)マージコミットとツリー分割を削除します。

このワークフローで私を悩ます1つのことは:

$ git rebase upstream/master
Cannot rebase: You have unstaged changes.
Please commit or stash them.

$ git stash
Saved working directory and index state WIP on cc: abc1234 Merge remote-tracking branch 'upstream/master' into local_branch
HEAD is now at abc1234 Merge remote-tracking branch 'upstream/master' into local_branch

$ git rebase upstream/master
First, rewinding head to replay your work on top of it...
Applying: awesome code change

$ git stash pop

したがって、ここには4つのコマンドがあります。1はリベースに失敗、2はスタッシュ、3はリベース、4はスタッシュポップです。 3以外は何も考えない仕事です。

質問は次のとおりです。自動化の最も推奨される方法は何ですか? git stash/rebase/popを毎回実行するエイリアスですか? rebaseを強制的に隠したり、後で再適用する別のコミットとして扱うgit configがありますか?他に何か?

33
gcb

1つの簡単な答え:git rebase -i --autosquash --autostash <tree-ish>

-i = interactively rebase

https://devdocs.io/git/git-rebase


この意志...

  • 変更を自動保存する
  • <tree-ish>からインタラクティブにリベースします
    • スカッシュとフィックスアップの自動配置
  • リベース後の作業ディレクトリでの自動ポップスタッシュ

tree-ishは、commit hashまたはbranch nameまたはtagまたは 任意の識別子 .

16
abhisekp

git-up と呼ばれる外部ツールを使用できます。これは、すべてのブランチに対して正確に言うことを行います。これは、クリーンな履歴グラフを維持するのにも役立ちます。

私は何年も使用してきましたが、特にあなたがgitの専門家でない場合、かなりうまく機能します。自動リベース機能を追加する場合は、失敗したリベースから適切に回復する方法を知っておく必要があります(続行、中止など)。

インストール

シェルを開いて実行します:

Sudo gem install git-up

構成

グローバル設定ファイル(~/.gitconfig)、および以下を追加します。

[git-up "fetch"]
    all = true    # up all branches at once, default false
    Prune = true  # Prune deleted remote branches, default false
[git-up "rebase"]
    # recreate merges while rebasing, default: unset
    arguments = --preserve-merges
    # uncomment the following to show changed commit on rebase
    # log-hook = "git --no-pager log --oneline --color --decorate $1..$2"

その他のオプションについては、 公式ドキュメント をご覧ください。

呼び出し

すべてが適切に構成されている場合は、次を実行します。

git up

これは、次を実行することと(ほぼ)同等です。

git stash
git fetch --all
[foreach branch]
    git rebase --preserve-merges <branch> <remote>/<branch>
    git merge --ff-only <branch>
[end foreach]
git checkout <prev_branch>
git stash pop
2
giosh94mhz

フェッチを含む、1つのコマンドでのワークフロー全体:

git pull --rebase --autostash [...]
2
Marc

tjsingleton blogg からの回答

次のコマンドエイリアスを作成します。

git stash && git pull --rebase && git stash pop

update

あなたがアイデアを使用している場合、汚れた作業ディレクトリでプッシュすると、ダイアログが表示され、リベース/マージを選択し、自動的にスタッシュ、リベース/マージ、ポップします。

1
Sisyphus