Перебазирование и что подразумевается под перебазированием выдвинутых коммитов - PullRequest
103 голосов
/ 26 апреля 2010

Часто говорят, что вы не должны перебазировать коммиты, которые вы уже выдвинули. Что может быть смыслом этого?

Ответы [ 4 ]

228 голосов
/ 01 февраля 2015

Чтобы понять это, нам нужно немного понять, как работает git. Git-репозиторий - это древовидная структура, где узлы дерева являются коммитами. Вот пример очень простого хранилища: When you fork

он имеет четыре коммита в ветке master, и каждый коммит имеет идентификатор (в данном случае a, b, c и d). Вы заметите, что d в настоящее время является последним коммитом (или HEAD) главной ветки. enter image description here

Здесь у нас есть две ветви: master и my-branch. Вы можете видеть, что master и my-branch содержат коммиты a и b, но затем они начинают расходиться: master содержит c и d, а my-branch содержит e и f. Говорят, что b является «базой слияния» my-branch по сравнению с master - или, чаще, просто «base». Это имеет смысл: вы можете видеть, что my-branch основывался на предыдущей версии master.

Итак, допустим, что моя ветка устарела, и вы хотите обновить ее до последней версии master. Другими словами, my-branch должна содержать c и d. Вы можете выполнить слияние, но это приведет к тому, что ветвь будет содержать странные коммиты слияния, которые значительно усложняют просмотр запроса на извлечение. Вместо этого вы можете сделать ребаз.

enter image description here

Когда вы перебазируете, git находит базу вашей ветви (в данном случае b), находит все коммиты между этой базой и HEAD (в данном случае e и f) и повторно воспроизводит эти коммиты на HEAD ветви, на которую вы перебазируете (в данном случае, мастер). Git фактически создает новые коммиты, которые представляют то, как ваши изменения выглядят поверх мастера: на диаграмме эти коммиты называются e ′ и f ′. Git не стирает ваши предыдущие коммиты: e и f остаются нетронутыми, и если что-то пойдет не так с ребазой, вы можете вернуться к тому, что было раньше.

Когда над проектом симулируют много разных людей, запросы на извлечение могут быстро устареть. «Устаревший» пулл-запрос - это тот, который больше не соответствует основной линии разработки, и его необходимо обновить, прежде чем он может быть объединен с проектом. Самая распространенная причина, по которой запросы на извлечение данных устаревают, связана с конфликтами: если два запроса на извлечение изменяют одинаковые строки в одном и том же файле, и один запрос на извлечение объединяется, то в неразрешенном запросе на получение теперь будет конфликт. Иногда запрос на удаление может устареть без конфликтов: возможно, изменения в другом файле в кодовой базе требуют соответствующих изменений в вашем запросе на включение для соответствия новой архитектуре, или, возможно, ветвь была создана, когда кто-то случайно слил неудачные модульные тесты в мастер ветка. Независимо от причины, если ваш запрос на извлечение данных устарел, вам нужно будет перенастроить свою ветку на последнюю версию главной ветви, прежде чем ее можно будет объединить.

78 голосов
/ 26 апреля 2010

Книга ProGit имеет хорошее объяснение .

Конкретный ответ на ваш вопрос можно найти в разделе « Опасности перебазирования ». Цитата из этого раздела:

Когда вы перебазируете вещи, вы отказ от существующих коммитов и создавая новые, которые похожи, но разные. Если вы нажимаете коммитов где-то и другие тянут их вниз и базовая работа над ними, а потом ты переписать эти коммиты с помощью git rebase и подтолкнуть их снова, ваш сотрудники должны будут повторно объединить их работа и все станет грязным когда вы пытаетесь вернуть их работу в твою.

Обновление:
Исходя из вашего комментария ниже, кажется, что у вас возникли трудности с рабочим процессом Git. Вот некоторые ссылки, которые могут помочь:

66 голосов
/ 26 апреля 2010

Перебазирование переписывает историю. Если никто не знает об этой истории, то это прекрасно. Однако, если эта история общеизвестна, то переписывание истории в Git работает так же, как и в реальном мире: вам нужен заговор.

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

Обратите внимание, что являются примерами успешных заговоров: ветвь pu хранилища git Junio ​​C. Hamano (официальный хранилище Git SCM) часто перезаписывается. Это работает так, что почти каждый, кто использует pu, также подписан на список рассылки разработчиков Git, и тот факт, что ветка pu перебазирована, широко публикуется в списке рассылки и на сайте Git.

6 голосов
/ 26 апреля 2010

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

Перебазировка считается вредной - хороший обзор, я думаю.

...