Чому я об'єдную "відділення дистанційного відстеження" походження / розвиток "у розвиток"?


125

Я єдиний в моїй організації, який бере на себе зобов'язання із таким повідомленням:

Об’єднайте відділення дистанційного відстеження "походження / розвиток" у розробку

Не впевнений, що я роблю, щоб викликати їх, але хотів би зупинитися.

Яку команду я видаю, щоб створити цю команду, і яку правильну команду я повинен використовувати, щоб не створювати її?


1
Відповідь Річарда Хансена - прекрасна. Але я думаю, що це може бути бентежно для початківців. Моє рішення полягає в тому, щоб продовжувати робити тягнути --rebase, але щоб уникнути небезпеки, я зберігаю свої зміни перед витягненням. Потім, після витягування, я його наношу. Я вирішую конфлікти. Нарешті я можу здійснити та натиснути.
Johnjohn

Чи git pull --autostash --rebaseпрацює для вас @Johnjohn?
sourcedelica

Відповіді:


206

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


+1 для обговорення - зберегти-злиття, за винятком того, що ви насправді не задокументували, що в командах ви сказали йому запустити, так -1 для цього.
Сет Робертсон

@Seth: Дякую за коментар; Я оновив відповідь, щоб рекомендувати -p. Я уникав рекомендувати його раніше, тому що він не потрібен дуже часто, і його поведінка недостатньо задокументована.
Річард Хансен

3
У чому полягає різниця між git remote update -pі git fetch?
eckes

3
@eckes: git remote update -pте саме, що git fetch --all -p. Я звик користуватися git remote update -pназад, коли fetchне мав -pможливості.
Річард Хансен

1
@ user1914692: Після злиття завершено, Git оновить локальну гілку, щоб вказати на новостворену комісію злиття, а не на той самий фільтр, що і віддалений. Ця нова комісія злиття є проблемою, особливо при натисканні.
Річард Хансен

18
git fetch
git rebase origin/master

Це повинно це робити. Або якщо ви хочете продовжувати використовувати тягнути

git pull --rebase

Ви також можете налаштувати цю гілку у вашому конфігурації для автоматичного відновлення бази даних або налаштувати її так, як автоматично для будь-яких інших майбутніх гілок відстеження, які ви створюєте. Потім ви можете повернутися до простого використання

git pull

Детальніше про це в розділі "тягнути з базою даних замість злиття" на цій сторінці:

http://mislav.uniqpath.com/2010/07/git-tips/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.