web-dev-qa-db-ja.com

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

基本的に、コミットされていない変更を削除し、マージを行ってから、変更を再適用します。 mergeに、作業ツリーとプルしようとしている変更を自動的にマージするように指示するにはどうすればよいですか?

47
Jeremy Huiskamp

私が知る限り、あなたができる最善のことは、あなたがすでに持っているものですgit stash。私もマージがきれいな木だけを扱いたいのは奇妙だと思います。

20
Norman Ramsey

Subversionから学んだことはすべて忘れてください。

外部の変更を導入する前に必ずコミットしてください。

ほぼ完全に機能しているツリーがあると想像してください-完璧ではないかもしれませんが、ある程度進歩しています。次に、マージを実行し、持ち込んでいるコードが大混乱を引き起こしました(バグが多く、競合が多すぎて対処できないなど)。元に戻すことができたらいいですね。

コミットすればできます。そうしなければ、苦しむだけです。

覚えておいてください:コミットしたものはhaveをプッシュしたものになりませんが、コミットしなかったものは簡単に失う可能性があります。

安全で簡単なことをして、早くコミットし、頻繁にコミットするだけです。

38
Dustin
  • 地元の仕事がコミットされていない場合
    • そして、リモートブランチには存在しない完全に新しいファイルを導入しました。
    • または、ローカル作業の影響を受けるファイルと、リモートからプルする必要のある変更の影響を受けるファイルとのオーバーラップがゼロです:
      • あなたは幸運です:git pullは「正常に機能します」
    • さもないと:
      • ローカルの変更がプルする変更と重複しない場合:
        • git stashが機能します:
          • git stash save
          • git pull
          • git stash pop
      • ローカルの変更がプルする変更と重複している場合:
        • git stashは手動の競合解決が必要です:
          • git stash save
          • git pull
          • git stash pop
          • マージの競合を解決する
          • git reset
          • git stash drop
  • 地元の仕事がコミットされている場合
    • また、ローカル作業の影響を受けるファイルとの影響を受けるファイルとの重複はゼロです。
      • あなたは幸運です:git pullは「正常に機能します」
      • しかしながら: git pull --rebase履歴がすっきりしているため、「さらに効果が上がる」
      • マージコミットはありません。上流の変更後に変更がコミットされます
    • さもないと:
      • git pullには手動での競合解決が必要です:
        • git pull
        • マージの競合を解決する
        • git add FILE競合するファイルごとに
        • git commit
      • git pull --rebase履歴が明確になったため、「さらにうまく機能する」可能性があります
        • ただし、マージの競合を解決することははるかに困難な場合があります

詳細な説明については、次を参照してください: https://happygitwithr.com/pull-tricky.html

3

git mergeローカルリポジトリに関して変更されたファイルの変更をマージします。これにより、マージがうまくいかなかったときに変更が失われるのを防ぐことができます。

マージするCVSとSVNのアプローチでは、更新前にファイルを手動でコピーせず、マージ時にスクランブルをかけた場合、手動で再編集して良好な状態に戻す必要があります。

マージを行う前に変更をコミットするか、隠しておくと、すべてが元に戻ります。マージがうまくいかない場合は、いくつかの方法を試してみて、最も効果的な方法を使用できます。

実験的な変更またはデバッグの変更をコミットする場合は、git rebase経由で取得したコミット後にそれらを移動するにはgit mergeそれらを簡単に削除したり、誤ってリポジトリにプッシュしたりするのを防ぐため。

git rebase共有リポジトリにプッシュしたブランチで、そのリポジトリからプルしているすべての人に悲しみを引き起こします。

git stashこれらの場合ですが、編集してコミットしていないファイルがマージによって変更された場合にのみ使用します。

2
Jamey Hicks