web-dev-qa-db-ja.com

Gitマージの競合を解決する

Gitリポジトリは、いくつかの開発者のローカルマシンに複製されています。リポジトリ内のコードにいくつかの変更が加えられました。エラーが発生しています:

error: Your local changes to the following files would be overwritten by merge:

        public_html/sites/file
        public_html/sites/file1.txt
        public_html/sites/file2.txt
Please, commit your changes or stash them before you can merge.
Aborting

私はかなりの数のスレッドをオンラインで読んでおり、いくつかの異なるオプションが提案されています。 1つのアプローチが実行されました。

 git stash
 git pull
 git stash pop

私はスタッシングの基本原則を理解していると思います。私の質問は、これは良い解決策ですか、このアプローチを使用して問題に遭遇する可能性がありますか?私はウェブ開発全般について合理的な理解を持っていますが、私はかなり基本的なGitユーザーであり、この時点でトラブルから抜け出す能力はあまりありません。

32
g_thom

git stashは完全に合法ですが、グレッグが言ったように、何らかの理由で競合を修正することは奇妙になります。しかし、それらはまだ修正可能であり、実際には何もしません。スタッシュを再適用するためのコマンドは、git stash apply、ただしpopは私が知らない代替手段かもしれません(または別のことを行う可能性があるので、わかりません。そのため、おそらくapplyを使用したいでしょう)

マージする前にこれらの変更をコミットしたくない理由はありますか?一般的にそれは正しいことです。

別のオプションは次のとおりです。

git stash
git checkout -b newwork
git stash apply
git commit ...

これにより、新しいブランチが作成され、競合なしでマスターを最新の状態にできます(マスターを再度チェックアウトしてから、プルまたはフェッチ+マージ)。次に、ブランチを(まだマスター上にある状態で)git merge newwork。マスターでの競合を解決しながら、競合なしで新しいワークの作業を保持できます。競合が本当に物事を台無しにすることを心配している場合、これは少し安全ですが、一般的に、競合はプロセスの一部に過ぎないので、それらについてあまり心配しないでください。

15
kylben

always新しいコードをプル(マージ)する前にローカルの変更をコミットすることをお勧めします。コミットしないと、Gitはローカルの変更をどのように管理したいかを知りません。きれいな作業ツリーとのみマージします。

同じファイルがローカルおよび他の誰かによって変更されているため、マージで競合が発生する可能性があります。私の経験では、実際のmerge操作からの競合の解決は、stash pop操作からの同じ競合の解決よりも少し簡単です。

6
Greg Hewgill

別の解決策があります:

git reset --hard FETCH_HEAD

ほとんどの場合に機能します。

3
Narga

最初にすべきこと:

git checkout -- public_html/sites/file
git checkout -- public_html/sites/file1.txt
git checkout -- public_html/sites/file2.txt

次の一歩:

git pull Origin master
1
MrBii