як витягнути відразу кілька git з git?


13

У репо в мене є декілька гілок, серед яких "майстер" та "розвиваються", які створені для відстеження віддалених гілок "походження / майстер" та "походження / розвиток".

Чи можна вказати, що я хочу одночасно об'єднати (швидко переслати) у майстер і розробку?

Коли я git pullзараз роблю, я отримую щось подібне:

remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
   5386563..902fb45  develop    -> origin/develop
   d637d67..ba81fb2  master     -> origin/master
Updating 5386563..902fb45
Fast-forward

всі віддалені гілки дістаються, але лише гілка, на якій я зараз перебуваю, об’єднана з відповідною віддаленою гілкою.

Тому я повинен робити git checkout master...

Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.

... і потім git pullзнову, а потім переключіться назад, щоб розвиватися, щоб отримати бажаний результат.

Я знаю, що можу зробити псевдоніми / сценарії, які виконують ці кроки. Але я хочу цього уникнути, якщо це можливо, оскільки він схильний до помилок і не дуже ефективний .
Редагувати: добре, дозвольте перефразувати це. Моєю метою було не відмовляти або нахмуритися на сценарій / псевдонім, що налаштовує git Я б просто віддав перевагу вбудованому рішенню, якщо воно існує :)


Я спробував, git pull origin refs/heads/develop:refs/remotes/origin/develop refs/heads/master:refs/remotes/origin/masterале це призвело до того, що віддалений майстер був об'єднаний у розвиток ..
Superole

1
Чому це було б схильним до помилок чи неефективним? Git призначений для налаштування так. BTW, щоб уникнути необхідності перевірки кожної гілки, можливо, ви захочете розділити її pullна fetchнаступну за mergeкожною гілкою.
jjlin

@jjlin добре, якщо я можу це зробити без перевірки кожної гілки, яка може допомогти в ефективності. Це схильність до помилок, оскільки матриця речей, які можуть піти не так, і наслідки, які вона може мати на решту сценарію, є дещо складною. Я не кажу, що зробити це безпечно неможливо, але це було б компромісом. Тому я вважаю за краще вбудоване рішення, якщо воно існує :)
Superole

Відповіді:


11

Ви можете налаштувати псевдонім, який використовує git fetchrefspecs для швидкого перемотування вперед, об'єднання ваших гілок лише однією командою. Установіть це як псевдонім у .gitconfigфайлі користувача :

[alias]
    sync = "!sh -c 'git checkout --quiet --detach HEAD && \
                    git fetch origin master:master develop:develop ; \
                    git checkout --quiet -'"

Використання: git sync.

Ось чому це працює:

  1. git checkout --quiet HEADбезпосередньо перевіряє ваше поточне зобов’язання, вводячи вас у відокремлений стан держави. Таким чином, якщо ви працюєте masterабо developви від'єднуєте свою робочу копію від цих покажчиків гілок, дозволяючи їх переміщувати (Git не дозволить вам переміщувати посилання гілок, поки ваша робоча копія перевірена).

  2. git fetch origin master:master develop:developвикористовує refspecs з fetchдля перемотування вперед masterта developвідділень у вашому місцевому репо. Синтаксис в основному повідомляє Git "ось рефлекс форми <source>:<destination>, візьміть <destination>і перемотайте її до тієї ж точки, що і <source>". Таким чином, джерелами псевдоніму є гілки origin, а пункти призначення - локальні версії репо цих гілок.

  3. Нарешті, git checkout --quiet -перевірте гілку, на якій ви востаннє були, незалежно від того, стався збій у попередніх командах чи ні. Тож якщо ви ввійшли, masterколи ви бігли git sync, і все вдалося, ви залишите відокремлений стан голови та перевірте нещодавно оновлений master.

Дивіться також мою відповідь на git: оновити локальну гілку, не перевіряючи її? .


Я не дуже розумію тут відривну магію, чому не можна переміщувати покажчик для управління, коли перевіряється розвиток? ... все одно я спробував це, і, здається, працює, за винятком тепер я отримую "Ваша філія випереджає" походження / розвиток "на 1 комітет".
Superole

... що вирішується наступного разу, коли я потягну
Superole

@Superole, яка галузь попереду, origin/developколи ви використовуєте псевдонім? Не було б сенсу, якби це була ваша місцева developфілія. Крім того, вказівник на master можна перемістити, якщо це developперевірено, справа в тому, що якщо це masterперевірено, то ви не можете перемотати вперед, masterтому що це вплине на вашу робочу копію, тому ви від'єднуєте робочу копію з неї спочатку за допомогою git checkout head. Я побачив ще одну відповідь, яка описувала це як "стоїть на скелі", ви повинні зійти зі скелі, перш ніж ви зможете її перемістити.
40XUserNotFound

це було справді моє місцеве розвиток. І причиною має бути те, що цей збір не оновлює гілки відстеження. Як я це розумію; витяг з’явиться у походження / розвитку, а потім злиється з розвитком.
Superole

Дуже важливо, що ця відповідь викликає fatal: bad config line xx in file xxx. що викликається крапкою з комою. вам потрібно загортати всю команду в подвійній цитаті, щоб уникнути цього питання.
Вільям Леун

1

Встановити git-up . Це дає команду, git-upяка буде витягувати всі локальні гілки у вашому сховищі.


солодкий! Я перевірю це напевно.
Супероле

2
хе: P Висловлювання підтримки Windows передбачувано відсутні. і ще не має бути сформульовано суворий доказ того, що він точно не зіпсується з вашими налаштуваннями git, видаленням даних або опублікуванням недійсного переходу на Hacker News від вашого імені. , в поєднанні з потребою в Рубі, мене відігнало. Мені подобається ця концепція.
Супероле

Радий , що є спосіб взагалі ... свого родом Sucky, хоча , що кожен метод вимагає деяких стороннього інструменту. Такі як ця та команда з командою "рецепт" оболонки або псевдонім, що використовує певну оболонку (для платформи).
0xC0000022L

0

Здається, що немає вбудованого варіанту, щоб git можна було перетягнути на кілька гілок. Принаймні, не у версії 1.8.0. хоча відповідь @ Cupcake близька до цього.

Однак коментар @ jjlin дав мені зрозуміти, що принаймні мені не потрібно двічі тягнути.

Отже, трохи більш ефективною послідовністю буде:

git pull
git checkout master
git merge origin/master
git checkout -

Неминуче я закінчив створити псевдонім, але вирішив залишити його, і зосередився на тому, щоб просто переадресувати іншу галузь.

[alias]
ffwd = "!_() { git checkout $1 && git merge --ff-only origin/$1 && git checkout -; }; _"

Звичайно, без тестування цього псевдоніма передбачається, що я надаю дійсне ім'я гілки ff'able як 1-й аргумент, і не визначає поведінку в іншому випадку. Він також не є оптимальним для випадків використання з більш ніж двома гілками, але він отримає мені те, що мені потрібно зараз.

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