2015-05-20 3 views
2

Есть много вопросов по этому вопросу, но все они, похоже, ссылаются на удаленные изменения. Для меня это не так.Git отказывается от push (за удаленным партнером)

$ git push repo master 
... 
hint: Updates were rejected because the tip of your current branch is behind 
hint: its remote counterpart. 

$ git fetch repo master 
$ git diff repo/master 
<single commit I've done locally> 

Да, git pull позволит мне нажать, но, как мне нужно, чтобы сделать его более или менее каждый раз, когда что-то не так.

Edit:

После комментария Rup, я проверил, как он выглядел в gitk --all, и это выглядело как мой удаленный отвлекает. Итак, это странно.

Image from gitk --all

Проверка, чтобы увидеть, если у меня есть, что совершить локально:

$ git branch -r --contains 48673b311730fdfcf71b0e5776f6180c5173df42 
    origin/master 
$ git branch --contains 48673b311730fdfcf71b0e5776f6180c5173df42 

Таким образом, по-видимому, у меня есть обязательство удаленно, в репо только я могу получить доступ, что у меня нет на месте , Я использую только один компьютер, который не может произойти откуда-то, кроме этого компьютера и меня. Я смущен.

Редактировать 2: Итак, после ответа Джавабретта, я рискнул превратиться в рефлоги.

d022f6d [email protected]{144}: pull bt master: 
41a6f50 [email protected]{145}: pull bt master: checkout 41a6f50f7e3e96723f0d1c222205645d78a504db 
48673b3 [email protected]{146}: commit: Added commented out urls to .env 
14948e3 [email protected]{147}: rebase finished: returning to refs/heads/master 
14948e3 [email protected]{148}: pull bt master: checkout 14948e3c4dd014bb5af7293fdee6772a9e605b6f 

Где bt является общим репо. Мое лучшее предположение, я нажал на свое частное репо, но, оторвавшись от общего репо, я переустанавливаю на bt/master, а оригинальная фиксация «исчезает». Повторное нажатие на приватное вызовет отказ, потому что история не синхронизируется. Что?

+1

Похоже, что ваши изменения уже были перенесены в пульт. 'git pull' должен просто ускоряться вперед. – thirtythreeforty

+1

Попробуйте 'gitk --all', чтобы увидеть точные отношения между локальными и удаленными ветвями. – Rup

+0

Опубликовать журнал последних коммитов для локального и удаленного. – javabrett

ответ

1

gitk вид немного мал, поэтому немного догадок здесь, и не содержит совершающие-хэши или текущее местное HEAD или совершают следующие «Удалены объявления из основного макета "- это фиксация с комментарием" Добавлены прокомментированные URL-адреса в .env "или что-то совсем другое? В любом случае он не имеет фиксации хеша 48673b3.

Ваш тест --contains полезен. Вы также должны запустить git reflog и grep или найти 48673b3. Это может показать вам, когда ваш местный HEAD указал на 48673b3, и что произошло сразу или после этого.

Скорее всего, через прямую команду или какой-либо инструмент, который вы переустановили или скомпилировали или внесли исправления в remotes/origin/master в свое местное репо. Или, может быть, вы сбросили дату/время или автора. Git теперь рассматривает это как независимую линию развития - вы никогда не должны переустанавливать или раздавать в фиксацию, которую вы уже что-то нажали, если это то, что произошло.

Вашего git reflog может показать что-то вроде этого, например:

20fa43d [email protected]{0}: commit (amend): Added commented out urls to .env 
48673b3 [email protected]{1}: commit: Added commented out urls to .env 
e039c6c [email protected]{2}: commit: Updated backend variables to new test server. 

Если да, то (изменить) говорит вам, что пошло не так - вы бы переписаны местную историю в этом случае, и вы можете не более длинный шаг вперед этой ветви. Если это так, то вы можете это исправить с перебазирования (возможно сделать это на временную ветвь первого):

git rebase --onto origin/master origin/master 

В зависимости от того, что изменилось в вашей местной истории, вы можете получить слияния конфликт разрешить для измененный коммит в вашем местном. После этого вы будете переписывать любые локальные коммиты, чтобы они согласились с удаленной историей, и вы должны иметь возможность выполнить быстрый перемотки вперед.

Вопрос Редактировать обновление 2 Ответ:

С информацией о другой, вверх по течению пульта дистанционного управления, то перебазироваться на то и reflog, это достаточно ясно, что произошло.

То же самое изменение, которое вы сделали в 48673b3 и подтолкнул к origin/master также содержится в другой фиксации, либо сам по себе или смешанного с использованием других изменений, сделанных вами или кем-то еще и нажат в upstream/master (bt/master для вас). Когда вы выберете git pull из восходящего потока, Git создаст слияние. Хотя он не отображается в reflog, вы вытаскивали и затем предварительно сворачивали на /[email protected]{147}, поэтому разумно предположить, что вы сделали это снова после [email protected]{144}, пытаясь вернуться к линейной истории, удалив фиксацию слияния. Вы запустили git rebase без --keep-empty, и когда 48673b3 был переигран сверху-вверх bt/master, делать нечего было, так что фиксация была отброшена по умолчанию для rebase.

origin/masterorigin/master теперь отклонился от вашего местного репо, будучи одним фиксатором 48673b3 перед самым младшим общим родителем, который может быть 14948e3. Git не позволит вам нажать (без -f силы) - даже если хеши дерева могут быть идентичными, истории фиксаций расходятся.

Некоторых советы по рабочим процессам:

1) Если вы предпочитаете перебазирования и линейную историю, имеющие слияния-фиксации (вполне справедливо), то всегда придерживаться его. Запустите git fetch ... и git rebase ..., никогда не запускайте git pull (выборка и слияние) или git merge, или если необходимо, запустите их с помощью --ff=only, чтобы они запускались только тогда, когда у вас нет новых коммитов в вашей локальной сети. Рассмотрим настройку config pull.ff=only и merge.ff=only, чтобы обеспечить выполнение этого в случае, если вы забудете их в командной строке. С этим на месте, если вы явно не заявите об ином, вы никогда не попадете в нелинейное состояние с восходящим потоком, вам всегда будет напоминать git rebase bt/master.

На самом деле это не поможет устранить вашу проблему, но лучше избегать смешивания стратегий слияния/переупорки. Если ваша стратегия заключается в переустановке, и вы случайно создаете слияние, перезагрузитесь в свой новый локальный коммит и повторите попытку.

2) Если вы работаете и нажимаете на два удаленных РЕПО, один из которых изменяется (вверх по течению), а вы пересобираете, рано или поздно вы столкнетесь с этой проблемой и должны определить, что ваш местный «сейчас», новейший "и принудительно нажмите на ваш частный origin/master.Возвращение ветки, которая уже была нажата на удаленный компьютер, всегда будет в конечном итоге отклеиваться - перераспределение (или раздача или изменение) - это способы перезаписи истории, поэтому истории всегда будут расходиться. Если вы используете origin/master просто как «резервное копирование только для записи» для своего кода, привыкнуть к запуску push -f, чтобы перезаписать его (конечно, вам нужно знать, что это правильно или вы потеряете фиксации), или еще лучше, просто push origin HEAD: `date -u +% Y% m% d% H% M% S``, чтобы дать вам не противоречащие ссылки, которые вы можете позже отбросить. Если вы используете origin для чего-то более сложного, тогда вам нужно будет знать о проблемах, которые возникнут при перезагрузке вверх.

+0

Хотя я не полностью понимаю свои логги, этот ответ достаточно близко для принятия. Я понял, что это связано с перезагрузкой, и это не неожиданно. Не стесняйтесь прокомментировать мое второе редактирование. – Frans

+0

Фантастический ответ, спасибо! – Frans

1

Возможно, вы могли бы попытаться потянуть с опцией переустановки.

git pull --rebase origin master 

чем:

git push 
+0

Фактически пробовал это вчера, но мне непонятно, почему это изменило бы ситуацию. – Frans

+0

Взгляните на эту ссылку: http://gitready.com/advanced/2009/02/11/pull-with-rebase.html – teoreda

Смежные вопросы