Написал файл случайно и нажал его на мастер (никаких других ветвей). Могу ли я восстановить это? [Дубликат]

Вместо того, чтобы бросать код на вас, есть два понятия, которые являются ключом к пониманию того, как JS обрабатывает обратные вызовы и асинхронность. (это даже слово?)

Модель цикла события и параллелизма

Есть три вещи, о которых вам нужно знать; Очередь; цикл события и стек

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

while (queue.waitForMessage()) {
   queue.processNextMessage();
}

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

 1. call foo.com/api/bar using foobarFunc
 2. Go perform an infinite loop
 ... and so on

Когда одно из этих сообщений будет исполнено, оно выталкивает сообщение из очереди и создает стек, стек - это все, что нужно выполнить JS для выполнения инструкции в сообщение. Таким образом, в нашем примере ему говорят позвонить foobarFunc

function foobarFunc (var) {
  console.log(anotherFunction(var));
}

. Так что все, что foobarFunc должно выполнить (в нашем случае anotherFunction), будет вставлено в стек. исполняемый, а затем забытый - цикл события затем переместится на следующую вещь в очереди (или прослушивает сообщения)

. Главное здесь - порядок выполнения. Это

КОГДА что-то будет запущено

Когда вы совершаете вызов с использованием AJAX для внешней стороны или выполняете любой асинхронный код (например, setTimeout), Javascript зависит от ответ, прежде чем он сможет продолжить.

Большой вопрос, когда он получит ответ? Ответ в том, что мы не знаем, поэтому цикл событий ждет, когда это сообщение скажет: «Эй, забери меня». Если JS просто ждал этого сообщения синхронно, ваше приложение замерзнет, ​​и оно сосать. Таким образом, JS продолжает выполнение следующего элемента в очереди, ожидая, пока сообщение не будет добавлено обратно в очередь.

Вот почему с асинхронной функциональностью мы используем вещи, называемые обратными вызовами. Это похоже на обещание буквально. Как и в I , обещание что-то вернуть в какой-то момент jQuery использует специальные обратные вызовы, называемые deffered.done deffered.fail и deffered.always (среди других). Вы можете увидеть их все здесь

Итак, вам нужно передать функцию, которая в какой-то момент будет выполнена с переданными ей данными.

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

function foo(bla) {
  console.log(bla)
}

, поэтому большую часть времени (но не всегда) вы пройдете foo не foo()

. Надеюсь, это будет иметь смысл. Когда вы сталкиваетесь с такими вещами, которые кажутся запутанными, я настоятельно рекомендую полностью прочитать документацию, чтобы хотя бы понять ее. Это сделает вас намного лучшим разработчиком.

196
задан jubobs 5 January 2015 в 17:37
поделиться

7 ответов

git reset --hard HEAD~1
git push -f <remote> <branch>

(Пример push: git push -f origin bugfix/bug123 )

Это приведет к отмене последнего фиксации и удалению обновленной истории на удаленный компьютер. Вам необходимо передать -f, потому что вы заменяете предысторию на пульте дистанционного управления.

328
ответ дан Steve Chambers 24 August 2018 в 08:34
поделиться

Как правило, сделайте «обратную» фиксацию, используя:

git revert 364705c

, затем отправьте ее на пульт, как обычно:

git push

Это не приведет к удалению фиксации : он делает дополнительную фиксацию, которая отменяет все, что было сделано первым. Что-нибудь еще, не совсем безопасно, особенно когда изменения уже были распространены.

142
ответ дан Amadan 24 August 2018 в 08:34
поделиться

Вы можете сделать интерактивную rebase:

git rebase -i <commit>

Это вызовет ваш редактор по умолчанию. Просто удалите строку, содержащую фиксацию, которую вы хотите удалить, чтобы удалить эту фиксацию.

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

См. этот вопрос: Git: удаление выделенных коммитов из репозитория

3
ответ дан Community 24 August 2018 в 08:34
поделиться

Прежде всего, Relax.

«Ничто не находится под нашим контролем. Наш контроль - это просто иллюзия.», «Чтобы ошибаться человек»

Я понимаю, что вы непреднамеренно нажал ваш код на remote-master. Это будет хорошо.

1. Сначала получите значение SHA-1 комманды, которую вы пытаетесь вернуть, например. зафиксировать ветвь. запустите это:

git log

вы увидите связку 'f650a9e398ad9ca606b25513bd4af9fe ...' как строки вместе с каждым из коммитов. скопируйте это число из фиксации, которое вы хотите вернуть назад .

2. Теперь введите команду ниже:

git reset --hard your_that_copied_string_but_without_quote_mark

вы должны увидеть сообщение типа «HEAD now at». вы на виду. То, что он только что сделал, это отразить это изменение локально.

3. Теперь введите следующую команду:

git push -f

вы должны увидеть как

"предупреждение: push.default не задано, его неявное значение изменилось в .... . ... Всего 0 (delta 0), повторно используется 0 (delta 0) ... ... your_branch_name -> master (принудительное обновление). "

Теперь вы все поняли ,

приветствуется (заранее;))

UPDATE:

g16] Теперь изменения, которые вы сделали до того, как все это началось, теперь исчезли. Если вы хотите снова вернуть эти тяжелые работы, это возможно. Благодаря git reflog и командам git cherry-pick.

Для этого я бы посоветовал прочесть этот блог или этот пост .

28
ответ дан kmonsoor 24 August 2018 в 08:34
поделиться

В качестве альтернативы:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

Подключите главную ветвь исходного репозитория к родительскому объекту последнего коммита

2
ответ дан MicRum 24 August 2018 в 08:34
поделиться

Попробуйте использовать

git reset --hard <commit id> 

Обратите внимание: здесь commit id будет идентификатором фиксации, к которой вы хотите перейти, но не идентификатором, который вы хотите сбросить. это был единственный момент, когда я тоже застрял.

, затем нажмите

git push -f <remote> <branch>
4
ответ дан Mohit Dhawan 24 August 2018 в 08:34
поделиться

git reset HEAD~1, если вы не хотите, чтобы ваши изменения исчезли (нестатические изменения). Изменить, зафиксировать и снова нажать git push -f [origin] [branch]

6
ответ дан softvar 24 August 2018 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: