2015-07-13 4 views
6

Когда я расследую ошибку, я когда-то не работал тщательно, особенно когда я копаю несколько ветвей с множеством коммитов.Как устранить нежелательные коммиты в репозитории Git?

Надеюсь, как только я покончу с этим, я объединю рабочий результат с моей главной веткой с помощью git merge yeah_i_got_it. Вот что мое хранилище может выглядеть в таких ситуациях:

v There is a bug here 
A---B---C----------------------------------------------F (master) 
    \            /
     o---o---o--o--o (bug)      /
       \         /
       o---o--o--o (oups_this_way_better)/
        \  v Clean a bit  /
         o---D---E------------------o (yeah_i_got_it)  
         ^  
          Solved the bug here 

В конце концов, я ожидаю, чтобы сохранить только некоторые соответствующие коммиты в конце дня:

A--B--C--D--F (master) 

Что касается остального, это просто мусор и мне это не нужно. Итак, каков наилучший способ справиться с этим неприятным рабочим процессом?

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

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

Так что мой вопрос:

Как правильно устранить временные фиксаций и ветви из моих Git репозиториев окончательно?

Вот некоторые случайные мысли:

  • Мой рабочий является просто плохо, я никогда не должен работать, как это.
  • Просто добавьте префикс к каждому временному комментированию, например, «мусор» или «мусор».
  • решение родной Git А может существовать, что может помочь мне сделать эту работу как git rebase-and-clean yeah_i_got_it --keep D
+3

вы можете раздавить все ваш «мусор» совершает в один коммят. Потенциально лучше, вы можете выбрать вишневый коммиты, которые вы хотите. –

+0

»... Я когда-то не работая тщательно ... »Исправьте это, и большинство связанных проблем исчезнут ... – twalberg

ответ

2

Способ сделать то, что вы просите, это проверить мастер на C, а затем сделать git merge --squash yeah_i_got_it. Это приведет к краху всей ветви в одну фиксацию.

Другим способом было бы переустановить интерактивные коммиты, с git rebase -i master от вашего yeah_i_got_it ветви. В интерактивной перестановке вы можете отметить E как «исправление». Если сообщение о фиксации началось с «fixup!» и у вас были соответствующие параметры конфигурации git, тогда маркировка будет выполнена автоматически.

Примечание: вы говорите, что хотите A-B-C-D-F, но я думаю, что вы на самом деле просто хотите A-B-C-D. Не требуется фиксация «F».

0

The repo's current situation (full of garbage commits)

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

git rebase -i <your first garbage commit id>

During a rebase operation Заполните перебазироваться, решить, если есть слияние вопросов.

+0

Можете ли вы рассказать о своем решении относительно того, как вы это сделаете? – doelleri

1

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

git reset $(git merge-base --fork-point master) 

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

Изменение может быть добавлено на основе строки за строкой, при желании с помощью

git add -p 

По завершению перебазирования на мастер (если мастер перемещен), а затем объединить, (Я предпочитаю не-быстро- вперед сливается, чтобы показать, как на самом деле мастер изменился.

git rebase master 
git checkout master 
git merge --no-ff @{-1} 
+0

Yay для сброса и добавления! – jthill

Смежные вопросы