Как перемотать ветку вперед?


249

Я переключился на мастера после разработки на ветке в течение длительного времени. Журнал показывает:

Ваша ветвь отстает от 'origin / master' на 167 коммитов и может быть быстро перенесена.

Я попытался:

git checkout HEAD

Это не имеет никакого эффекта. Это потому, что у меня есть промежуточный коммит на мастере.

Как заставить мастера остаться на голове?


6
git checkout HEADникогда ничего не делает HEADуже означает извлеченный коммит.
— Эмре Тапчи

Ответы:


244

Выполнение:

git checkout master
git pull origin

извлечет и объединит origin/masterветку (вы можете просто сказать, git pullчто origin является значением по умолчанию).


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

354

Попробуй git merge origin/master. Если вы хотите быть уверены, что это только ускоренная перемотка вперед, вы можете сказать git merge --ff-only origin/master.


4
Это удобно использовать, когда на вашем пульте есть несколько переходов для аутентификации. Когда я вытягиваю одну ветку, я должен аутентифицироваться. Затем, когда я переключаюсь на другую ветку (то есть, чтобы выбрать свои изменения), я предпочитаю использовать эту mergeкоманду, чтобы мне не нужно было проходить повторную аутентификацию.
— RustyTheBoyRobot

30
--ff-onlyочень полезно.
— Люк

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

2
Это лучше, чем предлагаемый ответ, если вы не в сети
— Jacek Pietal

1
Не могли бы вы объяснить, почему простое вытягивание не делает то же самое? Кроме того, нужно ли тянуть, если мы сделаем это?
— Зузу Корнелиу

40

В вашей ситуации, git rebaseтакже сделал бы свое дело . Поскольку у вас нет изменений, которых нет у мастера, git просто перемотает вперед. Если вы работаете с рабочим процессом rebase, это может быть более целесообразно, поскольку вы не получите коммит слияния, если вы все испортите.

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

должен сделать работу.

Вы будете получать сообщение «Ваша ветвь позади» каждый раз, когда вы работаете над веткой, отличной от главной , кто-то меняет мастер, и вы выполняете 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 master только в случае, если вам не повезло с первой командой


0

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

$ git fetch && git rebase

В целом, для быстрой перемотки вперед и удаления локальных изменений ( полный сброс ) *:

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

для быстрой перемотки вперед и сохранения локальных изменений ( rebase ):

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

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


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

Переместите указатель вашей ветки на ГОЛОВУ:

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 branch -f master, вы получите C0 - - C1 --- C2 --- B1 --- B2 --- B3 (dev) (мастер). C3 --- C4 недоступны из любой ветки и в конечном итоге будут собираться мусором. Если вы оказались в такой ситуации, посмотрите на reflog и извлеките коммит C4 с опцией -b <branch>, чтобы создать новую ветку.
— A_P
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.