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

249

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

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

Я попытался:

git checkout HEAD

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

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

pengguang001
источник
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
voidvector
источник
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

теперь ваш мастер и источник / мастер синхронизированы

Kuba
источник
13

Если вы стоите в другой ветке и хотите проверить новейшую версию мастера, вы также можете сделать

git checkout -B master origin/master

jontro
источник
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отображение состояния заголовка в обратном порядке, найдите хэш, на который указывал заголовок перед операцией сброса (обычно это очевидно), и принудительно сбросьте ветвь к этому хешу.

BoBaH
источник
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

Делайте это на свой страх и риск;)

Do Async
источник
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