Как переназначить изменения текущей ветки поверх объединяемых изменений?

151

Ладно. Если я нахожусь в ветке (скажем working), и я хочу объединить изменения из другой ветки (скажем master), то я запускаю команду git-merge masterв workingветке, и изменения объединяются без перезагрузки истории вообще. Если я бегу git-rebase master, то изменения masterбудут перенесены в верхнюю часть моей workingветки. Но что, если я хочу объединить изменения, masterно переустановить свои изменения, workingчтобы они были наверху? Как я могу это сделать? Это можно сделать?

Я мог бы запустить git-rebase workingсвою masterветку, чтобы поместить свои изменения поверх masterветки, но я бы хотел иметь возможность сделать это в своей workingветке, и я понятия не имею, как это сделать. Ближайшее, что я могу придумать, - это создать новую ветку, masterа затем перенастроить workingизменения поверх нее , но тогда у меня будет новая ветка вместо изменения workingветки.

Джонатан М. Дэвис
источник

Ответы:

261

У вас есть то, что rebaseделает наоборот. git rebase masterделает то, о чем вы просите - берет изменения в текущей ветке (с момента ее расхождения с главной) и воспроизводит их поверх master, а затем устанавливает заголовок текущей ветки в качестве главы этой новой истории. Он не воспроизводит изменения masterповерх текущей ветки.

Hobbs
источник
4
@ Джонатан, это круто. Это немного сложная тема. Между прочим, git rebase workingпереместил бы masterизменения (после точки workingответвления), чтобы они были на вершине workingветки - но это не очень разумная вещь, чтобы делать master:)
hobbs
67

Другой способ взглянуть на это - рассмотреть git rebase masterкак:

Разместите текущую ветку поверх master

Здесь ' master' - восходящая ветвь, и это объясняет, почему во время перебазирования oursи theirsменяются местами .

VonC
источник
Это также объясняет, почему LOCAL и REMOTE поменялись местами. Спасибо.
AVIDeveloper
@AVIDeveloper на ЛОКАЛЬНОМ и УДАЛЕННОМ, вы также можете прочитать stackoverflow.com/a/3052118/6309
VonC
5
@@ VonC: Спасибо. Да, после полудня, бормочущего себе под нос «REMOTE - это моя ветка .. LOCAL - не моя», я все понял. Честно говоря, я бы предпочел видеть имена веток (или сокращенное SHA) вместо REMOTE / LOCAL / наши / их / мои. Мои мысли такие же относительно git difftoolужасных левых / правых. Вроде не по теме, но difftoolя придерживаюсь git-meld и люблю такие имена, как «working-dir», «stash @ {0}» и т. Д.
AVIDeveloper
1
@VonC: Не могли бы вы объяснить, как может получиться, что после того, как мы это сделаем: git checkout branch_to_update git rebase masterя получаю в git log коммиты мастера поверх локальной ветки, а не наоборот?
JavaSa
1
@JavaSa Это странно, разве что ребаз не был завершен должным образом? Возможно, вам придется задать отдельный вопрос с более подробной информацией в нем.
VonC