git mergeが作業ツリーへのコミットされていない変更を処理する方法は?
質問
現在、同僚と私は両方ともmasterブランチで作業しています。作業ツリーには、コミットしたくないコードがいくつかあります(ステートメントのデバッグなど)。同じファイルの一部に変更をコミットする場合、それらをマージできません。
$ git merge origin/master
Updating 1b8c5c6..eb44c23
error: Entry 'blah.java' not uptodate. Cannot merge.
Subversionのバックグラウンドから来て、リポジトリから変更をプルするときに作業ツリーが自動的にマージされ、競合がある場合は手動で解決することに慣れています。
gitでこれを行う最も簡単な方法は次のとおりです。
$ git stash
$ git merge origin/master
$ git stash pop
本質的に、コミットされていない変更を削除し、マージしてから変更を再適用します。作業ツリーとプルしようとしている変更を自動的にマージするようマージに指示するにはどうすればよいですか?
解決
私が知る限り、できることは git stash
で既に持っていることです。私も、mergeがクリーンなツリーだけを処理したいのは奇妙だと思います。
他のヒント
Subversionから学んだことはすべて忘れてください。
外部の変更を導入する前に常にコミットします。
ほとんど機能しているツリーがあると想像してください。完全ではないかもしれませんが、ある程度進歩しています。次に、マージを実行し、持ち込んでいるコードを破壊しました(バグが多かったため、処理する競合が多すぎたなど)。単に元に戻すことができたらいいと思いませんか?
コミットすると、できます。そうしないと、苦しむことになります。
覚えておいてください:コミットするものはプッシュするものではありませんが、コミットしないものは簡単に失う可能性があります。
安全で簡単なことをして、早期にコミットし、頻繁にコミットするだけです。
- ローカル作業がコミットされていない場合
- また、リモートブランチには存在しないまったく新しいファイルを導入しました:
- または、ローカル作業の影響を受けるファイルは、リモートからプルする必要がある変更の影響を受けるファイルとゼロで重複しています:
- 運がよければ:
git pull
は" just work"
- 運がよければ:
- それ以外の場合:
- ローカルの変更がプルする変更と重複していない場合:
- git stashは動作します:
-
git stash save
-
git pull
-
git stash pop
-
- git stashは動作します:
- ローカルの変更が、プルする変更と一部重複している場合:
- git stashでは、手動で競合を解決する必要があります。
-
git stash save
-
git pull
-
git stash pop
- マージの競合の解決
-
git reset
-
git stash drop
-
- git stashでは、手動で競合を解決する必要があります。
- ローカルの変更がプルする変更と重複していない場合:
- ローカル作業がコミットされている場合
- また、ローカル作業の影響を受けるファイルは、影響を受けるファイルとゼロ重複します
- 運がよければ:
git pull
は" just work" - ただし、
git pull --rebase
は「さらに良く機能します」よりクリーンな履歴のため - マージコミットはありません。アップストリームの変更後に変更がコミットされます
- 運がよければ:
- それ以外の場合:
- git pullでは、手動で競合を解決する必要があります。
-
git pull
- マージの競合の解決 競合する各ファイルの
-
git add FILE
-
git commit
-
-
git pull --rebase
は依然として「より良く機能する」可能性があります。きれいな歴史のため- ただし、マージの競合を解決するのははるかに困難です
- git pullでは、手動で競合を解決する必要があります。
- また、ローカル作業の影響を受けるファイルは、影響を受けるファイルとゼロ重複します
詳細な説明については、 https://happygitwithr.com/pull-tricky.htmlをご覧ください。
ローカルリポジトリに関して変更があるファイルの変更をマージするように git merge
に指示することはできません。これにより、マージがうまくいかないときに変更を失うことがなくなります。
CVSとSVNのマージ方法では、更新前にファイルを手動でコピーせず、マージ時にそれらをスクランブルした場合、手動で再編集して良好な状態に戻す必要があります。
変更をコミットするか、マージする前にそれらを隠しておくと、すべてが元に戻ります。マージがうまくいかない場合は、いくつかの方法を試して、うまく機能させる方法を試してください。
実験的またはデバッグの変更をコミットする場合は、 git merge
で取得したコミットの後に git rebase
を使用して移動し、削除しやすくすることができますまたは誤ってリポジトリにプッシュしないようにします。
共有リポジトリにプッシュしたブランチで git rebase
を使用すると、そのリポジトリからプルしているすべての人に悲しみが生じることに注意してください。
これらの場合は git stash
を使用しますが、マージによって編集済みでコミットされていないファイルが変更される場合にのみ使用します。