Як перемотати гілку до голови?


249

Я перейшов до майстра після того, як довго розвивався на гілці. Журнал показує:

Ваша філія відстає від "origin / master" на 167 комісій, і її можна швидко переслати.

Я намагався:

git checkout HEAD

Це не має ефекту. Це тому, що у мене є замовлення проміжного комітету на майстра.

Як змусити майстра залишитися на голові?


6
git checkout HEADніколи нічого не робить. HEADвже означає перевірену комісію.
Емре Тапчі

Відповіді:


244

Виконуємо:

git checkout master
git pull origin

отримає і об'єднає origin/masterгілку (ви можете просто сказати git pull, що походження за замовчуванням є початком).


52
Я думаю, що відповідь Роба краща. Зазвичай я стикаюся з цією ситуацією, коли я щойно закінчив тягнути, а потім переходжу на іншу гілку, яку потрібно швидко переслати. Мені дратує, якщо мені доведеться зробити ще одне (не-оп) і чекати, коли це завершиться; робити операцію лише для місцевих операцій - це швидше, і все одно я хочу цього робити.
Барон Шварц

353

Спробуйте git merge origin/master. Якщо ви хочете бути впевнені, що це лише швидкий рух вперед, ви можете сказати git merge --ff-only origin/master.


4
Це приємно використовувати, коли на вашому пульті є кілька обручів аутентифікації, щоб проскочити через нього. Коли я втягую одну гілку, мені належить пройти автентифікацію. Потім, коли я переходжу на іншу гілку (тобто, щоб вишнево змінити), я вважаю за краще використовувати цю mergeкоманду, щоб мені не довелося повторно підтверджувати автентифікацію.
RustyTheBoyRobot

30
--ff-onlyнадзвичайно корисний.
Лука

4
Я не знаю, чи origin/masterпотрібна частина або чи вона розумно за замовчуванням, але мені здалося корисним зробити псевдонім для швидкого перемотування вперед, тому я хотів переконатися, що гілка вище за течією використовується замість жорсткого кодування для origin/master: ff = merge --ff-only @{u}( @{u}є вище за течією) .
Thor84no

2
це краще, ніж пропонується відповісти, якщо ви в автономному режимі
Jacek Pietal

1
Чи можете ви пояснити, чому просте тягнення не робить те саме? Крім того, чи потрібно ще тягнути, якщо ми це робимо?
Зузу Корнеліу

40

У вашій ситуації git rebaseтеж би зробив трюк. Оскільки у вас немає змін, яких у майстра немає, git просто перемотає вперед. Якщо ви працюєте з робочим процесом ребазу, це може бути більш доцільним, так як ви не закінчилися з комісією злиття, якщо зіпсуєте.

username@workstation:~/work$ git status
# On branch master
# Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean
username@workstation:~/work$ git rebase
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.
# On branch master
nothing to commit, working directory clean

1
І дуже корисно для мене, оскільки ми не повинні використовувати git pull!
Стефан

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

28
git checkout master
git pull

повинен виконати роботу.

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

(branch) $ //hack hack hack, while someone push the changes to origin/master
(branch) $ git pull   

тепер посилання на походження / головне витягнуте, але ваш господар не злитий з ним

(branch) $ git checkout master
(master) $ 

тепер майстер стоїть за походженням / майстром і його можна швидко переслати

this will pull and merge (so merge also newer commits to origin/master)
(master) $ git pull 

this will just merge what you have already pulled
(master) $ git merge origin/master

тепер ваш господар та походження / майстер синхронізовані


13

Якщо ви стоїте на іншій гілці і хочете перевірити новітню версію майстра, ви також можете це зробити

git checkout -B master origin/master


9

Для тих, хто хоче швидко перемотати вперед, вони не переходять до іншої віддаленої гілки (включаючи себе), не перевіряючи цю гілку, ви можете:

git fetch origin master:other

Це в основному швидко пересилає індекс otherдо, origin/masterякщо ви не на otherвідділенні. Ви можете перемотати декілька гілок таким чином.

Якщо ви працюєте над іншою гілкою деякий час і хочете оновити застарілі гілки від віддалених до відповідної голови:

git fetch origin master:master other:other etc:etc

2

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

Або, як другий спробуйте майстер потягу git pull origin лише в тому випадку, якщо вам не пощастить з першою командою


0

Для перебазування на поточну локальний трекер гілки переміщення локальних змін поверх останнього віддаленого стану:

$ git fetch && git rebase

Більш загально, для перемотування вперед та скасування локальних змін ( жорсткий скидання ) *:

$ git fetch && git checkout ${the_branch_name} && git reset --hard origin/${the_branch_name}

для перемотування вперед та збереження локальних змін ( відновлення ):

$ git fetch && git checkout ${the_branch_name} && git rebase origin/${the_branch_name}

* - щоб скасувати зміну, викликану ненавмисним жорстким скиданням спочатку, зробіть git reflog, що відображає стан HEAD у зворотному порядку, знайдіть хеш, на який вказував HEAD перед операцією скидання (як правило, очевидний) та жорсткий скидання гілки на цей хеш.


0

У вашому випадку, щоб перемотати вперед, запустіть:

$ git merge --ff-only origin/master

Для цього використовується --ff-onlyопція git merge, оскільки питання спеціально задає "швидкий вперед".

Ось уривок із git-merge(1)цього розділу, де показано більше варіантів перемотування вперед:

--ff, --no-ff, --ff-only
    Specifies how a merge is handled when the merged-in history is already a descendant of the current history.  --ff is the default unless merging an annotated
    (and possibly signed) tag that is not stored in its natural place in the refs/tags/ hierarchy, in which case --no-ff is assumed.

    With --ff, when possible resolve the merge as a fast-forward (only update the branch pointer to match the merged branch; do not create a merge commit). When
    not possible (when the merged-in history is not a descendant of the current history), create a merge commit.

    With --no-ff, create a merge commit in all cases, even when the merge could instead be resolved as a fast-forward.

    With --ff-only, resolve the merge as a fast-forward when possible. When not possible, refuse to merge and exit with a non-zero status.

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

$ git config --global alias.ff 'merge --ff-only @{upstream}'

Тепер я можу запустити це вперед:

$ git ff

-2

Перемістіть курсор своєї гілки на HEAD:

git branch -f master

Ваша філія masterвже існує, тому git не дозволить вам її перезаписати, якщо ви не використовуєте ... -f(цей аргумент означає --force)

Або ви можете використовувати rebase:

git rebase HEAD master

Робіть це на власний ризик;)


1
Не намагайтеся цього робити. якщо у вас є така ситуація, погані речі відбудуться: C0 --- C1 --- C2 --- C3 --- C4 (майстер). C0 --- C1 --- C2 --- B1 --- B2 --- B3 (dev) Якщо ваша голова знаходиться в B3 (dev), а ви git гілка -f master, ви закінчите C0 - - C1 --- C2 --- B1 --- B2 --- B3 (dev) (майстер). C3 --- C4 не можна дістатись до будь-якої галузі, і в підсумку буде зібрано сміття. Якщо ви опинилися в цій ситуації, погляньте на перемикання та оформлення замовлення C4, скориставшись опцією -b <branch>, щоб створити нову гілку.
A_P
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.