git pullймовірно, створює коміти. Якщо ви зробите локальну фіксацію, а потім запустите git pullпісля того, як хтось інший підштовхне комісію до сховища, Git завантажує команду іншого розробника і потім об'єднує її у вашу локальну відділення.
Як уникнути цих об'єднань у майбутньому
Ви можете використати git pull --rebaseдля того, щоб цього не сталося в майбутньому, але звільнення має небезпеку, і я рекомендую pullвзагалі уникати цього .
Натомість я рекомендую вам дотримуватися цієї схеми використання:
# download the latest commits
git remote update -p
# update the local branch
git merge --ff-only @{u}
# if the above fails with a complaint that the local branch has
# diverged:
git rebase -p @{u}
Пояснення
git remote update -pзавантажує всі комісії у віддалені сховища та оновлює віддалені гілки відстеження (наприклад, origin/master). Він НЕ торкається вашого робочого каталогу, індексу або місцевих відділень.
В -pаргументі чорнослив видаляється вгору по течії гілки. Таким чином, якщо fooгілка буде видалена в originсховищі, git remote update -pвона автоматично видалить ваш номер origin/fooпосилання.
git merge --ff-only @{u}вказує Git об'єднати гілку вище за течією ( @{u}аргумент) у вашу локальну гілку, але лише якщо вашу локальну гілку можна "швидко переслати" до гілки вище за течією (іншими словами, якщо вона не розходилася).
git rebase -p @{u}ефективно переміщує зроблені вами зобов’язання, але ще не натиснув на верхню частину верхнього відділення, що виключає необхідність створення дурних об'єднань, яких ви намагаєтеся уникнути. Це покращує лінійність історії розвитку, полегшує огляд.
-pОпція говорить Git для збереження злиття. Це заважає Git не лінеаризувати комісії, які будуть переоформлені. Це важливо, якщо, наприклад, ви об'єднали гілку функції master. Без цього -pкожне введення в галузь функції буде дублюватися masterяк частина лінеаризації, виконана git rebase. Це ускладнить перегляд історії розвитку, а не простіше.
Остерігайтеся : git rebaseможливо, не буде робити те, що ви очікуєте від цього, тому перегляньте результати, перш ніж натискати. Наприклад:
git log --graph --oneline --decorate --date-order --color --boundary @{u}..
Я віддаю перевагу такому підходу git pull --rebaseз наступних причин:
- Це дозволяє вам бачити вхідні зобов'язання за потоком перш ніж змінити історію, щоб включити їх.
- Це дозволяє передати параметр
-p( --preserve-merges) git rebaseу випадку, якщо вам потрібно перезавантажити навмисне злиття (наприклад, злиття вже натиснутої гілки функції в master).
Скорочення: git upзамістьgit pull
Щоб зробити це легко, рекомендую створити псевдонім під назвою up:
git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'
Тепер все, що вам потрібно зробити, щоб оновити свою філію - це запустити:
git up
замість git pull. Якщо ви отримаєте помилку через те, що ваша локальна філія відхилилася від гілки верхньої течії, це ваша відповідь на перезавантаження.
Чому ні git pull --rebase?
Запуск git pull --rebaseеквівалентно запуску з git fetchподальшим git rebase. Це намагається перемотатися до нових вершин, що передаються вгору, але якщо це неможливо, то він переставить ваші локальні комісії на нові комісії вище за течією. Зазвичай це нормально, але будьте уважні:
- Rebase - це вдосконалена тема, і ви повинні зрозуміти наслідки, перш ніж випускати нову версію.
git pull --rebaseне дає вам можливості вивчити комітети, перш ніж їх включити. В залежності від того, що змінилося вгору по течії, то цілком можливо , що перебазуватися неправильна операція-а rebase --onto, merge, resetабо push -fможе бути більш підходящим , ніж рівнини rebase.
- Неможливо (на даний момент) перейти
--preserve-mergesдо операції відновлення бази даних, тому будь-яке навмисне злиття гілки функції буде лінеаризовано, відтворюючи (і таким чином дублюючи) всі філії функції.
"Виправлення" існуючого комітету злиття, створеного git pull
Якщо ви ще не натиснули комісію злиття, створену компанією git pull, ви можете перезавантажити об'єкт злиття . Якщо припустити, що ви не зробили жодних навмисних злиттів (наприклад, об’єднання вже натиснутої гілки функції у вашу поточну гілку), це слід зробити:
git rebase @{u}
Наведена вище команда вказує Git вибирати всі об'єднання без об'єднання, доступні з HEAD(поточний фіксатор), за вирахуванням усіх комісій, доступних від @{u}(що є скороченим для "гілки вище за течією", тобто, origin/masterякщо HEADє master), повторити (cherry-pick ) їх у верхній частині гілки вище за течією, а потім перемістіть поточну посилання гілки, щоб вказати на результат відтворення комітетів. Це ефективно переміщує комісію без злиття на останню комісію вгору за течією, що виключає злиття, створене компанією git pull.
Якщо у вас є навмисне злиття, ви не хочете запускати, git rebase @{u}тому що воно відтворюватиме все з іншої гілки. Справа з цією справою істотно складніша, тому корисно використовувати git upта уникати git pullвзагалі. Вам, ймовірно, доведеться використовувати, resetщоб скасувати злиття, створене pullі потім зробити git rebase -p @{u}. -pАргумент git rebaseнадійно не працює для мене, так що ви могли б у кінцевому підсумку, щоб використовувати , resetщоб скасувати навмисне злиття, оновити локальну гілка @{u}, а потім повторити навмисне злиття (який є болем , якщо там було багато волохатого злиття конфлікти).