Використовуючи gitk log
, я не міг помітити різниці між ними. Як я можу спостерігати різницю (за допомогою команди git чи якогось інструмента)?
Використовуючи gitk log
, я не міг помітити різниці між ними. Як я можу спостерігати різницю (за допомогою команди git чи якогось інструмента)?
Відповіді:
В --no-ff
прапор запобігає git merge
від виконання «голодування вперед» , якщо він виявить , що ваш поточний HEAD
є предком коммітов ви намагаєтеся об'єднати. Швидкий перемотка вперед - це, замість того, щоб створювати комісію злиття, git просто переміщує ваш вказівник гілки, щоб вказати на вхідний коміт. Це зазвичай трапляється, коли не робиться git pull
локальних змін.
Однак час від часу ви хочете не допустити подібної поведінки, як правило, тому, що ви хочете підтримувати конкретну топологію гілки (наприклад, ви об’єднуєтесь у тематичну галузь і хочете переконатися, що вона виглядає таким чином під час читання історії). Для того , щоб зробити це, ви можете передати --no-ff
прапор і git merge
буде завжди будувати злиття замість швидкого перемотування вперед.
Аналогічно, якщо ви хочете виконати git pull
або використовувати git merge
для того, щоб явно перемотати вперед, і ви хочете скористатися, якщо він не може перемотати вперед, тоді ви можете використовувати --ff-only
прапор. Таким чином, ви можете регулярно робити щось на кшталт, git pull --ff-only
не замислюючись, а потім, якщо це помилки, ви можете повернутися назад і вирішити, чи хочете ви об'єднати або відновити.
gitk
або git log --graph
що швидко вперед злиття не створити злиття зробити, а не швидкого перемотування вперед один зробив.
--no-ff
від функції, яка розробляється або розвивається до майстра, схоже на об'єднання запиту на тягнення?
--no-ff
.
Ось сайт із чітким поясненням та графічною ілюстрацією використання git merge --no-ff
:
Поки я цього не побачив, я повністю загубився від git. Використання --no-ff
дозволяє комусь, хто переглядає історію, чітко бачити гілку, над якою ви перевірили роботу. (це посилання вказує на інструмент візуалізації "мережі" github) І ось ще одна чудова посилання з ілюстраціями. Ця довідка добре доповнює першу з більшою увагою на тих, хто менш знайомий з git.
Якщо ви схожі на мене, а не на Git-гуру, моя відповідь тут описує обробку видалення файлів із відстеження git без їх видалення з локальної файлової системи, що здається погано задокументованим, але часто зустрічається. Ще одна нова ситуація - це отримання поточного коду , який все ще вдається мені уникати.
Я оновив пакет на своєму веб-сайті, і мені довелося повернутися до своїх нотаток, щоб побачити мій робочий процес; Я вважав корисним додати приклад до цієї відповіді.
Мій робочий процес команд git:
git checkout -b contact-form
(do your work on "contact-form")
git status
git commit -am "updated form in contact module"
git checkout master
git merge --no-ff contact-form
git branch -d contact-form
git push origin master
Нижче: фактичне використання, включаючи пояснення.
Примітка: вихідний результат прорізаний; git досить багатослівний.
$ git status
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ecc/Desktop.php
# modified: ecc/Mobile.php
# deleted: ecc/ecc-config.php
# modified: ecc/readme.txt
# modified: ecc/test.php
# deleted: passthru-adapter.igs
# deleted: shop/mickey/index.php
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# ecc/upgrade.php
# ecc/webgility-config.php
# ecc/webgility-config.php.bak
# ecc/webgility-magento.php
Зверніть увагу на 3 речі зверху:
1) На виході ви бачите зміни від оновлення пакету ECC, включаючи додавання нових файлів.
2) Також зауважте, що два файли (не в /ecc
папці), які я видалив незалежно від цієї зміни. Замість того, щоб плутати ці видалення файлів ecc
, я зроблю іншу cleanup
гілку пізніше, щоб відобразити видалення цих файлів.
3) Я не стежив за своїм робочим процесом! Я забув про git, коли я намагався знову працювати з ecc.
Нижче: замість того, щоб робити все включене, git commit -am "updated ecc package"
як правило, я хотів лише додати файли в /ecc
папку. Ці видалені файли не були частиною могоgit add
, але, оскільки вони вже відслідковувалися в git, мені потрібно видалити їх з цієї гілки:
$ git checkout -b ecc
$ git add ecc/*
$ git reset HEAD passthru-adapter.igs
$ git reset HEAD shop/mickey/index.php
Unstaged changes after reset:
M passthru-adapter.igs
M shop/mickey/index.php
$ git commit -m "Webgility ecc desktop connector files; integrates with Quickbooks"
$ git checkout master
D passthru-adapter.igs
D shop/mickey/index.php
Switched to branch 'master'
$ git merge --no-ff ecc
$ git branch -d ecc
Deleted branch ecc (was 98269a2).
$ git push origin master
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 59.00 KiB, done.
Total 14 (delta 10), reused 0 (delta 0)
To git@github.com:me/mywebsite.git
8a0d9ec..333eff5 master -> master
Використовуючи цей процес 10 і більше разів на день, я взявся писати пакетні сценарії для виконання команд, тому я зробив майже належне git_update.sh <branch> <"commit message">
сценарій для виконання вищезазначених кроків. Ось джерело Gist для цього сценарію.
Замість цього git commit -am
я вибираю файли зі "модифікованого" списку, створеного за допомогою, git status
а потім вставляю їх у цей сценарій. Це сталося тому, що я вніс десятки змін, але хотів, щоб різноманітні назви гілок допомогли згрупувати зміни.
--no-ff
опцією?
Явне злиття : створює нову комісію злиття. (Це те, що ви отримаєте, якщо використали --no-ff
.)
Швидке злиття вперед: швидко вперед, не створюючи нового зобов’язання:
База даних : Встановлення нового базового рівня:
Кабачок: розчавити або стиснути (щось) силою, щоб воно стало плоским:
Цей --no-ff
параметр гарантує, що швидкого злиття вперед не відбудеться і що завжди буде створений новий об'єкт фіксації . Це може бути бажано, якщо ви хочете, щоб git підтримував історію галузей функцій.
На наведеному вище зображенні ліва сторона є прикладом історії git після використання, git merge --no-ff
а права сторона - приклад використання git merge
там, де було можливо злиття ff.
РЕДАКТУВАННЯ : Попередня версія цього зображення вказувала лише одного батька для об'єднання об'єднань. Об'єднання комітетів мають кілька батьківських комітетів, які git використовує для підтримки історії "функції гілки" та початкової гілки. Кілька батьківських посилань виділені зеленим кольором.
Це давнє запитання, і це дещо тонко згадується в інших публікаціях, але пояснення, яке зробило цей клік для мене, полягає в тому, що не швидкі злиття вперед вимагають окремої фіксації .
git merge --no-ff ecc
вас буде просто додаткова комісія злиття в git log
магістралі для філії. Це технічно не потрібно в тому випадку, якщо майстер вказує на прямого предка виконуваної комісії, але вказуючи параметр --no-ff, ви змушуєте створювати цей об'єкт об'єднання. Він матиме назву:Merge branch 'ecc'
Прапор --no-ff викликає злиття, щоб завжди створювати новий об'єкт фіксації, навіть якщо злиття може бути виконане за допомогою швидкого перемотування вперед. Це дозволяє уникнути втрати інформації про історичне існування відгалуження та об'єднує всі комісії, які разом додали функцію