Git: При сдавливании или перебазировке в ветви функций, зачем вам сравнивать ее с другой веткой, такой как master? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть ветвь функций, feature_account.Это было разветвлено master 2 месяца назад.Я сделал несколько коммитов в этой ветке, и я хочу объединить их все в 1 коммит, пока он еще находится в ветви функций.
Очевидно, master изменил связку независимо от ветви функций.Из моей ветви функций, если я наберу git rebase -i master, я получу конфликты слияния из изменений, которые есть только в master --- почему то, что в master, имеет значение, если я только пытаюсь объединить все свои коммиты из ветви Feature в 1совершить?Я не хочу беспокоиться о мастере, пока не попытаюсь слиться с мастером.Я что-то не так делаю?

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Предположим, что граф фиксации похож на

* b73f9ac (HEAD -> feature_account) f
* 5e77f54 e
* f6e5be0 d
| * c96a113 (master) c
| * f8132ea b
|/  
* bae8722 a
* 762077a initial commit

В git rebase -i master новая база - master.Но в вашем случае новая база должна быть bae8722, которая является точкой разветвления и ближайшим общим предком.Может быть расположен git merge-base feature_account master.В некоторых более сложных ситуациях git merge-base может не работать должным образом, и вам нужно выяснить это другими способами.

Чтобы явно указать новую базу, мы можем использовать --onto <newbase>,

git rebase -i --onto $(git merge-base feature_account master) master

или с краткой формой

git rebase -i --onto feature_account...master master

А затем в редакторе измените «pick» в строках, кроме первой, на «s».Сохранить и выйти.Отредактируйте сообщение о коммите и сделайте.

Чтобы раздавить новые коммиты на feature_account, есть другой метод.

git checkout feature_account
# make the working tree clean if it's not
git stash -u
# here "feature_account...master" cannot be used 
git reset $(git merge-base feature_account master) --soft 
git commit
# restore the stashed changes if necessary
git stash apply --index
0 голосов
/ 02 июля 2019

Предположим, вы сделали три коммита в ветке feature_account.

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

Вы указали, что хотите раздавить feature_account в один коммит.Один из способов сделать это - найти коммит, над которым вы начали свою работу, и использовать его как git rebase -i <commit>.С тремя коммитами эта команда может быть: git rebase -i HEAD^^^

...