3

作業ディレクトリにローカルの変更があると、ブランチの切り替えが失敗することがありますが、次のフローは機能します。

  • スタッシュセーブ
  • 分岐を切り替える
  • スタッシュ ポップ

どうして?git はローカル作業ディレクトリの変更をターゲット ブランチに適用する方法を知りませんか? この手順が必要になった設計上の選択は何ですか? この少し長い手順を回避するために使用できるフラグはありますか?

更新:
ブランチを切り替えるときに、ローカルの変更をローカルの変更として保持したいとします。時にはそれは実用的なシナリオです...

4

3 に答える 3

4

現在のブランチがダーティで、ブランチを切り替えようとするシナリオは 2 つあります。

  1. 変更をコミットするのを忘れました。

    その場合、git は、別のブランチに切り替えると変更が失われることを警告します。これは基本的にデフォルトの想定であり、エラー メッセージがそのまま書かれている理由です。

  2. 変更は一時的なものであり、とにかく切り替えたい。

    その場合、変更を隠してから、切り替え後に再度適用する必要があります。Git は、これがあなたの望むものだとは決して考えません。理由を推測する必要があるとすれば、それはおそらく Linus がこれを頻繁に行わないためです。

git はあなたの心を読むことができないので、あなたが commit するか stash するかを指示するのを待ちます。エラーメッセージでは、gitがあなたの心を読み取ろうとすると、スタッシュではなくコミットしたいと推測するでしょうが、あなたの場合は間違った推測になるでしょう。


追加回答

返信が大幅に遅れて申し訳ありませんが、今日、更新された質問に気づきました。

ローカルの変更については、私の戦略はローカルの変更ブランチを作成することです。次に、マスターの代わりにそこからすべての機能ブランチをフォークします。通常、ローカルの変更はすべての作業ブランチに適用されるため、これは機能します。

ただし、これを行うと、基本的に 2 回リベースする必要があるため、master でのリベースが少し面倒になります。1 回目は local_changes に、次に local_changes からトピック ブランチに。ただし、このためのシェル スクリプトを簡単に作成できます。

# rebase_master.sh
git rebase master local_changes
git rebase local_changes

これのもう 1 つの利点は、環境を再構成する必要がある場合に local_changes を変更すると、すべてのトピック ブランチに変更が反映されることです。

マージして master に戻すには、git rebase masterマージする前にトピック ブランチから local_changes を削除します。

于 2012-11-01T08:57:38.250 に答える
3

HEAD現在のコミットとターゲットのコミットの間で異なるファイルを変更していない限り、ダーティな作業ツリーでブランチを切り替えることは成功します。そうでない場合は、これらのファイルへの変更をマージする必要があり、git checkout簡単に元に戻すことができないことをしようとしていることを警告できません。とにかくこれを行いたい場合は、次の--mergeor-mオプションを使用できgit checkoutます。

git checkout -m branchName
于 2012-11-01T14:09:40.353 に答える
3

質問の最後の部分をカバーするために、これを頻繁に行う場合は、エイリアスを作成して手順を短縮できます。

switch = !f() { git stash && git checkout $1 && git stash pop; }; f

使用法:git switch branchName

于 2012-11-01T09:02:37.923 に答える