我々は行うとgit merge
またはgit fetch and git merge
にほぼ等しいgit pull
、成功した結果の2種類のマージ、早送り(FF)のいずれかがあるか非早送り(no-ff)マージが行われます。参照:git-merge。 「FAST-FORWARD MERGE」と「TRUE MERGE」をご覧ください。
一部のリモートリポジトリでは、非ffマージになるプッシュの受け入れを拒否する戦略があります。プッシュする直前にローカルブランチがリモートブランチの適切なスーパーセットであることを常に確認する方がよいでしょう。
ここでは、適切なスーパーセット、または厳密なスーパーセットは、適切なサブセットと共に、数学の意味を示します。
ブランチマスタがA-B-C-D
の場合、ブランチプライベートはA-B-C-D-E-F
のようになりますが、マスタはプライベートの適切なサブセットです。プライベートからマスターへ、またはプライベートをマスターにプッシュする、またはプライベートをマスターにマージするには、早送りマージを行います。マスターからプライベートへ、またはマスターからプライベートに、またはマスターをプライベートにマージすると、あなたにすべてのことを知らせることを除いて、何も起こりません。
ブランチプライベートがA-B-C-E
の場合、マスターはプライベートのサブセットではなく、その逆もあります。プル、プッシュ、マージはすべて、早送りではないマージにつながります。
git fetch origin master
git checkout -b master FETCH_HEAD
#change the code
git add .
git commit
#right before I am going to `git push`
git fetch origin master
git cherry HEAD FETCH_HEAD
#if there is any new commit in the remote master, `git cherry` will list it.
#if `git cherry` outputs nothing, which means the local master is a
#superset of the remote master, my `git push` will make a
#fast-forward merge.
git push origin master:master
...
#else if `git cherry` outputs something, like `+ 12345667800abcdef`,
#which measn someone else has updated the remote master,
#my `git push` will make a non-fast-forward merge.
#suppose the local master is like `A-B-C-D` and the remote master is like `A-B-C-E-F`
git reset C --hard
git pull origin master
git cherry-pick D
#now the local master is like `A-B-C-E-F-D'`, which is now a proper
#superset of the remote master
git push origin master:master
元に戻すには歴史を破壊しないだけの引数からコミット戻り:
は、ここで私は私の毎日の仕事でやっているものです。今回の状態に戻す前にマスターを元の状態に戻し、適切なコミットを元に戻すことを検討してください。 – Basilevs
@Basilevsコミットの履歴はありますが、個々のファイルのコミット履歴が失われている場合はあります。私はコミットの歴史を破壊すべきではないが、なぜファイルの履歴が失われたのか分からないという印象を受けていた。 –