Сквош первых двух коммитов в Git? [Дубликат]

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;
    }
}
507
задан Community 23 May 2017 в 12:26
поделиться

3 ответа

Июль 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, последующая фиксация должна была быть раздавлена в начальную):

  1. Возвращаются к последней фиксации, что мы хотим сформировать начальную фиксацию (ГОЛОВА отсоединения):

    git checkout <sha1_for_B>
    
  2. Сброс указатель ответвления на начальную фиксацию, но отъезд индекса и рабочего неповрежденного дерева:

    git reset --soft <sha1_for_A>
    
  3. Исправление начальное дерево с помощью дерева от 'B':

    git commit --amend
    
  4. Временно тег эта новая начальная фиксация (или Вы могли помнить новую фиксацию sha1 вручную):

    git tag tmp
    
  5. Возвращаются к исходному ответвлению (примите ведущее устройство для этого примера):

    git checkout master
    
  6. Воспроизведение все фиксации после B на новую начальную фиксацию:

    git rebase --onto tmp <sha1_for_B>
    
  7. Удаляют временный тег:

    git tag -d tmp
    

, Что путь," rebase --onto" не представляет конфликты во время слияния, так как это повторно основывает историю сделанный после последняя фиксация (B), чтобы быть раздавленным в начальную (который был A) к [1 120] (представление раздавленной новой начальной фиксации): тривиальная ускоренная перемотка вперед объединяется только.

, Что работы для" A-B", но также и" A-...-...-...-B" (любое количество фиксаций может быть раздавлено в начальную этот путь)

691
ответ дан Community 23 May 2017 в 22:26
поделиться

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

Рассматривают следующий пример:

a---b---HEAD
 \
  \
   '---d

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

ab---HEAD

a---d

, Если Вы действительно хотите это, это может быть сделано. Взгляните на ответвление фильтра мерзавца для мощного (и опасный) инструмент для перезаписи истории.

3
ответ дан hillu 23 May 2017 в 22:26
поделиться

Я переработал скрипт 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
30
ответ дан 22 November 2019 в 22:27
поделиться
Другие вопросы по тегам:

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