Как откат последнего притяжения на git? [Дубликат]

Объяснение C ++.

Подумайте о интерфейсе как об общедоступных методах классов.

Затем вы могли бы создать шаблон, который «зависит» от этих общедоступных методов, чтобы выполнить его (он выполняет вызовы функций, определенные в открытом интерфейсе классов). Предположим, что этот шаблон является контейнером, таким как векторный класс, и интерфейс, от которого он зависит, является алгоритмом поиска.

Любой класс алгоритмов, который определяет функции / интерфейс Vector, вызывает вызовы, которые удовлетворяют «контракту», (как объяснил кто-то в первоначальном ответе). Алгоритмы даже не должны быть одного базового класса; единственное требование состоит в том, что функции / методы, которые вектор зависит от (интерфейса), определены в вашем алгоритме.

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

Возможно, вам также захочется спроектировать другие контейнеры (списки, очереди), которые будут использовать тот же алгоритм поиска, что и Vector by если они выполняют интерфейс / контракт, на которые зависят ваши алгоритмы поиска.

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

Что касается «отсутствия» в отношении того, как все работает; (по крайней мере, на C ++), так как это работает в основном из стандартной среды библиотеки TEMPLATE.

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

Это огромная тема и один из краеугольных принципов дизайна шаблонов.

770
задан Martin 3 September 2015 в 19:11
поделиться

8 ответов

git pull будет делать две вещи: он делает git fetch, а затем git merge, где он объединяет ветви, которые были настроены для объединения в вашу конфигурацию.

Итак, что вы хотите do - отменить слияние (отмена выборки не имеет большого смысла и не должна быть необходимой).

Для этого вы можете попробовать использовать git reset --hard для возврата в предыдущее состояние. Используйте команду git-reflog , чтобы найти SHA-1 предыдущего состояния, а затем сбросить его.

Предупреждение: git reset --hard удаляет все незафиксированные изменения.

1029
ответ дан Bee 22 August 2018 в 19:01
поделиться
  • 1
    Отличный способ выбрать предыдущее состояние вместо использования git-reflog и хэшей копирования - использовать ярлык, подобный master@{1}, который является предыдущей позицией master, master@{"5 minutes ago"} или master@{14:30}. Полную информацию об указании ревизий таким образом можно найти в man git-rev-parse в разделе под названием «указание ревизий». – Cascabel 3 August 2009 в 18:16
  • 2
    В этом случае ORIG_HEAD также должен работать («git reset --hard ORIG_HEAD») – Jakub Narębski 3 August 2009 в 18:27
  • 3
    Вы должны обязательно упомянуть о том, что это должно не выполняться , если у вас есть незафиксированные изменения! – rid 10 January 2013 в 02:21
  • 4
    Работало отлично: git reset --hard master@{"10 minutes ago"} – Xeoncross 29 July 2013 в 22:26
  • 5
    Спасибо большое. Ты просто спас мне жизнь – MenschMarcus 23 April 2016 в 01:03

он работает в первую очередь: git reflog

находит ваше SHADE вашего предыдущего состояния и делает (пример HEAD @ {1})

git reset --hard HEAD@{1}
35
ответ дан Ezequiel García 22 August 2018 в 19:01
поделиться

То же, что и ответ jkp, но вот полная команда:

git reset --hard a0d3fe6

, где a0d3fe6 найден, выполнив

git reflog

и глядя на точку, в которой вы хотите отменить.

231
ответ дан Jeffrey Sun 22 August 2018 в 19:01
поделиться
  • 1
    Почему я не могу просто сделать git reset HEAD --hard, например? – Sung Won Cho 7 March 2015 в 06:16
  • 2
    @MikeC Этот подход позволяет вам возвращать несколько выдержек, например – xji 11 April 2015 в 16:41
  • 3
    Я не смог использовать идентификаторы левой стороны, но git reset --hard HEAD@{n} работал – E. Sundin 27 October 2016 в 14:00
  • 4
    Вы должны были предложить отредактировать ответ jkp вместо того, чтобы почти повторить его здесь после стольких лет. – Abhishek Anand 21 December 2016 в 20:46
  • 5
    Если у меня это на git reflog: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} и bbbbbbb HEAD @ {2}. Если я git reset --hard bbbbbbb, я потеряю HEAD 0 и 1? – pmirnd 9 March 2017 в 19:42

Более современный способ отмены слияния:

git merge --abort

И немного более старый способ:

git reset --merge

Путь старой школы, описанный в предыдущих ответах (предупреждение : отменит все ваши локальные изменения):

git reset --hard

Но на самом деле стоит заметить, что git merge --abort эквивалентен git reset --merge, если присутствует MERGE_HEAD. Это можно прочитать в справке git для команды слияния.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

После неудачного слияния, когда нет MERGE_HEAD, сбойное слияние может быть отменено с помощью git reset --merge, но необязательно с git merge --abort, поэтому они не только старый и новый синтаксис для одного и того же. Вот почему я нахожу git reset --merge намного полезнее в повседневной работе.

75
ответ дан Martin 22 August 2018 в 19:01
поделиться
  • 1
    git merge --abort работает во время слияния, а не после завершения git pull. Поэтому этот ответ кажется несущественным для вопроса. – Abhishek Anand 21 December 2016 в 20:48

вы можете сделать git reset --hard ORIG_HEAD

, так как «pull» или «merge» установите ORIG_HEAD как текущее состояние перед выполнением этих действий.

8
ответ дан Orlando 22 August 2018 в 19:01
поделиться

Если у вас есть gitk (попробуйте запустить gitk -all из вашей командной строки git), это просто. Просто запустите его, выберите фиксацию, которую вы хотите откат (щелкните правой кнопкой мыши), и выберите «Сбросить главную ветвь досюда». Если у вас нет никаких изменений, выберите «жесткий» вариант.

35
ответ дан Samuel Carrijo 22 August 2018 в 19:01
поделиться
  • 1
    git-pull autocommits. – Don Branson 3 August 2009 в 18:01
  • 2
    Это стоит того, если вы этого не видели. Появляется сумасшедший графический интерфейс. – Evan Moran 16 December 2011 в 03:51

Предположим, что $COMMIT был последним идентификатором фиксации перед выполнением git pull.

.

Бонус:

Говоря о вытягивании, я бы хотел, чтобы вы отменили последнее нажатие

git reset --hard $COMMIT

.

git pull --rebase

Эта команда является самой полезной командой в моей жизни git, которая сэкономила много времени.

Прежде чем нажимать новую фиксацию на сервер, попробуйте эту команду, и она автоматически синхронизирует последние изменения сервера (с помощью слияния + слияние) и поместит вашу фиксацию вверху в журнал git.

Найти информацию по адресу: http://gitolite.com/git-pull--rebase

19
ответ дан Sazzad Hissain Khan 22 August 2018 в 19:01
поделиться
0
ответ дан Davide 5 November 2018 в 16:14
поделиться
Другие вопросы по тегам:

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