Страницы

Поиск по вопросам

вторник, 17 декабря 2019 г.

Непонятное слияние в git затёрло работу

#git #git_commit #git_branch


Сегодня на работе произошла странная ситуация, и хоть она разрешилась, её причины
остались непонятными. С репозиторием работают два разработчика. Соответственно, в репозитории
три постоянные ветки: Alice, Bob и master.

$ git branch --all
Bob
Alice
* Alice_n
master
remotes/origin/HEAD -> origin/master
remotes/origin/Bob
remotes/origin/Carol
remotes/origin/Alice
remotes/origin/Alice_n
remotes/origin/master
remotes/origin/master_instance


Вчера перед уходом с работы я внесла коммит в Alice и подлила изменения из мастера.

git status
git add --all
git commit -m 'Изменения'


В результате получился коммит 0cf7f9e Add export all editable records for Admin role.

После: 

git push origin HEAD
git checkout master
git pull 


На этом этапе возник конфликт в трёх файлах по 2-3 строчки. В одном файле работала
только я, поэтому конфликт я разрешила. В двух других мы работали оба, а напарник был
уже недоступен, поэтому я оставила свои изменения, а конфликтные закомментировала.
Потом чтобы вернуться на свою ветку, я закоммитила в мастера изменения, оставив их
на локальной ветке.

git add --all
git commit -m "Fix conflicts"
git checkout first
git merge master


Мерж-коммит, полученный в результате конфликта при git pull: 9d2fda5 Fix conflicts.

$ git cat-file commit 9d2fda5
tree f10d0642a0bee9c08572afacc732e19aeef6f029
parent 62043f332ff8e6ca9e6d12058bddc490cb1694de
parent 0cf7f9e6e55ef80bf2fbfba69d8d2bee57955a75
author Alice <> 1480521034 +0300
committer Alice <> 1480521034 +0300 


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

Сегодня напарник написал, что добавил мои изменения в свою ветку Bob и у него пропала
его вчерашняя работа. Ему пришлось откатить изменения и сделать новую ветку, в которую
вручную внести изменения с наших веток, это заняло много времени и он нервничал. Ошибочное
слияние, видимо, не сохранилось в коммитах, потому что он сразу откатил слияние обратно.
1314ced merge files from first – это он вручную добавлял мои файлы в свою рабочую ветку,
когда выяснил, что обычное слияние затирает его работу

На моей ветке его вчерашняя работа сохранилась. Он говорит, что виноват мой коммит,
но не знает, почему у меня на ветке работает правильно. Чтобы не повторять косяк в
дальнейшем, мне нужно разобраться, как мой коммит мог затереть работу у него, но сохранить
у меня. Я читала документацию весь вечер, но так и не нашла, что сделала неправильно.
Буду благодарна за разъяснения.

Update

$ git log --oneline --decorate --graph --all
* 4b2be62 (origin/first_n, first_n) Fix different date types (array and
* 02d3a6f small fix
*   850cd31 Fix date at import_xls and print card
|\
* | 6510271 Fix date in cards and in import_xls
| | * e5243af (HEAD, origin/second, second) Правки в связаных формах
| | * 5da1775 правки в связаных полях
| |/
| * 3433552 set print
| * 1314ced merge files from first
|/
* 7df8366 (origin/master, origin/HEAD, master) Правки в селекте, добавление
*   c7e2dd1 merge second
|\
| * a0a7832 правки в поиске связаных полей
* | 346d429 (origin/third) change font
* | 93fff9e fix styles
* |   6a11fc2 merge master, fix conflicts
|\ \
| |/
* | 390fc18 change work of map control, fix styles
* | 76bdbfb add gis-logo lib
* | 174a55d add logo
| | * 2cf67b5 (origin/first, first) changed
| | * 2cf07b3 Fix import shp bug creating new records with old info
| | *   9d2fda5 Fix conflicts
| | |\
| |/ /
| | * 0cf7f9e Add export all editable records for Admin role
| | * d8f7231 Fix integer to string strip decimal points
| | * 59e50c8 Add icon to Geometry spatial layers style
| | *   97d357a Fix conflicts
| | |\
| | * | ff3118c Fix geomcollection default geometry to point
| | * | 9648c8f Add GeometryCollection spatial database append, export, print
| | * |   f5f4469 Merge branch 'master' into first
| | |\ \
| | * | | a776df4 Merge master
| * | | | 62043f3 Работа со свзаными полями
| * | | | fb4b7b7 Правки - дома без точки
| * | | | 4d5fef4 Удаление пустых групп из списка слоев
| * | | | 7410f87 come back
| * | | | acca807 asd
| * | | | bec436a ghost
| * | | | 9d26601 clear debugger and merge third
| * | | |   502a766 clear conflict
| |\ \ \ \
|/ / / / /
| * | | | e86d785 Настройка слоев, правки в валидации модели, создание отдельног
* | | | | bdbe5d3 merge master
* | | | |   b5b8bc5 Merge branch 'master' into third
|\ \ \ \ \
| |/ / / /
| * | | | 67a042c Правки в окне авторизации
| * | | | 6ddfc73 Удаление кнопки фильтра из кластерных слоев
| * | | | 40ca02e Правки в загрузке кластерных слоев.
| | |_|/
| |/| |
| * | | 2ebfeb1 changed model on edit table
| * | | 47ee6c5 Запрет на редактирование геометрии таблицы.
| * | | e9f1e5d правки в создании правил отображения слоев
| * | | 40152bb Удаление сессий, изменние страницы авторизации
| * | | 7f82cad Правки в ддп
| * | | c63f80b clear debugger and import pdb;
| * | | 0bca931 Правки в проекте, удаление что здесь, правки экспорта сводной ст
| | |/
| |/|
* | | 193cfcc icon markercluster
* | | b82aa6e fix backbone-tree, models, form for point, polygon
* | | 50ea454 add displaystyle form for line, polygon, multipolygon
* | | 85188fb add changing of pictogram size in vectorlayers
* | | c6da90a rerurn pictogram 126482.svg
* | | 9804246 Правка отображения фото для слоев со статистикой, отдельная форма


Update 2

    $ git log --format="%h %ai %an %d %s" --all --graph
* 02d3a6f 2016-12-05 10:28:30 +0300 Alice  small fix
*   850cd31 2016-12-05 10:26:34 +0300 Alice  Fix date at import_xls and print
|\
* | 6510271 2016-12-02 18:15:48 +0300 Alice  Fix date in cards and in import_
| | * e5243af 2016-12-02 17:23:02 +0300 Bob  (origin/Bob, Bob) Правки в св
| | * 5da1775 2016-12-02 15:49:38 +0300 Bob  правки в связаных полях
| |/
| * 3433552 2016-12-02 11:36:14 +0300 Bob  set print
| * 1314ced 2016-12-02 11:23:09 +0300 Bob  merge files from Alice
|/
* 7df8366 2016-12-02 09:54:26 +0300 Bob  (origin/master, origin/HEAD, master,
*   c7e2dd1 2016-12-01 15:00:38 +0300 Bob  merge Bob
|\
| * a0a7832 2016-12-01 14:58:34 +0300 Bob  правки в поиске связаных полей
* | 346d429 2016-12-01 10:32:21 +0300 Carol  (origin/Carol
* | 93fff9e 2016-12-01 10:09:45 +0300 Carol  fix styles
* |   6a11fc2 2016-12-01 09:43:36 +0300 Carol  merge master
|\ \
| |/
* | 390fc18 2016-11-30 18:21:07 +0300 Carol  change work of
* | 76bdbfb 2016-11-30 12:41:24 +0300 Carol  add gis-logo l
* | 174a55d 2016-11-29 18:42:50 +0300 Carol  add logo
| | * 2cf67b5 2016-12-02 10:43:56 +0300 Alice  (origin/Alice, Alice) chan

    


Ответы

Ответ 1



1. Что произошло 1.1 Конфликт при git pull Команда git pull внутри себя выполняет две другие команды: git fetch. С удалённого сервера забираются данные по всем указателям (ветки и коммиты). git merge. В текущую ветку мержится та, которая указана как upstream branch. Для master это как правило origin/master. Если master является предком origin/master, т.е просто отстаёт на сколько-то коммитов, то выполняется fast-forward merge: ветка master переставляется на тот же коммит, что и origin/master Если в результате git pull появляются конфликты, значит две ветки разошлись. У них где-то есть общий предок, но в каждой есть не менее одного отличающегося коммита. Именно это и произошло. $ git cat-file commit 9d2fda5 tree f10d0642a0bee9c08572afacc732e19aeef6f029 parent 62043f332ff8e6ca9e6d12058bddc490cb1694de parent 0cf7f9e6e55ef80bf2fbfba69d8d2bee57955a75 Первым предком указан 62043f3 Работа со свзаными полями. Этот коммит находился на текущей ветке, т.е. вашей ветке master. Вторым предком указан 0cf7f9e Add export all editable records for Admin role. Это коммит из той ветки, которую мержили в текущую. Неожиданно, но это ваш собственный только что сделанный коммит. Как можно было добиться такого эффекта? Есть пара вариантов. Запушить свою ветку в origin/master: git checkout Alice ... git commit ... git push origin master Тогда изменилось бы содержимое origin/master. Наш git pull в master сработал бы точно так, как наблюдалось. Но тогда у Carol тоже появился бы этот коммит, чего не произошло. Видим, что у коммита 6a11fc2 merge master, fix conflicts в предках тот же 62043f3 Работа со свзаными полями Сделать git pull из другой ветки git commit git push origin HEAD git checkout master git pull origin Alice В результате в ваш master мержится только что запушенное содержимое origin/Alice. Похоже, что именно это и произошло. 1.2 Пропали изменения у коллеги после мержа допишу позже, когда коллега уточнит подробности пропажи 2. Что делать, чтобы избежать будущих ошибок Тоже допишу вечером, пока оставлю оглавление Использовать git pull --set-upstream От модели «по ветке на разработчика» перейти к модели «по ветке на фичу» Мержить только feature-ветки в master, но не master в другие ветки и не другие ветки между собой. Предотвращать попадание нерабочего кода в master: Оставить право на мерж в мастер только тимлиду Прогонять тесты на коммитах.

Комментариев нет:

Отправить комментарий