226

次のケースを取り上げます。

トピックブランチでいくつかの作業があり、マスターにマージする準備ができました:

* eb3b733 3     [master] [origin/master]
| * b62cae6 2   [topic]
|/  
* 38abeae 1

マスターからマージを実行し、競合を解決すると、次のようになります。

*   8101fe3 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
* | eb3b733 3                     [origin/master]
|/  
* 38abeae 1

ここで、マージに時間がかかったので、別のフェッチを行って、リモート マスター ブランチに新しい変更があることに気付きました。

*   8101fe3 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
| | * e7affba 4                   [origin/master]
| |/  
|/|   
* | eb3b733 3
|/  
* 38abeae 1

マスターから試すとgit rebase origin/master、すべての競合を再度解決する必要があり、マージ コミットも失われます。

* d4de423 2       [master]
* e7affba 4       [origin/master]
* eb3b733 3
| * b62cae6 2     [topic]
|/  
* 38abeae 1

以下に示すような履歴になるように、マージ コミットをリベースするクリーンな方法はありますか?

*   51984c7 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
* | e7affba 4                     [origin/master]
* | eb3b733 3
|/  
* 38abeae 1
4

5 に答える 5

166

ここには 2 つのオプションがあります。

1 つは、対話型のリベースを実行してマージ コミットを編集し、手動でマージをやり直してリベースを続行することです。

もう 1 つは、--rebase-mergesオプション onを使用することgit rebaseです。これは、マニュアルから次のように説明されています。

デフォルトでは、リベースは単純に todo リストからマージ コミットを削除し、リベースされたコミットを単一の線形ブランチに配置します。--rebase-merges を使用すると、リベースは、マージ コミットを再作成することにより、リベースされるコミット内の分岐構造を保持しようとします。これらのマージ コミットで解決されたマージ競合または手動修正は、手動で解決/再適用する必要があります。"

于 2011-01-24T16:01:03.460 に答える
7

Given that I just lost a day trying to figure this out and actually found a solution with the help of a coworker, I thought I should chime in.

We have a large code base and we have to deal with 2 branch heavily being modified at the same time. There is a main branch and a secondary branch if you which.

While I merge the secondary branch into the main branch, work continues in the main branch and by the time i'm done, I can't push my changes because they are incompatible.

I therefore need to "rebase" my "merge".

This is how we finally did it :

1) make note of the SHA. ex.: c4a924d458ea0629c0d694f1b9e9576a3ecf506b

git log -1

2) Create the proper history but this will break the merge.

git rebase -s ours --preserve-merges origin/master

3) make note of the SHA. ex.: 29dd8101d78

git log -1

4) Now reset to where you were before

git reset c4a924d458ea0629c0d694f1b9e9576a3ecf506b --hard

5) Now merge the current master into your working branch

git merge origin/master
git mergetool
git commit -m"correct files

6) Now that you have the right files, but the wrong history, get the right history on top of your change with :

git reset 29dd8101d78 --soft

7) And then --amend the results in your original merge commit

git commit --amend

Voila!

于 2017-12-14T16:47:31.880 に答える
1

あなたがしたいことは、最初のマージを削除することです。次の手順に従うことができます。

git checkout master      # Let's make sure we are on master branch
git reset --hard master~ # Let's get back to master before the merge
git pull                 # or git merge remote/master
git merge topic

それはあなたが望むものを与えるでしょう。

于 2011-01-24T18:10:57.640 に答える