git тягнути від майстра до галузі розвитку


494

У мене є гілка під назвою dmgr2 (розробка), і я хочу вийти з головного відділення (веб-сайт) і включити всі зміни у свою галузь розвитку. чи є кращий спосіб це зробити? ось що я планував робити після внесення змін:

git checkout dmgr2
git pull origin master

це повинно втягнути живі зміни в мою галузь розвитку, чи я маю це неправильно?


1
спочатку введіть усі свої зміни у відділенні dmgr2. а потім вкажіть на майстер 1.git checkout master, а потім отримайте останню зміну 2.git pull 3.git merge dmgr2 4.git push -u origin master, а потім поверніться до dmgr2 5.git checkm dmgr2
mat_vee

я вже здійснив усі свої зміни у відділенні dmgr2, вибачте забув додати це
Меттью Коллі

1
якщо я виконую крок 4, що не підштовхує зміни моєї розробки до майстра? я не хочу цього робити
Меттью Коллі

Отже, що ви говорите, що ви хочете внести зміни зі свого головного відділення, у вашу галузь розробки?
JcKelley

9
Перехід до devгілки за допомогою a git checkout dev. Потім git pull --rebase origin master. Якщо вам пощастить, конфліктів не буде, і у розробника відбудуться останні зміни від господаря.
jww

Відповіді:


724

Кроки, які ви перерахували, працюватимуть, але існує довший шлях, який дає вам більше можливостей:

git checkout dmgr2      # gets you "on branch dmgr2"
git fetch origin        # gets you up to date with origin
git merge origin/master

fetchКоманда може бути зроблено в будь-який момент до того , як merge, наприклад, ви можете поміняти порядок вибірки і контроль, тому що fetchпросто переходить до імені віддаленого ( origin) і каже йому: «Дай мені все , що ви є , що я не ", тобто всі зобов'язання на всіх гілках. Вони будуть скопійовані у ваше сховище, але названі origin/branchдля будь-якої гілки, названої branchна пульті.

У цей момент ви можете скористатися будь-яким переглядачем ( git log, gitkтощо), щоб побачити "що вони мають", чого у вас немає, і навпаки. Іноді це корисно лише для теплих нечітких почуттів ("ах, так, це насправді те, що я хочу"), а іноді корисно для зміни стратегій цілком ("що, я ще не хочу ТОГО речі").

Нарешті, mergeкоманда приймає дану команду, яку ви можете назвати як origin/master, і робить все, що потрібно для залучення цього комітету та його предків до будь-якої гілки, на якій ви працюєте, коли запускаєте команду merge. Ви можете вставити --no-ffабо --ff-onlyзапобігти перемотці вперед або об'єднати, лише якщо результат швидкий вперед, якщо вам подобається.

При використанні послідовності:

git checkout dmgr2
git pull origin master

то pullкоманда інструктує мерзотник для запуску git fetch, а потім моральний еквівалент git merge origin/master. Отже, це майже те саме, що робити два кроки вручну, але є деякі тонкі відмінності, які, ймовірно, не надто стосуються вас. (Зокрема, fetchкрок, який виконується, pullприносить лише те origin/master , і він не оновлює посилання у вашій репортажі: 1 будь-які нові перетворення вітрів, про які йдеться лише у спеціальній FETCH_HEADдовідці.)

Якщо ви використовуєте більш явне git fetch origin(потім необов’язково огляньтесь навколо), а потім git merge origin/masterпослідовність, ви також можете привести свій власний локальний masterоновлення з пульта дистанційного керування лише одним fetchзапуском через мережу:

git fetch origin
git checkout master
git merge --ff-only origin/master
git checkout dmgr2
git merge --no-ff origin/master

наприклад.


1 Ця друга частина була змінена - я кажу "виправлена" - в git 1.8.4, який тепер оновлює посилання на "віддалену гілку". (Як зазначається у випуску, це було обдумане дизайнерське рішення пропустити оновлення, але виявляється, що більшість людей вважають за краще цей git оновити його. Якщо ви хочете, щоб стара віддалена гілка SHA-1, вона за замовчуванням зберігається в , і, таким чином, виходить з рефлогу. Це також дозволяє отримати нову функцію git 1.9 / 2.0 для пошуку відшкодування за течією.)


28
Я просто прошу подругу, е-а, друг - як би ти пішов про скасування першого блоку коду, який у тебе є тут (checkout / fetch / merge)?
Річ Бредшоу

10
@RichBradshaw: git checkoutзазвичай не є руйнівним, і зазвичай немає підстав скасовувати git fetch, так що це здається, що ви запитуєте, як відмовитись від об'єднання об'єднань. Відповідь така ж, як і для інших комісій: або git resetабо git revert. Для неопублікованих змін git resetзазвичай найкращий метод; зміни, які вже є, git revertможуть бути краще, але дивіться поради Лінуса Торвальда щодо відновлення злиття: kernel.org/pub/software/scm/git/docs/howto/…
torek

2
@WeDoTDD: Я не розумію питання. Є цілий ряд команд для перегляду фіксації графіка ( gitk, git log --graphз або без --oneline, і так далі) , і ви можете git showабо git show -mзлиття зробити, або використання git diff. У всіх цих випадках ви вказуєте програму під час введення команди в командному рядку.
torek

1
@torek: спробував ваш шлях: гілка перевірки git, а потім git pull master origin, але це потягнуло всі зміни master як єдину зміну, яку слід здійснити знову локально, замість того, щоб тягнути їх за допомогою історії фіксування та повідомлень, тому після оновлення локальних master і перехід на гілку, "git rebase master" виконує завдання для вирішення всіх конфліктів, а потім я додаю до "git pull --rebase" і знову обробляю всі конфлікти, а потім git push гілка походження, щоб все вирівняти. Я здогадуюсь, для цього повинен бути кращий шлях - я прав?
користувач10556443

1
@torek: Я погоджуюся, що результат, який я отримав, - це стомлюючий процес, який змушує мене обробляти повторне відновлення та злиття & ... кожного разу, коли мені хочеться отримати оновлення від майстра ... Але запропонований спосіб, який, я визнаю, є набагато простіше, отримано всі зміни в рамках однієї невдалої зміни в місцевому відділенні, не зберігаючи замовлення / історію замовлення. Я буду радий дізнатися кращу пропозицію, як користуватися "добутком" і слідкувати за майстром без необхідності використовувати "тягнути" тощо
user10556443

14

Ситуація : працюю в моєму місцевому відділенні, але я люблю продовжувати оновлення у галузі розвитку з назвою dev.

Рішення : Зазвичай я вважаю за краще:

git fetch
git rebase origin/dev

15
За звичайної відмови від відповідальності, що повторне базування даних слід проводити лише в тому випадку, якщо локальна гілка є лише локальною, тобто не пересувається ніде, оскільки вона переписує історію.
Локус

8

Це працювало для мене. Для отримання останнього коду від майстра до моєї філії

git rebase origin/master


Не забудьте git fetch originспочатку.
lenooh

3

Сценарій :

У мене є оновлення майстра і оновлення моєї гілки, я хочу, щоб моя гілка відслідковувала майстер з перезавантаженням, щоб вся історія відстежувалася належним чином, давайте назвемо свою гілку Mybranch

Рішення :

git checkout master    
git pull --rebase    
git checkout Mybranch    
git rebase master
git push -f origin Mybranch
  • потрібно вирішити всі конфлікти з git mergetool &, git rebase - продовжувати, git rebase --skip, git add -u, відповідно до ситуації та підказів git, поки все не вирішиться

(виправлення до останнього етапу люб’язно Tzachi Cohen, використовуючи "-f" сили git для "оновлення історії" на сервері)

тепер гілка повинна бути узгоджена з master та rebased, також з віддаленим оновленням, тому в журналі git немає "позаду" або "вперед", просто потрібно видалити всі локальні конфліктні файли * .orig, щоб папка залишалася "чистою"

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