--ignore-unmerged
オプションを使用した git pull
の実行
ローカルリポジトリとリモートリポジトリの間に競合を作成したので、git pull --ignore-unmerged
オプションを使用してこの競合を解決する方法を探ってみましょう。
--ignore-unmerged
オプションの理解
--ignore-unmerged
オプションは、競合が発生した場合に、Git に対してリモートの変更をローカルの変更よりも優先させるよう指示します。これは、リモートの変更がローカルの変更よりも重要であることがわかっている場合に便利です。
現在のマージを中止する
--ignore-unmerged
オプションを使用する前に、進行中の現在のマージを中止する必要があります。
cd ~/project/git-pull-demo
git merge --abort
このコマンドは、作業ディレクトリをマージ試行前の状態に戻します。ファイルの内容を確認してみましょう。
cat file1.txt
これで、ローカルの変更のみが表示されるはずです。
This is the first line of the file.
This line was added locally.
--ignore-unmerged
オプションの使用
次に、git pull --ignore-unmerged
オプションを使用しましょう。
git pull --ignore-unmerged origin main
Git が依然として競合を報告することに気づくかもしれません。
From /home/labex/project/remote-repo
* branch main -> FETCH_HEAD
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
Automatic merge failed; fix conflicts and then commit the result.
これは、--ignore-unmerged
オプションが名前が示すよりも少し異なる動作をするためです。このオプションは、ローカルの変更を無視して直接競合を解決するわけではありません。代わりに、未マージのエントリがある場合でも、Git がマージを続行できるようにします。
実際に起こったことの理解
リモートの変更をローカルの変更よりも優先する正しい方法は、--strategy-option theirs
オプションを使用することです。
git reset --hard ## 警告: これによりすべての未コミットの変更が破棄されます
git pull -X theirs origin main
出力は以下のようになるはずです。
From /home/labex/project/remote-repo
* branch main -> FETCH_HEAD
Updating xxxxxxx..xxxxxxx
Fast-forward
file1.txt | 1 +
1 file changed, 1 insertion(+)
このコマンドは、Git に対して、ローカルの変更(「ours」)よりもリモートの変更(「theirs」)を優先して自動的に競合を解決するよう指示します。
現在のファイルの内容を確認してみましょう。
cat file1.txt
以下のように表示されるはずです。
This is the first line of the file.
This line was added by a team member.
見ての通り、リモートの変更がローカルの変更よりも優先されています。--strategy-option theirs
オプションは、多くの人が誤って --ignore-unmerged
が行うと思っていることを達成するより直接的な方法です。
--ignore-unmerged
を使用するタイミング
--ignore-unmerged
オプションは、競合のないファイルの更新をプルし、競合するファイルは後で手動で解決する場合に実際に役立ちます。
これを適切に実証するために、別のシナリオを作成しましょう。
## ローカルに新しいファイルを追加する
echo "This is a new local file." > local_file.txt
git add local_file.txt
git commit -m "Added local_file.txt"
## チームメンバーのリポジトリで変更を作成する
cd ~/project/team-member-repo
echo "This is a second line by team member." >> file1.txt
echo "This is a new remote file." > remote_file.txt
git add file1.txt remote_file.txt
git commit -m "Team member made more changes"
git push origin main
## 自分のリポジトリに戻る
cd ~/project/git-pull-demo
## file1.txt に別の変更を加える
echo "This is another local change." >> file1.txt
git add file1.txt
git commit -m "Made another local change"
ここでプルを試みると、競合が発生します。
git pull origin main
出力:
From /home/labex/project/remote-repo
* branch main -> FETCH_HEAD
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
Automatic merge failed; fix conflicts and then commit the result.
マージを中止し、--ignore-unmerged
を使用して試してみましょう。
git merge --abort
git pull --ignore-unmerged origin main
これでも依然として競合が表示されるかもしれませんが、競合していないすべての変更(remote_file.txt
など)を取得することができ、競合するファイル(file1.txt
)は手動で解決することができます。