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}
, а потім повторити навмисне злиття (який є болем , якщо там було багато волохатого злиття конфлікти).