Плохо объединенные коммиты - PullRequest
0 голосов
/ 27 июня 2019

У меня было поведение мерзавца, которого я совершенно не понимал:

У меня есть производственный филиал B1.

git checkout B1
git checkout -b B2

Я работаю над решением, объединяю его с B1 локально с

git checkout B2
git rebase B1
git checkout B1
git merge B2
git branch -d B2

Затем я делаю ту же процедуру - создаю ветку B3 из B1, работаю над B3 и объединяюсь с B1. Теперь возникли многочисленные конфликты слияния (буквально между каждым коммитом B2). Поэтому я перебазировал и объединил их так же, как и с B2. Код вытащил и с благодарностью подтолкнул, состояние git не показывало коммитов на B1 или B3.

Позже, когда мой коллега вытащил B1, он снова столкнулся со всеми этими конфликтами слияний. Полный кошмар, что я, хотя и не должен происходить.

Кто-нибудь знает, как эти конфликты слияний могли быть перенесены на удаленный без коммитов, которые их разрешили? Я хотел бы вспомнить, какую (возможно, ужасную) ошибку я совершил, чтобы не повторять ее снова ^^

___ редактировать Консоль формы истории:

git checkout -b B2
git add file1
git commit -m "b2c1"
git rebase B1
git add file1
git commit -m "b2c2"
git push
git rebase B1
git checkout B1
git pull
git checkout B2
git rebase B1
git add file1
git commit -m "b2c3"
git rebase B1
git merge B1
git push B1
git checkout B1
git pull
git merge B2
git push
git branch --merged master
git branch -d B2
git checkout -b B3
git pull
git add file1
git commit -m "b3c1"
git push
git rebase -i HEAD~5
git push -f
git add file1
git commit -m "b3c2"
git add file2 file3 file4
git commit -m "b3c3"
git stash
git pull
git push 
git checkout B3
git stash push
git stash save
git stash apply
git checkout B3
git rebase B1
git checkout -- .
git checkout B1
git merge B3
git push

что-то в том же духе, мне пришлось сжать еще много строк, потому что иначе было бы 200/400 строк журнала.

1 Ответ

0 голосов
/ 27 июня 2019
git add file1
git commit -m "b2c1"
git rebase B1

Эта rebase не требуется, так как прямой родитель b2c1 - B1. Предполагая, что B2 был создан из B1 на начальном этапе.

git commit -m "b2c2"
git push
git rebase B1

Почему вы делаете ребаз после push , это противоречит интуиции. Я бы посоветовал не делать push до тех пор, пока вы не настроите свою локальную историю так, как вы хотите, а затем опубликуйте ее с помощью push

git checkout B1
git pull

Хорошо, это обновит ваш локальный B1 в зависимости от того, что в настоящее время имеет пульт .

git checkout B2
git rebase B1

Это первый ребаз, который я считаю действительно необходимым, но только если B1 изменился.

git add file1
git commit -m "b2c3"
git rebase B1

Опять у вас есть ребаз , который не нужен

git merge B1

Вам не нужно делать слияние из B1 в B2 на этом этапе, поскольку B1 не изменилось.

Похоже, у вас могут быть некоторые фундаментальные заблуждения относительно git и того, как он работает. Что, если вы новичок в git, не так уж удивительно. Мне понадобилось некоторое время, чтобы обернуть вокруг него голову. Я бы посоветовал вам взглянуть на книгу Pro Git : https://git -scm.com / book / ru / v2 чтобы помочь понять некоторые из основных понятий.

Мой лучший совет - стараться делать вещи простыми, атомарными и продуманными. Помнить эти вещи вам очень поможет.

git push B1
git checkout B1
git pull
git merge B2
git push
git branch --merged master
git branch -d B2
git checkout -b B3
git pull
git add file1
git commit -m "b3c1"
git push
git rebase -i HEAD~5
git push -f
git add file1
git commit -m "b3c2"
git add file2 file3 file4
git commit -m "b3c3"
git stash
git pull
git push 
git checkout B3
git stash push
git stash save
git stash apply
git checkout B3
git rebase B1
git checkout -- .
git checkout B1
git merge B3
git push
...