Як відновити локальну гілку з віддаленим майстром


932

У мене є клонований проект з головного відділення з віддаленого сховища remote_repo. Я створюю нову гілку, і я зобов'язуюся до неї. Інші програмісти підштовхнулися до remote_repoголовного відділення.

Мені потрібно зараз перезавантажити свою відділення RB на remote_repomaster.

Як це зробити? Які команди ввести в термінал?


14
Для мене це питання неоднозначне, оскільки "з" може означати відмову в будь-якому напрямку. Дивлячись на відповіді, я бачу, що ціль полягає в тому, щоб переділити свою філію на віддалений майстер, а не навпаки. Я згадую це у випадку, якщо хтось дотримується відповіді нижче та отримує зворотній бік того, що хоче.
Глен Лоуренс

8
@GlennLawrence Я думаю, що краще відредагувати оригінальне запитання, ніж додати коментар. Цьому також сприяє stackoverflow. Крім того, перезапуск майстра на RB, швидше за все, не вдасться, тому що RB залежить від історії master.
Даніель Кулльман

Відповіді:


1244

Спершу вийміть нового майстра з сховища вище, а потім відновіть свою робочу гілку на цьому:

git fetch origin            # Updates origin/master
git rebase origin/master    # Rebases current branch onto origin/master

Оновлення : Дивіться відповідь Пола Дрейпера для більш стислого способу зробити те саме - останні версії Git пропонують більш простий спосіб зробити еквівалент вищевказаних двох команд.


16
це єдина відповідь, яка насправді робить те, про що просили
kayaker243

5
@ kayaker243 Ні, це те саме, що відповів Пол Дрейперс, але я думаю, що в довгому вигляді.
erik

7
@erik Зауважимо, що Пол Дрейпер написав свою відповідь приблизно через півроку після коментаря kayaker243 (і майже через два роки після цієї відповіді).
Фріріх Раабе

3
Я отримую наступне: Your branch and 'origin/b1' have diverged, # and have 3 and 2 different commits each, respectively.Схоже git pull, потрібне інше . Це правильно чи я щось тут пропускаю?
Dror

2
@RGC Ні, git rebase masterне робитиме ту ж роботу , як другої команди ( git rebase origin/master) , так masterі origin/masterцілком може вказувати на різні фіксацій (особливо з урахуванням того, що перша команда була git fetch origin, яка може змінити origin/master).
Фріріх Раабе

812
git pull --rebase origin master
# where --rebase[=(false|true|merges|preserve|interactive)]

19
(Рівнозначно відповіді Фріріха)
Пол Дрейпер,

12
Хіба це не дещо інакше, ніж відповідь Фріріха, оскільки це внесе зміни від головного походження до місцевого господаря, тоді як відповідь Фріріха залишає місцевого господаря недоторканим? (тягнути проти фетча)
Джиммі Гуч

7
Ні, у відповідь Фріріха, база даних модифікує місцевого ведучого. Потяг --rebase - це те саме, що і вилучення, за яким слідує
ребаза

9
FYI ви можете робити інтерактивні git pull --rebase=interactive origin master
знижки

14
@adhominem - я перевірив документацію на git-pull , і я не бачу нічого, що підтверджує твердження, що місцевий майстер модифікований. Якщо я перебуваю на гілці з ім'ям devта запуском git pull --rebase origin master, то тільки гілка devбуде змінена, не master. У --rebaseдокументації на прапор зазначено, що вона намагається rebase the current branch on top of the upstream branch after fetchingзмінити місцеві гілки відстеження та нічого не робити .
Відновіть Моніку 2331977

226

Після внесення змін у свою філію, оформити замовлення masterта витягнути її, щоб отримати останні зміни від репо:

git checkout master
git pull origin master

Потім перевірте свою філію та відновіть зміни на master:

git checkout RB
git rebase master

... або останні дві команди в одному рядку:

git rebase master RB

При спробі відштовхуватися назад origin/RB, ймовірно, ви отримаєте помилку; якщо ви єдиний, хто працює над цим RB, ви можете змусити натиснути:

git push --force origin RB

... або наступним чином, якщо ви git правильно налаштовані:

git push -f

4
при спробі відштовхуватися до вихідного / RB, ймовірно, ви отримаєте помилку. Якщо ви єдиний, хто працює на RB, ви можете навести git push - примусового походження RB. Джерело: stackoverflow.com/questions/8939977/…
Джої Барух

1
А .... я маю саме це. мій "RB" перезавантажений правильно, але я отримую нескінченні помилки при спробі натиснути його після ребатування. Окрім PB - примусового походження RB - чи є "приємніший" (не примусовий) спосіб зробити це? Я просто намагаюся зрозуміти сприйняття гетса тут - і не вдається.
Motti Shneor

2
@MottiShneor Ні, немає приємного способу. Якщо хтось інший натисне на гілку тим часом, їх зміни будуть втрачені! Якщо ви хочете бути приємними до історії git commit, вам слід скоріше об'єднати майстра у свою гілку, що є безпечним (можна обійтися і git pushбез -f).
Даніель Куллман

109

Примітка: Якщо у вас вже є широкі знання про перезавантаження, використовуйте нижче одного вкладиша для швидкого відновлення. Рішення: якщо припустити, що ви працюєте у своєму відділенні, і ви єдина людина, яка працює над цим.

git fetch && git rebase origin/master

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

                            ~:   For noobs   :~

Наступні кроки можуть допомогти всім, хто не знайомий git rebaseі хотів це зробити без клопоту

Крок 1: Припустимо, що на YourBranch в цей момент жодних комісій та змін не повинно бути внесено. Ми відвідуємо YourBranch.

git checkout YourBranch
git pull --rebase

Що трапилось?Витягує всі зміни, внесені іншими розробниками, що працюють у вашій філії, і повертає ваші зміни поверх них.

Крок 2: Вирішіть будь-які конфлікти, що виникають.

Крок 3:

git checkout master
git pull --rebase

Що трапилось?Витягує всі останні зміни з віддаленого майстра та відновлює локальний майстер на віддалений майстер. Я завжди тримаю віддалений майстер в чистоті і випускаю готовим! І, віддайте перевагу лише працювати на майстрах або галузях на місцях. Я рекомендую робити це до тих пір, поки ви не отримаєте руку щодо змін або git змін. Примітка: Цей крок не потрібен, якщо ви не підтримуєте локальний майстер, натомість ви можете зробити завантаження та відновлення віддаленого майстра безпосередньо на локальній гілці. Як я згадував в одному кроці на початку.

Крок 4: Вирішіть будь-які конфлікти, що виникають.

Крок 5:

git checkout YourBranch
git rebase master

Що трапилось?База даних на майстер буває

Крок 6: Вирішіть будь-які конфлікти, якщо є конфлікти. Використовуйте git rebase --continueдля продовження відновлення після додавання вирішених конфліктів. У будь-який час можна користуватисяgit rebase --abort перериванням бази даних.

Крок 7:

git push --force-with-lease 

Що трапилось? Натискання змін на ваш віддалений YourBranch. --force-with-leaseпереконайтеся, чи є якісь інші вхідні зміни для ВашогоBranch від інших розробників, поки ви перезапускаєте. Це дуже корисно, а не силовий натиск. У разі будь-яких вхідних змін потім отримайте їх, щоб оновити локальний YourBranch перед натисканням змін.

Чому потрібно натиснути на зміни? Щоб переписати повідомлення про фіксацію у віддалений YourBranch після належної перезавантаження або Якщо якісь конфлікти вирішені? Тоді вам потрібно відсунути зміни, які ви вирішили в локальному репо, на віддалене репорту YourBranch

Yahoooo ...! Ви успішно справляєтеся з відсівом.

Ви також можете розглянути:

git checkout master
git merge YourBranch

Коли і чому? Об’єднайте свою філію в головну, якщо це зроблено зі змінами з боку вас та інших співавторів. Завдяки чому ВашBranch є в курсі майстра, коли ви хотіли працювати над тією ж гілкою пізніше.

                            ~:   (๑ơ ₃ ơ)♥ rebase   :~

Для чого це: "Витягує всі останні зміни з" master "та відновлює" master "на останньому" master "." Rebase master на master? Не потрібно просто тягнути останнього майстра?
Джон Малий

@JohnLittle Дякую за вказівку. Я маю на увазі Pulls latest changes from remote master to local master. I always prefer keeping remote master clean and release ready always!. Я оновлю свій опис.
bh4r4th

21

Крок 1:

git fetch origin

Крок 2:

git rebase origin/master

Крок 3: (Виправте конфлікти)

git add .

Крок 4:

git rebase --continue

Крок 5:

git push --force

5
Немає пояснень, з якої галузі слід розпочати. Недобра відповідь.
Карл Моррісон

12

1.Оновіть майстер спочатку ...

git checkout [master branch]
git pull [master branch]

2.Зараз перейдіть джерело-відділення з головним відділенням

git checkout [source branch]
git rebase [master branch]
git pull [source branch] (remote/source branch)
git push [source branch]

Якщо філія джерела ще не існує на віддаленому, тоді виконайте:

git push -u origin [source branch]

"et voila ..."


Мені подобається покрокова природа цієї відповіді. Це допомагає розбити те, що саме відбувається.
Дейв Лю

6

git fetch origin master:master витягує останню версію майстра, не потрібно перевіряти його.

Отже, все, що вам потрібно:

git fetch origin master:master && git rebase master 👌


Не git fetchоновлює майстер, не потребуючи також перевірки? За винятком того, що git fetchце не git mergeтак? Тож якщо ми перевіримо, masterвін не матиме останніх оновлень. То чи не коротше робити в той час як на цій гілці, git fetchто git rebase origin/master? Ми цього не можемо зробити, git rebase masterтому що для того, щоб спробувати переобладнати masterв робочій області, нам потрібно origin/masterдістатись від не ввімкнених, але сидячи в локальному.
Noitidart
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.