2016-11-07 10 views
1

Глядя на сквош, фиксируется, так что у публично стоящего проекта нет бессмысленных сообщений о фиксации, таких как «temp» или «temp123», ,Использование git reset --soft, маркировка фиксации, чтобы вы могли сквозировать * вниз * к ней позже

Я ищу способ использования git reset --soft HEAD~5, но вместо случайного выбора номера 5 я хочу вернуться через журналы Git и найти все коммиты, которые не соответствуют шаблону, и как только я нажму узор прекращаю. Так скажем, мои git log совершающие сообщения выглядеть следующим образом:

temp123 
fooGit 
temp 
fml 
temp24 
tmp69 
tttoday 
publish/release:xyz 

, так что я бы давят верхние 7 самых последних фиксаций, но оставить все «ниже» publish/release:xyz.

По довольно сложным причинам git merge --squash, выпущенный из публичной ветки, не будет работать для меня, потому что я в конечном итоге удаляю или переименовываю файлы совсем немного в проекте на частной ветке, и поэтому существует слишком много конфликтов слияния , Мне кажется, попробовав несколько способов, что лучше всего нажать на публичную ветку с -f и не беспокоиться о конфликтах таким образом.

Я думаю, что лучший подход в моем случае это сквош совершает так:

# on private "dev" branch 
# make a bunch of changes, rename files, yadda yadda 
git add . && git add -A && git commit -am "temp" && 
git checkout -b squash_branch # we do squashing on this branch to be safer 
git reset --soft head~15 # apparently this undoes commits for the last 15 commits 
git commit -am "A serious commit message" 
git push -u public master -f # overwrite public master 

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

Однако проблема, которую я пытаюсь решить, связана с номером 15 выше. Я просто догадываюсь о том, сколько коммитов «сквош». Я бы предпочел узнать точное число, чтобы сквош.

Возможно, я могу выполнить сквош всех коммитов, у которых нет сообщения Git commit, которое соответствует определенному шаблону? Поэтому, когда я запускаю сквош, я создаю сообщение фиксации с определенным шаблоном, скажем, это «XYZ». Могу ли я запустить git reset --soft HEAD~(some git commit pattern matching to find the count)?

Также еще один вопрос. Сделав сквош (git reset --soft) на squash_branch, должен ли я объединить эту ветку обратно в приватную ветку dev?

+0

Филиал DEV не отслеживает общественный/мастера, Дев филиал отслеживает частный/Dev –

ответ

2

Вы могли найти количество, но это немного опасно, так как это будет неправильный номер если есть слияние совершает присутствует в цепи (здесь не показан):

git rev-list --count HEAD^{/publish/release:xyz}..HEAD 

Обозначение rev^{/text} означает «начиная с заданного rev, поиск каждого сообщения фиксации (a la git log --grep) для данного текст». Таким образом, первое выражение соответствует фиксации с publish/release:xyz в сообщении о фиксации. Синтаксис .. использует этот код фиксации для , удаляя, который фиксирует и ранее совершает из набора коммитов, выбранных по имени HEAD. Затем --count дает нам количество оставшихся коммитов. Поэтому, если ваш график выглядит следующим образом:

...--o--*--o--o--o--o <-- HEAD 

где * является совершение с текста в нем, отбрасывается совершить *, а другой дальше налево совершает, оставляя четыре окончательное o фиксации узлов, к которым HEAD точки. Затем --count подсчитывает эти четыре фиксации и отпечатки 4.

В целом, это плохая стратегия. Гораздо лучше начать с отметки точки с помощью ветки или имени тега. Имя ветки или тега идентифицирует фиксацию на , указывая на нее.Вместо того, чтобы пытаться найти совершить * по шаблону, просто отметьте, когда вы сделаете это:

git tag xyz 

Теперь у вас есть это:

 tag:xyz 
     | 
     v 
...--o--*--o--o--o <-- HEAD -> dev 

и xyz..HEAD получает вам правильный набор коммитов, и вы можете git reset --soft xyz сделать ветвь метки dev точку назад к совершению *:

 tag:xyz 
     | 
     v 
...--o--* <-- HEAD -> dev 
     \ 
      o--o--o [only findable via reflogs] 

После того, как вы закончите с этим просто удалите тег.

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


Note, кстати, что вы можете используйте поиск не ция при создании тега:

git tag xyz HEAD^{/publish/release:xyz} 

То есть, определить , которые совершают помечать при создании имени тега. (То же самое верно и для названий ветвей.) Затем вы можете увидеть этот тег с помощью git log --decorate, а графические средства просмотра, такие как gitk, обычно показывают, какие коммиты имеют те же теги.

(Поиск и пометка является хорошим способом для перехода к этому лучше, по крайней мере, в теории, по привычке.)

+0

Это немного над моей головой - в основном вы говорите, что используете тег вместо подсчета журналов сообщений фиксации? –

+0

Вы правы, что не все разработки произойдут на dev ... в будущем появятся ветки функций, которые будут объединены в dev, хотя прямо сейчас я делаю всю разработку непосредственно на ветке dev –

+1

@AlexanderMills: «В основном вы говорите использовать тег вместо подсчета журналов сообщений фиксации? " Да, это намного проще и хорошо проявляется в выходе git log -graph -decorate -oneline (или других графических зрителей). – torek

1

Я предполагаю, что ваш dev филиал отслеживает master, прежде чем вы начнете свою работу. Если нет, создайте новую ветку, прежде чем делать какие-либо временные коммиты.

Чтобы определить точку, которую вы ответвляетесь от master (и, таким образом, точки, чтобы сбросить обратно), сделайте следующее:

git merge-base master HEAD 

Вы можете показать все фиксации между этой точкой и HEAD (это должно включать в себя все ваши временном совершает, и только те коммиты) с:

git log --oneline $(git merge-base master HEAD)..HEAD 

вы можете трубы вывода этой команды, чтобы wc -l и получить число фиксаций, которое является числом, что нужно для вашей команды git reset ,

В качестве альтернативы, вы можете получить этот номер непосредственно с:

git rev-list --count $(git merge-base master HEAD)..HEAD 

Собираем все вместе:

git reset --soft HEAD~$(git log --oneline $(git merge-base master HEAD)..HEAD | wc -l) 

Или:

git reset --soft HEAD~$(git rev-list --count $(git merge-base master HEAD)..HEAD) 

После выполнения сброса, а не слияния squash_branch в dev, может быть, лучше сделать жесткий сброс вместо (кормовой эр вы убедились, что ничего не сломано, конечно):

git checkout dev 
git reset --hard squash_branch 

Кроме того, слияние конфликтов, как правило, происходят по причине, так что я бы с осторожностью о слепо принудительном толкании на пульт дистанционного управления. Если необходимо сила-толчок, то сделать это вместо того, чтобы:

git push origin master --force-with-lease 

Флаг --force-with-lease заставит Git перезаписывать любые коммиты, которые вы уже неправдоподобным, но команда будет выполнена, если пульт имеет новые коммиты, которые вы не знаю.

+0

Спасибо это выглядит хорошо, так что вы говорите, что я должен объединить ветвь сквоша обратно в dev..также я добавил комментарий к исходному вопросу, чтобы уточнить, и что вы думаете о toreks? –

+0

@AlexanderMills Если у вас нет каких-либо изменений в 'dev' (что вам не понравится, если вы это сделаете сразу), не нужно будет сливаться, если вам не нужна история" temp123 ". Если у вас есть дополнительные вопросы о вашем рабочем процессе, не стесняйтесь [задавать новый вопрос] (// stackoverflow.com/questions/ask) об этом. Ответ torek тоже выглядит хорошо (я его поддержал); предложение тега было идеей, которую я также имел, поэтому я бы пошел с этим, если ваш ветвящийся рабочий процесс мешает вам использовать мое решение. –

+0

Да, я думаю, что в конечном счете, у вас появятся ветви, поэтому да, возможно, хорошо попробовать подход к тегам –