Используя gitk log
, я не смог заметить разницу между ними. Как я могу наблюдать разницу (с помощью команды git или какого-либо инструмента)?
git
merge
fast-forward
user1162226
источник
источник
Ответы:
В
--no-ff
флаг предотвращаетgit merge
от выполнения «голодание вперед» , если он обнаружит , что ваш текущийHEAD
является предком коммита вы пытаетесь объединить. Быстрая перемотка вперед - это когда вместо создания коммита слияния git просто перемещает указатель ветки, чтобы указать на входящий коммит. Это обычно происходит при выполненииgit pull
без каких-либо локальных изменений.Однако иногда вы хотите предотвратить такое поведение, как правило, потому что вы хотите поддерживать топологию конкретной ветви (например, вы объединяетесь в ветку темы и хотите, чтобы она выглядела так при чтении истории). Чтобы сделать это, вы можете передать
--no-ff
флаг и всегдаgit merge
создаст слияние вместо быстрой пересылки.Точно так же, если вы хотите выполнить a
git pull
или использоватьgit merge
для явной перемотки вперед и хотите выручить, если она не может перемотать вперед, тогда вы можете использовать--ff-only
флаг. Таким образом, вы можете регулярно делать что-то вроде,git pull --ff-only
не думая, а затем, если это не так, вы можете вернуться и решить, хотите ли вы объединить или перебазировать.источник
gitk
илиgit log --graph
что быстро вперед слияние не создать слияния совершить, а не быстрой перемотки вперед один сделал.--no-ff
от возможности разработки или разработки до освоения похоже на объединение запроса на извлечение?--no-ff
.Графический ответ на этот вопрос
Вот сайт с понятным объяснением и графической иллюстрацией использования
git merge --no-ff
:Пока я не увидел это, я был полностью потерян с мерзавцем. Использование
--no-ff
позволяет кому-то, просматривая историю, ясно видеть ветку, с которой вы работали. (эта ссылка указывает на «сетевой» инструмент визуализации github). А вот еще одна отличная ссылка с иллюстрациями. Этот справочник хорошо дополняет первый, с большим акцентом на тех, кто менее знаком с git.Основная информация для таких новичков, как я
Если вы похожи на меня, а не на Git-гуру, мой ответ здесь описывает обработку удаления файлов из отслеживания git без удаления их из локальной файловой системы, что кажется плохо документированным, но часто встречающимся. Еще одна новая ситуация - получение текущего кода , который все еще удается ускользнуть от меня.
Пример рабочего процесса
Я обновил пакет на своем сайте и должен был вернуться к своим заметкам, чтобы увидеть мой рабочий процесс; Я подумал, что полезно добавить пример к этому ответу.
Мой рабочий процесс команд git:
Ниже: фактическое использование, включая пояснения.
Примечание: вывод ниже обрезан; мерзавец довольно многословен.
Обратите внимание на 3 вещи сверху:
1) В выходных данных вы видите изменения в обновлении пакета ECC, включая добавление новых файлов.
2) Также обратите внимание, что есть два файла (не в
/ecc
папке), которые я удалил независимо от этого изменения. Вместо того, чтобы путать удаления этих файлов сecc
другими,cleanup
позже я сделаю другую ветку, чтобы отразить удаление этих файлов.3) Я не следил за своим рабочим процессом! Я забыл про мерзавца, когда пытался заставить ecc снова работать.
Ниже: вместо того, чтобы делать все включено,
git commit -am "updated ecc package"
как обычно, я хотел только добавить файлы в/ecc
папку. Эти удаленные файлы не были частью моейgit add
, но поскольку они уже отслеживались в git, мне нужно удалить их из коммита этой ветки:Скрипт для автоматизации вышеперечисленного
Используя этот процесс более 10 раз в день, я приступил к написанию пакетных сценариев для выполнения команд, поэтому я создал почти правильный
git_update.sh <branch> <"commit message">
сценарий для выполнения вышеуказанных шагов. Вот источник Gist для этого сценария.Вместо этого
git commit -am
я выбираю файлы из «модифицированного» списка, созданного с помощью,git status
а затем вставляю их в этот скрипт. Это произошло потому, что я сделал десятки правок, но хотел, чтобы различные имена ветвей помогли сгруппировать изменения.источник
--no-ff
опцией?Стратегии слияния
Явное слияние : Создает новый коммит слияния. (Это то, что вы получите, если использовали
--no-ff
.)Fast Forward Merge: Быстрая перемотка вперед без создания нового коммита:
Rebase : установить новый базовый уровень:
Сквош: раздавить или сжать (что-то) с силой, чтобы он стал плоским:
источник
В
--no-ff
опции гарантирует , что быстрая перемотка вперед слияние не будет происходить, и что нового коммита объект всегда будет создан . Это может быть желательно, если вы хотите, чтобы git поддерживал историю ветвей функций. На изображении выше, левая сторона - пример истории git после использования,git merge --no-ff
а правая сторона - пример использования,git merge
где возможно слияние ff.РЕДАКТИРОВАТЬ : предыдущая версия этого изображения указала только один родительский элемент для фиксации слияния. Коммиты слияния имеют несколько родительских коммитов, которые git использует для сохранения истории «ветви функций» и исходной ветви. Несколько родительских ссылок выделены зеленым цветом.
источник
Это старый вопрос, и он несколько тонко упоминается в других постах, но объяснение, которое сделало этот щелчок для меня, заключается в том, что для слияния без ускоренной перемотки потребуется отдельная фиксация .
источник
git merge --no-ff ecc
вас просто будет дополнительный коммит слияния вgit log
ветке for. Это технически не требуется в том случае, если master указывает на прямого предка коммита ecc, но указав опцию --no-ff, вы принудительно создаете этот коммит слияния. Это будет иметь название:Merge branch 'ecc'
Флаг --no-ff заставляет слияние всегда создавать новый объект фиксации, даже если слияние может быть выполнено с ускоренной перемоткой вперед. Это позволяет избежать потери информации об историческом существовании ветви компонента и объединяет все коммиты, которые вместе добавляли функцию
источник