web-dev-qa-db-ja.com

git stashとapply

私はgitの初心者であり、スタッシングがどのように機能するかについては明確ではありません。

ブランチマスターで作業しており、git pullを実行しようとして、ローカルの変更が上書きされ、スタッシュまたはコミットする必要があるというエラーを受け取ったとします。変更をステージングしてgit stashを実行していない場合は、git pullを実行し、正常に更新しますが、git stash applyを実行するとどうなりますか?

一般に、誰かがファイルを変更してgit pullを実行した場合、run git stash applyを実行するとどうなりますか?ファイルを隠したときにステージングされたかどうかに関係なく、更新されたファイルは上書きされますか? git pullで更新したすべてのファイルを、隠されたファイルで上書きしますか?

28
neridaj

stash gitコマンドは、stashがどこから来たかを覚えています:

   git stash list

出して

   stash@{0}: WIP on master.color-rules.0: 35669fb [NEW] another step toward initial cube

作成されたSHA1を確認できる場所。したがって、git stash、git pull、git stash applyで競合が発生した場合、stashはドロップされません(ドロップした場合、または適用が成功した場合のみ)。したがって、git stashリストからSHA1をいつでも取得でき、

   git checkout 35669fb
   git stash apply

動作することが保証されています。 -bオプションを使用して、その復旧のブランチ名を指定することをお勧めします。

そうは言っても、私のお気に入りのワークフローは、このような問題を回避するために常に新しい「個人」名でチェックアウトすることです

3
Sebastien

通常、コミットされていない変更は常に悪いです。変更が適切である場合、コミットするか、破棄するよりも悪いです。コミットされていない変更を行っている状態でgit操作を行うと、トラブルが発生する傾向があり、コミットしていないことをgitが認識していないため、gitは役に立ちません。

それでは、質問に戻ります。 ;)

Gitは一般的にかなりスマートです。 stashを適用すると、変更が他の変更とマージされます。ほとんどの場合、これは機能します。

同じ行を別の方法で変更したために、変更が実際に競合する場合、gitが通知し、自分で競合を解決する必要があります。 -この場合でも、gitはgit mergetool、適切なコマンドを起動して競合を表示し、競合を1つずつ解決します。

1
michas