1

私は最近、バージョン管理に Git を使用するプロジェクトに取り組み始めました。2 つの欠陥を修正する必要がDefect1ありDefect2ます。を修正しDefect1、 とをそれぞれDefect2変更する必要があります。これら 2 つのファイルは相互に関連していません。File1File2

それぞれの欠陥に個別の Git ブランチで取り組みたいと考えています。と の 2 つのブランチを作成fix_Defect1fix_Defect2、独立して作業したいと考えています。修正は複雑であるため、1 つの修正を完了して、別の修正に切り替える前にコミットすることはできません。fix_Defect1からに切り替えるとfix_Defect2、 に加えられた変更File1も表示されます (逆も同様です)。これが起こらないようにする方法はありますか?

Git のヘルプからは、どうにもわかりませんでした。また、 SOで複数のブランチでのgit work を検索したところ、 Git と複数のブランチでの作業 と 複数のブランチでの git の使用が見つかりました。これらは近いですが、私の質問とは多少異なります。

ブランチごとにリポジトリの複数のコピーを別のディレクトリに複製できますが、そうすると、ディスク領域を浪費するだけでなく、Git のブランチ機能をフルに活用できなくなるようです。このシナリオを処理するための適切なアプローチを提案していただけますか?

4

1 に答える 1

3

問題は、作業ディレクトリ内のファイル (例:file1およびfile2) を変更しているが、それらの変更をコミットまたは隠していないという事実から発生します。最良の解決策は、ブランチを切り替えたいときに変更をコミットすることです。

git add file1 file2 ;# add whichever ones you've fixed
git commit ;# commit the work in progress
git checkout fix_Defect2 ;# now checkout the other branch

もちろん、進行中の作業や破損した可能性のあるコードを含むキッチン シンク コミットは、履歴には特に適していません。git rebase後で履歴をクリーンアップするためにいつでも使用できます。たとえば、詳細についてはこの回答を、その背後にある哲学についてはこの回答を参照してください。

最後に、作業をコミットするという考えが気に入らない場合は、 を使用git stashして同じ結果のようなものを取得することもできます。

git stash ;# when you're ready to switch
git checkout fix_Defect2 ;# work on this branch for a while
git commit -A ;# be sure to commit your work on 'fix_Defect2'
git checkout fix_Defect1 ;# checkout the original branch
git stash pop ;# reapply the work you stashed from the working directory

一般的に、隠しソリューションはお勧めしません。スタッシング機構はそれほど堅牢ではなく、2 つの同等に複雑な機能ブランチのバランスを取るのではなく、何かをホットフィックスする必要がある状況向けに設計されています。

詳細については、git-scmドキュメントの「ファイル ステータスのライフサイクル」図を確認してください。

于 2012-09-16T12:17:10.330 に答える