C # добавлена новая функция в Visual Studio 2010, называемая generate из использования. Цель состоит в том, чтобы сгенерировать стандартный код из шаблона использования. Одной из особенностей является создание конструктора, основанного на шаблоне инициализации.
Функция доступна через смарт-тег, который будет отображаться при обнаружении шаблона.
Например. Допустим, у меня есть следующий класс
class MyType {
}
И я пишу следующее в своем приложении
var v1 = new MyType(42);
Конструктор, принимающий int
, не существует, поэтому смарт-тег будет и одним из вариантов будет «Создать конструктор-заглушку». Выбор этого параметра изменит код для MyType
следующим образом.
class MyType {
private int p;
public MyType(int p) {
// TODO: Complete member initialization
this.p = p;
}
}
Июль 2012 обновления ( мерзавец 1.7.12 + )
теперь можно повторно основывать все фиксации, чтобы базироваться, и выбрать вторую фиксацию Y
, чтобы быть раздавленными с первым X
.
git rebase -i --root master
pick sha1 X
squash sha1 Y
pick sha1 Z
git rebase [-i] --root $tip
Эта команда может теперь использоваться для перезаписи всего продвижения истории от [1 111]"" вниз к корневой фиксации.
См. фиксация df5df20c1308f936ea542c86df1e9c6974168472 на GitHub от [1 125] Chris Webb (arachsys
) .
Исходный ответ (февраль 2009)
я полагаю, что Вы найдете различные рецепты для этого в ТАК вопрос" , Как я комбинирую первые две фиксации репозитория мерзавца? "
Charles Bailey обеспеченный там большинство подробный ответ , напоминая нам, что фиксация является полным деревом (не только diffs от предыдущие состояния).
И здесь старая фиксация ("начальная фиксация") и новая фиксация (результат сплющивания) не будет иметь никакого общего предка.
, Которые означают, Вы не можете" commit --amend
" начальная фиксация в новую, и затем повторно основывать на новую фиксацию начальной буквы историю предыдущей начальной фиксации (много конфликтов)
(Что последнее предложение больше не верно с [1 114])
Скорее (с [1 115] исходная "начальная фиксация", и B
, последующая фиксация должна была быть раздавлена в начальную):
Возвращаются к последней фиксации, что мы хотим сформировать начальную фиксацию (ГОЛОВА отсоединения):
git checkout <sha1_for_B>
Сброс указатель ответвления на начальную фиксацию, но отъезд индекса и рабочего неповрежденного дерева:
git reset --soft <sha1_for_A>
Исправление начальное дерево с помощью дерева от 'B':
git commit --amend
Временно тег эта новая начальная фиксация (или Вы могли помнить новую фиксацию sha1 вручную):
git tag tmp
Возвращаются к исходному ответвлению (примите ведущее устройство для этого примера):
git checkout master
Воспроизведение все фиксации после B на новую начальную фиксацию:
git rebase --onto tmp <sha1_for_B>
Удаляют временный тег:
git tag -d tmp
, Что путь," rebase --onto
" не представляет конфликты во время слияния, так как это повторно основывает историю сделанный после последняя фиксация (B
), чтобы быть раздавленным в начальную (который был A
) к [1 120] (представление раздавленной новой начальной фиксации): тривиальная ускоренная перемотка вперед объединяется только.
, Что работы для" A-B
", но также и" A-...-...-...-B
" (любое количество фиксаций может быть раздавлено в начальную этот путь)
Сплющивание первой и второй фиксации привело бы к первой переписываемой фиксации. Если у Вас есть больше чем одно ответвление, которое базируется от первой фиксации, Вы отключили то ответвление.
Рассматривают следующий пример:
a---b---HEAD
\
\
'---d
Сплющивание a и b в новую фиксацию "ab" привело бы к двум отличным деревьям, который в большинстве случаев не желателен с тех пор слияние мерзавца и , переоснова мерзавца больше не будет работать через два ответвления.
ab---HEAD
a---d
, Если Вы действительно хотите это, это может быть сделано. Взгляните на ответвление фильтра мерзавца для мощного (и опасный) инструмент для перезаписи истории.
Я переработал скрипт VonC, чтобы он делал все автоматически и ни о чем не просил. Вы даете ему два коммита SHA1, и он сжимает все между ними в один коммит с именем «сжатая история»:
#!/bin/sh
# Go back to the last commit that we want
# to form the initial commit (detach HEAD)
git checkout $2
# reset the branch pointer to the initial commit (= $1),
# but leaving the index and working tree intact.
git reset --soft $1
# amend the initial tree using the tree from $2
git commit --amend -m "squashed history"
# remember the new commit sha1
TARGET=`git rev-list HEAD --max-count=1`
# go back to the original branch (assume master for this example)
git checkout master
# Replay all the commits after $2 onto the new initial commit
git rebase --onto $TARGET $2