Как вернуться к последнему коммиту в истории после того, как я использовал git reset для перехода к более старому набору изменений?
Вопрос
Предположим, моя история пойдет именно так :
A - B - C - D (ведущий)
Если я это сделаю git reset B
, Я получу :
A - B (мастер)
Проблема в том, что, git log
теперь покажите мне только историю от A до B, и я больше не увижу C и D.
Как я могу вернуться в D ?
Решение
Вы должны быть в состоянии видеть D с git reflog
.
Видишь это статья , например.
Единственный раз, когда коммиты фактически удаляются, это если вы git gc --prune (так что будьте осторожны с этим!).
Если вы запустите git reflog прямо сейчас в репозитории, в котором работали, вы увидите множество изменений, которые выглядят примерно так:
c5c3a82... HEAD@{0}: pull origin featureB: Merge made by recursive.
49d0608... HEAD@{1}: reset --hard HEAD^: updating HEAD
3ed01b1... HEAD@{2}: pull origin featureA: Merge made by recursive.
49d0608... HEAD@{3}: pull origin bugfixJ: Merge made by recursive.
854d44e... HEAD@{4}: commit: Add more cowbell to foo.c
6dbc22d... HEAD@{5}: pull origin bugfixI: Merge made by recursive.
9bdb763... HEAD@{6}: commit: Remove weevils
8518f9d... HEAD@{7}: checkout: moving from wickedfeature to master
Эти строки можно разбить на 4 части:
- фиксирующий хэш,
- указатель фиксации,
- Экшен,
- и дополнительная информация.
Если бы мы хотели вернуть коммит, который был утерян при
HEAD@{1}
, мы могли бы простоgit reset --hard HEAD@{2}
.
Теперь наша текущая ветка (и рабочая копия) переведены в состояние репозитория до того, как мы выполнили сброс.Если бы мы просто хотели увидеть, что это за состояние, мы могли бы
git checkout -b temp HEAD@{2}
(илиgit checkout HEAD@{2}
если у вас есть git 1.5.0 и выше).
Другие советы
Это проблема, которую я сражался со временем и снова.Свойство SpecialPermissions
активности CreateTask
не обновляет разрешения на уже существующую задачу.
Теоретически, вы должны быть в состоянии настроить событие OnTaskChanged
для обнаружения переназначения и разрешения элемента задач на основе этого.У меня были результаты IFFY так хорошо.
Решение, которое я урегулировал на все мои рабочие процессы, заключался в том, чтобы реализовать приемник события ItemUpdated
в списке задач, которые использует рабочий процесс.В этом ресивере события всякий раз, когда товар обновляется, вы можете проверить, изменено ли «назначенные для», и повторно разрешено соответствующим образом.
Редактировать: вот Снайп кода, который я использую.В моем случае переназначения могут быть в группе или конкретном пользователе, поэтому я обрабатываю обе ситуации.
// Compare the new string value of the 'Assigned To' field on the task to the old value
// in the event afterproperties. If they differ, this task has been reassigned.
if (!GenericUtilities.StringValueFromField(listItem["Assigned To"]).Equals(properties.AfterProperties["AssignedTo"]))
{
// Break role inheritance if not already done
if (!listItem.HasUniqueRoleAssignments)
{
// Reset inheritance first, to wipe out any other permissions
listItem.ResetRoleInheritance();
listItem.BreakRoleInheritance(false);
}
// Determine if the assigned user is a group or user, and assign permissions as necessary
SPFieldUserValue field = new SPFieldUserValue(listItem.Web, GenericUtilities.StringValueFromField(listItem["Assigned To"]));
if (field.User != null)
{
SetItemLevelPermissions(listItem.Web, listItem, field.User);
}
else
{
SPGroup assignedGroup = listItem.Web.SiteGroups[field.LookupValue];
SetItemLevelPermissions(listItem.Web, listItem, assignedGroup);
}
}
.
Метод SetItemLevelPermissions
просто берет на себя генеракодицетагкод, который я пропускаю и предоставляю разрешения на задачу:
SPRoleDefinition roleDefinition = setSPWeb.RoleDefinitions["Contribute"];
SPRoleAssignment roleAssignment = new SPRoleAssignment(principal);
roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
setListItem.RoleAssignments.Add(roleAssignment);
.