Объяснение C ++.
Подумайте о интерфейсе как об общедоступных методах классов.
Затем вы могли бы создать шаблон, который «зависит» от этих общедоступных методов, чтобы выполнить его (он выполняет вызовы функций, определенные в открытом интерфейсе классов). Предположим, что этот шаблон является контейнером, таким как векторный класс, и интерфейс, от которого он зависит, является алгоритмом поиска.
Любой класс алгоритмов, который определяет функции / интерфейс Vector, вызывает вызовы, которые удовлетворяют «контракту», (как объяснил кто-то в первоначальном ответе). Алгоритмы даже не должны быть одного базового класса; единственное требование состоит в том, что функции / методы, которые вектор зависит от (интерфейса), определены в вашем алгоритме.
Точка всего этого заключается в том, что вы могли бы предоставить любой другой алгоритм поиска / класс так же долго поскольку он предоставил интерфейс, от которого зависит вектор (поиск пузырьков, последовательный поиск, быстрый поиск).
Возможно, вам также захочется спроектировать другие контейнеры (списки, очереди), которые будут использовать тот же алгоритм поиска, что и Vector by если они выполняют интерфейс / контракт, на которые зависят ваши алгоритмы поиска.
Это экономит время (повторное использование кода ООП), так как вы можете написать алгоритм один раз, а не снова и снова, каждый новый объект, который вы создаете, без чрезмерного усложнения проблемы с заросшим деревом наследования.
Что касается «отсутствия» в отношении того, как все работает; (по крайней мере, на C ++), так как это работает в основном из стандартной среды библиотеки TEMPLATE.
Конечно, при использовании наследования и абстрактных классов изменяется методология программирования для интерфейса; но принцип тот же, ваши общедоступные функции / методы - это ваш интерфейс классов.
Это огромная тема и один из краеугольных принципов дизайна шаблонов.
git pull
будет делать две вещи: он делает git fetch
, а затем git merge
, где он объединяет ветви, которые были настроены для объединения в вашу конфигурацию.
Итак, что вы хотите do - отменить слияние (отмена выборки не имеет большого смысла и не должна быть необходимой).
Для этого вы можете попробовать использовать git reset --hard
для возврата в предыдущее состояние. Используйте команду git-reflog , чтобы найти SHA-1 предыдущего состояния, а затем сбросить его.
Предупреждение: git reset --hard
удаляет все незафиксированные изменения.
он работает в первую очередь: git reflog
находит ваше SHADE вашего предыдущего состояния и делает (пример HEAD @ {1})
git reset --hard HEAD@{1}
То же, что и ответ jkp, но вот полная команда:
git reset --hard a0d3fe6
, где a0d3fe6 найден, выполнив
git reflog
и глядя на точку, в которой вы хотите отменить.
git reset HEAD --hard
, например?
– Sung Won Cho
7 March 2015 в 06:16
git reset --hard HEAD@{n}
работал
– E. Sundin
27 October 2016 в 14:00
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
намного полезнее в повседневной работе.
git merge --abort
работает во время слияния, а не после завершения git pull
. Поэтому этот ответ кажется несущественным для вопроса.
– Abhishek Anand
21 December 2016 в 20:48
вы можете сделать git reset --hard ORIG_HEAD
, так как «pull» или «merge» установите ORIG_HEAD как текущее состояние перед выполнением этих действий.
Если у вас есть gitk (попробуйте запустить gitk -all из вашей командной строки git), это просто. Просто запустите его, выберите фиксацию, которую вы хотите откат (щелкните правой кнопкой мыши), и выберите «Сбросить главную ветвь досюда». Если у вас нет никаких изменений, выберите «жесткий» вариант.
Предположим, что $COMMIT
был последним идентификатором фиксации перед выполнением git pull
.
.
Говоря о вытягивании, я бы хотел, чтобы вы отменили последнее нажатие
git reset --hard $COMMIT
.
git pull --rebase
Эта команда является самой полезной командой в моей жизни git, которая сэкономила много времени.
Прежде чем нажимать новую фиксацию на сервер, попробуйте эту команду, и она автоматически синхронизирует последние изменения сервера (с помощью слияния + слияние) и поместит вашу фиксацию вверху в журнал git.
Найти информацию по адресу: http://gitolite.com/git-pull--rebase
master@{1}
, который является предыдущей позициейmaster
,master@{"5 minutes ago"}
илиmaster@{14:30}
. Полную информацию об указании ревизий таким образом можно найти вman git-rev-parse
в разделе под названием «указание ревизий». – Cascabel 3 August 2009 в 18:16git reset --hard master@{"10 minutes ago"}
– Xeoncross 29 July 2013 в 22:26