Вивільнення віддалених відділень у Git


135

Я використовую проміжне сховище Git для відображення віддаленого сховища SVN, з якого люди можуть клонуватися та працювати над. Проміжне сховище має його головну гілку щоночі перезавантажувати з висхідного SVN, і ми працюємо над функціональними гілками. Наприклад:

remote:
  master

local:
  master
  feature

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

remote:
  master
  feature

local:
  master
  feature

Потім я знову встановлюю гілку для відстеження віддаленого:

remote:
  master
  feature

local:
  master
  feature -> origin/feature

І все добре. Що я хотів би зробити звідси - це відновити функціональну гілку на головну гілку на пульті дистанційного управління, але я хотів би зробити це на своїй локальній машині. Я хотів би мати можливість:

git checkout master
git pull
git checkout feature
git rebase master
git push origin feature

Щоб підтримувати відділення віддаленої функції в курсі віддаленого майстра. Однак цей метод змушує Git скаржитися:

To <remote>
 ! [rejected]        feature -> feature (non-fast-forward)
error: failed to push some refs to '<remote>'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

git pullробить фокус, але викликає злиття, яке я хотів би уникнути. Я стурбований тим, що повідомлення повідомляє, feature -> featureа неfeature -> origin/feature але це може бути просто презентацією.

Я чогось пропускаю, чи про це роблю зовсім неправильно? Не важливо уникати повторної роботи на віддаленому сервері, але це набагато важче виправляє будь-які конфлікти злиття з ребазою.


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

Відповіді:


185

Це зводиться до того, чи функцію використовує одна людина, чи інші її працюють.

Ви можете змусити натиснути після перезавантаження, якщо це лише ви:

git push origin feature -f

Однак якщо над цим працюють інші, вам слід злитись, а не перезавантажуватись від майстра.

git merge master
git push origin feature

Це забезпечить вам спільну історію з людьми, з якими співпрацюєте.

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

Це моя стаття на тему, яку називають гілкою за ознакою .

Сподіваюся, це допомагає.


29
+1 для if others are working on it, you should merge and not rebase off of master, ребауз краще використовувати лише на приватній філії.
Хендра Узія

6
альтернатива функції git push origin - якщо ви також можете видалити віддалену функцію та знову натиснути функцію
Markus

2
Об'єднання магістра у вашу гілку створить об'єднання об'єднань і спричинить конфлікти з будь-якою іншою гілкою відкритої функції з головним після внесення змін.
Стівен

+1 для git push origin feature -f. У певних контекстах може знадобитися виконати ребауз навіть із віддаленими гілками. Суть - це знати, що ти робиш. І ми повинні переконатися, що ви можете видаляти комісії у віддаленому репо.
енагра

33

Приємно, що ви підняли цю тему.

Це важлива річ / концепція в git, яку багато користувачів git отримали б користь від того, щоб знати. git rebase - це дуже потужний інструмент, який дозволяє вам скріплювати комміни, видаляти коміти і т. д. Але, як і у будь-якого потужного інструменту, вам в основному потрібно знати, що ви робите, або щось може піти не так.

Коли ви працюєте на місцях і вадитесь із своїми місцевими відділеннями, ви можете робити все, що завгодно, доки ви не пересунули зміни до центрального сховища. Це означає, що ви можете переписати власну історію, але не іншу історію. Шляхуючись лише з вашими локальними речами, нічого не вплине на інші сховища.

Ось чому важливо пам’ятати, що після того, як ви надіслали комісії, вам не слід згодом їх переоновлювати. Причина, чому це важливо, полягає в тому, що інші люди можуть брати участь у ваших зобов’язаннях і базувати свою роботу на ваших внесках у кодову базу, а якщо згодом вирішите перенести цей вміст з одного місця в інше (відновити його наново) та перемістити їх зміни, то інші люди отримають проблеми і доведеться переробити код. А тепер уявіть, що у вас є 1000 розробників :) Це просто спричиняє багато непотрібних переробок.


Відхилений за погану мову: meta.stackexchange.com/questions/22232/…
Повноваження

1
Оновили мою мову.
ralphtheninja

5

Оскільки ви переоцінилися featureна нове master, ваш місцевий місцевий featureшлях origin/featureвже не швидкий . Тож я думаю, що в цьому випадку цілком чудово перекрити швидку перевірку вперед git push origin +feature. Ви також можете вказати це у своєму конфігурації

git config remote.origin.push +refs/heads/feature:refs/heads/feature

Якщо інші люди працюють над ними origin/feature, їх буде турбувати це вимушене оновлення. Ви можете уникнути цього, об’єднавши нове masterв featureзамість того, щоб звільнити його. Результат справді буде швидким вперед.


1

Ви можете відключити чек (якщо ви впевнені, що знаєте, що робите), скориставшись --forceопцією " git push.


15
Проблема в тому, що я не впевнений, що я дійсно знаю, що роблю :)
kfb

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