Что я должен сделать, чтобы избежать потери коммитов с Git при слиянии веток? - PullRequest
1 голос
/ 28 июня 2019

Я недавно работал с командой разработчиков, использующих GitHub Enterprise.

Я работал над веткой, назовем ее origin/feature1, несколько часов и сделал несколько коммитов, которые я эффективно протолкнул. В то же время коллега проводил слияние от origin/master до origin/feature1. Когда он закончил слияние, оказалось, что последние несколько моих коммитов теперь отсутствуют, и поскольку я потянул, прежде чем заметил проблему, я также потерял их локально.

Вопросы:

  • Можно ли фактически потерять коммиты, которые были выдвинуты, или все, что может быть восстановлено (даже если это означает выполнение большого количества загадочных команд)?

  • Если да, разве это не значит, что Git каким-то образом ... сломан? Я имею в виду, как счастливый пользователь SVN, я никогда не терял работу с SVN. Кстати, с TFS еще в 2013 году.

  • Я был здесь, когда проводилось слияние. Человек, который сделал слияние, похоже, не делал ничего «особенного» и не выполнял никаких команд, которые выглядели бы так, как будто они могли отбросить некоторые коммиты. Я не думаю, что это была ошибка (и Git-клиент, и GitHub Enterprise практически не устарели). Так есть ли какой-то конкретный аргумент, который не следует указывать при слиянии? Или, может быть, какой-то особый режим слияния, который по умолчанию приводит к потере коммитов?

По сути, как не потерять полдня работы в будущем?

Ответы [ 3 ]

2 голосов
/ 28 июня 2019

Коллега делал слияние в своем локальном хранилище. origin/feature1 относится к удаленной ветви в их хранилище, и это отличается от того, что вы нажали. git remote update выполнит синхронизацию.

Я подозреваю, что был задействован некоторый принудительный толчок, чего вы обычно не хотите делать. Если ваш коллега выдвинулся до origin/feature1, то он изменил бы коммит, на который feature1 указывает от ваших коммитов.

Ваш локальный репозиторий, вероятно, все еще содержит сделанные вами коммиты; найти их выходит за рамки моего ответа.

Решение:

  • Убедитесь, что принудительное нажатие отключено на вашем GitHub Enterprise
  • Убедитесь, что ни у кого нет конфигурации по умолчанию, которая пытается принудительно нажать
  • Ищите осиротевшие коммиты, которых вы нажали; они все еще должны быть в вашем локальном хранилище.
2 голосов
/ 29 июня 2019

Если мы оба начинаем работать над origin/feature1, и вы сначала нажимаете несколько коммитов, а затем я пытаюсь выдвинуть различные коммиты, Git выдаст мне ошибку, похожую на

! [rejected]        feature1 -> origin/feature1 (non-fast-forward)
error: failed to push some refs to 'https://your-repo.com'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Чтобы правильно обработать этоВ этой ситуации я мог бы запустить git fetch origin, чтобы вставить ваши коммиты в мой локальный git, а затем включить ваши изменения в мои собственные либо с помощью merge или rebase.

Как это звучит, произошло вВаша ситуация (как и другие сформулировали) заключается в том, что ваш коллега вместо этого выполнил git push --force, который велел git игнорировать ошибку, которую он выдал в первый раз, и просто переписал origin/feature1 моей веткой feature1.

Чтобы избежать этих проблем в будущем, я бы предложил:

  • В первую очередь работать над своими собственными ветками функций, а не делиться ими между разработчиками
  • Использовать только -f или --force отметки, если вы знаете точно что вы делаете.И убедитесь, что сообщение передается другим членам вашей команды.Можно отключить принудительное нажатие на ветви в GitHub.

Чтобы вернуть изменения, вы можете запустить git reflog, найти записи "commit", чтобы найти последний сделанный вами коммиттема, а затем checkout соответствующий хеш коммита.Ваш локальный Git хранит каждый коммит, который вы делаете, по крайней мере 30 дней, его невозможно потерять, если вы не удалите каталог .git.

2 голосов
/ 28 июня 2019

Вероятно, ваш коллега выдвинул свою ветку с -f, не объединив ваши изменения, поэтому в этой ветви ваши изменения "потерялись". Вы всегда можете сохранить свою локальную ветку, чтобы вы могли с ней что-то делать ... и, если вы удалили локальную ветку, вы всегда можете проверить reflog, чтобы вернуть старые коммиты.

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

PS Ох ... и не беспокойся. Disclaimer Personal Opinion : После нескольких раундов использования git и изучения того, как он работает, вы будете удивляться, как вы сделали это с помощью SVN так долго. : -D

...