エラー:リベースではプルできません:ステージングされていない変更があります


138

私はプロジェクトで数人の友人と共同作業を始めました。彼らはheroku gitリポジトリを使用しています。

数日前にリポジトリのクローンを作成し、その後いくつか変更を加えたので、最新のアップデートを取得しようとしています

git pull --rebaseはここに記載されているようにコマンドを実行しました(これは正しい方法ですか?):https : //devcenter.heroku.com/articles/sharing#merging-code-changes

次のエラーが発生します。

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

私の推測では、コードをいじくり回して、変更をコミットまたは破棄する必要があります(スタッシュとはどういう意味ですか?)。これは何が起こっているのですか?これが事実である場合、私が行った可能性のあるすべての変更を破棄して、gitリポジトリから更新されたコードを取得するだけです。

私が何ができるかについての考えはありますか?

回答:


173

実行してくださいgit status。これにより、変更されたファイルが表示されます。変更を保持したくない、git checkout -- <file name>または変更をgit reset --hard取り除きたくないと述べたからです。

ほとんどの場合、gitは変更について何をすべきかを教えてくれます。たとえば、あなたのエラーメッセージはgit stashあなたの変更を言いました。これは、それらを保持したい場合です。プルした後、それを行いgit stash pop、変更が再適用されます。

git status また、ファイルがコミット用にステージングされているかどうかに応じて、変更を取り除く方法もあります。


1
これは、仕事を持っているように見えたが、今、私は別のエラー(混同しないで将来の訪問者に新しい質問を開始)直面しています:stackoverflow.com/questions/23518247/...
user3597950

私は文字通りこれを毎回、つい最近にしています。以前は、現在の変更に影響を及ぼさないファイルをプルすることは問題ありませんでしたが、今は、変更をすべて隠しておく必要があります。押すことすらできない、使用せざるを得ないgit push -f
Karma Blackshaw

@KarmaBlackshaw強制的にプッシュする必要はありません。強制プッシュを行う必要がある場合、それはローカルの履歴とリモートの履歴が異なり、この回答がカバーするものとは異なる質問であることを意味します。
シュライス

実際、この質問の範囲が提供するものとは異なります。しかし、現在のブランチを削除し、開発から新しいブランチを作成する方法を見つけました。いくつかの設定が間違っていたのは私のブランチだったと思います。
Karma Blackshaw

91

リベースの実行中に作業中の変更を保持したい場合は、を使用できます--autostashドキュメントから:

リベースを開始する前に、必要に応じてローカルの変更を隠しておき(git-stash [1]を参照)、完了したらstashを適用します。

例えば:

git pull --rebase --autostash

7
これが現代の答えです。
adl 2018

13
autostashをデフォルトの動作にしたい場合は、設定できgit config --global rebase.autoStash true ます。スイッチを渡す必要はありません。
Zoredache

1
これ、私が探していたもの!(コマンドラインスイッチはgit 2.9から利用できますが、オプションrebase.autostashは2.6から利用できます)。
jjmontes

これもうまくいきgit rebase --interactiveます!
Dan Dascalescu

6
なぜこれがデフォルトではないのですか?
ニック

49

リベースでプルすることは一般的に良い習慣です。

ただし、インデックスがクリーンでない場合、つまりコミットされていない変更を加えた場合は、これを行うことはできません。

変更を保持したい場合は、これを回避することができます。

  1. あなたの変更を次のように隠してください: git stash
  2. リベースでマスターからプル
  3. 再適用の変更あなたが(1)に隠し:git stash apply stash@{0}または単純git stash pop

1
これは、仕事を持っているように見えたが、今、私は別のエラーが直面しています(ない混乱将来の訪問者に新しい質問を開始):stackoverflow.com/questions/23518247/...
user3597950

6
@nehemiahjacobまたgit stash pop、最後に隠された変更を適用して、長く記憶されないようにすることもできますapply stash@{0}
Kostas Rousis 2014

私はいつもこれをしなければなりません。もっと簡単な方法は?
アルパー、2016

@alperは通常、別の(機能)ブランチで作業します。私の経験では、自分の作業をコミットした後、マスターに対してフェッチおよびリベースを行うだけなので、隠しておく/ポップする必要はありません。あなたが開発ワークフロー中にその多くのことをやっても自分自身を見つけた場合、あなたは常にあなたにエイリアスを作ることができます.bashrc(またはものは何でも使用):alias stashpull='git stash; git pull; git stash pop'
コスタスRousis

@KostasRousisその通りのエイリアス、笑。私はそれを「sppgit」と呼んでいます
luizfls

30

最初に git status

保留中の変更があるかどうかを確認します。それらを破棄するには、実行します

git reset --hard

これは、仕事を持っているように見えたが、今、私は別のエラー(混同しないで将来の訪問者に新しい質問を開始)直面しています:stackoverflow.com/questions/23518247/...
user3597950

16

これは私にとってはうまくいきます:

git fetch
git rebase --autostash FETCH_HEAD

1
ああ自動保存、それは私に余分な2つのコマンドを節約します。これは正解のIMOです。
Erik Berkun-Drevnig 2017年

10

いつでもできる

git fetch && git merge --ff-only origin/master

そして、(a)上流の変更と競合するコミットされていない変更がある場合、変更はないか、または(b)stash / pull / applyと同じ効果:HEADからの最新の変更とコミットされていない変更を残すリベースそのまま。


6

ステージングされていない変更がgitがファイルのeol規則を修正しようとしているためである場合(いつものように)、スタッシング、チェックアウト、またはリセットを行っても、ファイルは消えません。

ただし、意図が本当にリベースしてステージングされていない変更を無視することである場合は、ブランチをローカルで削除してからもう一度チェックアウトします。

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

出来上がり!私はまだ失敗していません。


2

変更を自動的に隠しておき、リベースごとにそれらを元に戻す場合は、次のようにします。

git config --global rebase.autoStash true

1
これは、Gitの最新バージョンを、Gitがこれまで常に機能していたのと同じように機能させる唯一の答えです。なぜ--autostash自動にできるのに、人々に追加させるのですか?
Andrew Koster
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.