1

別の場所からリモート Git マスター ブランチにいくつかの変更をプッシュし、次にローカル マスター リポジトリで、いくつかのファイルを編集し、他のファイルを削除するいくつかの変更を行い、これらの変更をリモート リポジトリの変更とマージする必要があります。変更をプッシュしようとすると問題が発生します。私のコミットは、リモートブランチで編集および更新された古いファイルをまだ使用しています。リモート ファイルの変更をダウンロードし、自分の変更とマージする方法がわかりません

編集1

これはリポジトリの履歴です。6fee6bf コミットは、リモート リポジトリにプッシュされた以前のコミットに新しいファイルを追加する修正コミットです。

  • aef9a19 (tmp-master) 新しいコミット 2
  • 6fee6bf テストコミット
  • 48ccbc4 (HEAD、オリジン/マスター、マスター) テストコミット
  • 1f466df 古いコミット
  • f006d29 古いコミット x2
  • aba1ce0 古いコミット x3
  • 04f4a67 古いコミット x4
  • e22f33b 古いコミット x5
4

3 に答える 3

3

私の意見では、現在のマスターにすべてがコミットされていることを確認してから、そこから新しいブランチを作成してください。その後、ローカル マスターをリモート マスターにハード リセットします。次に、それらの変更をリベースまたはチェリーピックします。次のようなもの:

git branch tmp-master
git fetch origin
git reset --hard origin/master

以下を使用して、2 つのブランチの違いを簡単に視覚化できます。

git log --decorate=short --oneline --graph --all

他のコミットをチェリーピックし、競合を修正するのがおそらく最も簡単ですが、リベースを試すこともできます。より具体的な手順が必要な場合はお知らせください。

アップデート:

ここまで来たら、次のことを試すことができます (からmaster):

git merge tmp-master

ただし、コミット履歴をよりクリーンにするために、次のことを試してください。

git checkout tmp-master
git rebase master
git checkout master
git merge --ff tmp-master
git branch -d tmp-master
git push origin master

これにより、ローカルのコミットが取得され、リモートの変更の上に再適用されます。基本的に同じ作業を 2 つの異なるマシンで行っているため、多くの「まあ、またマシンを切り替えた」マージ コミットは必要ないでしょう。

現在、競合が発生する可能性があります。それらの世話をするにはいくつかの方法があります。競合があり、ローカルの変更が優先されることがわかっている場合は、次の手順を実行します (tmp-masterブランチから想定し、リベースで競合があると仮定します)。

git rebase --abort
git branch tmp-master-save
git rebase -X theirs master

次に、上記の手順から続けて、すべてが正常に見えるかどうかを確認しますgit checkout mastertmp-master-saveまた、他のブランチを削除することを忘れないでください。安全に保管するためだけに作成しました。これに慣れていない場合は、常に安全メカニズムを用意することをお勧めします。

于 2013-03-01T20:24:27.813 に答える
0

コミットをプッシュする前に、リポジトリで変更を取得するように要求する必要があります。これは、git pull --rebase コマンドを使用して実行できます。変更を取得し、安全に実行できるすべてをマージします。問題が発生した場合は、競合を自分で修正し、それを行い、git rebase --continue を使用してマージを続行するように指示されます。

于 2013-03-01T20:00:21.677 に答える
0

これを行うことをお勧めします:

git fetch origin

git rebase origin/master master --preserve-merges

最初のコマンドfetchは、リモート リポジトリからローカル リポジトリに情報を取得します。すべての変更が取り込まれますが、ブランチのローカル コピーと自動的にマージされることはありません。

rebase コマンドは、最初にローカル マスターとリモートの間の共通点に戻り、リモートからのすべての変更を早送りマージしてから、変更をその上に適用します。--preserve-mergesブランチ間のローカル コピーにマージがある場合、使用するとよりクリーンな履歴が作成されます。

于 2013-03-01T20:04:01.620 に答える