Сообщение об ошибке уже подсказывало вам:
В удаленном режиме есть дополнительные изменения, и вам нужно перенести изменения в свой репозиторий, добавить свои изменения и нажать.
Чтобы проиллюстрировать проблему:
Это начинается с этого:
Remote:
[master]
/
A <- B <- C
Local:
[master]
/
A <- B <- C
Вы сделали некоторые изменения локально, а кто-то еще сделал некоторые изменения в удаленном
Remote:
[master]
/
A <- B <- C <- D <- E
Local:
[master]
/
A <- B <- C <- X
[ 1115] Представьте себе, если вы перенесете изменения в пульт, как будет выглядеть пульт? Git не угадал бы это для вас, так что вам нужно иметь дело с этим локально, сгладить все, а затем нажать:
Remote:
[master]
/
A <- B <- C <- D <- E
Local:
[origin/master]
/
A <- B <- C <- D <- E
^
\-- X
\
[master]
Затем либо слить или перебазировать его:
(В в случае слияния)
[origin/master] [master]
/ /
A <- B <- C <- D <- E <--------- Y
^ /
\-- X <-----------/
(в случае перебазировки)
[origin/master] [master]
/ /
A <- B <- C <- D <- E <--------- X'
В обоих случаях это позволит вам нажать, так как ваша локальная ветвь master является потомком master удаленного , для которого мастер пульта может перемотать вперед.
Если вместо этого вы используете push -f
, вы просто заставите пульт дистанционного управления принять [master]
, в указанном выше случае мастер пульта станет вашим X
коммитом, а коммиты D
и E
будут потерял. Обычно это то, что вам не нужно, особенно это основная ветвь.
Что-то вроде следующего, это будет использовать только первое попавшееся свойство, которое имеет атрибут, конечно, вы можете разместить его на нескольких...
public object GetIDForPassedInObject(T obj)
{
var prop = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance)
.FirstOrDefault(p => p.GetCustomAttributes(typeof(IdentifierAttribute), false).Count() ==1);
object ret = prop !=null ? prop.GetValue(obj, null) : null;
return ret;
}
public class TestClass<T>
{
public void GetIDForPassedInObject(T obj)
{
PropertyInfo[] properties =
obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
PropertyInfo IdProperty = (from PropertyInfo property in properties
where property.GetCustomAttributes(typeof(Identifier), true).Length > 0
select property).First();
if(null == IdProperty)
throw new ArgumentException("obj does not have Identifier.");
Object propValue = IdProperty.GetValue(entity, null)
}
}
Вот больше примера реального слова. Мы используем дополнительный метод и проверку, если свойство содержит FieldMetaDataAttribute (пользовательский атрибут в моей базе исходного кода) с допустимым Майором и MinorVersion. То, что является представляющим общий интерес, является частью, где мы используем тип родительского класса и GetProperties и получаем ProperyInfo и затем используем GetCustomAttribute для получения атрибута FieldMetaDataAttribute в этом особом случае. Используйте этот код для вдохновения, как сделать больше универсального способа получить пользовательский атрибут. Это может, конечно, полироваться для создания общего метода получить данный атрибут любого свойства экземпляра класса.
/// <summary>
/// Executes the action if not the field is deprecated
/// </summary>
/// <typeparam name="TProperty"></typeparam>
/// <typeparam name="TForm"></typeparam>
/// <param name="form"></param>
/// <param name="memberExpression"></param>
/// <param name="actionToPerform"></param>
/// <returns>True if the action was performed</returns>
public static bool ExecuteActionIfNotDeprecated<TForm, TProperty>(this TForm form, Expression<Func<TForm, TProperty>> memberExpression, Action actionToPerform)
{
var memberExpressionConverted = memberExpression.Body as MemberExpression;
if (memberExpressionConverted == null)
return false;
string memberName = memberExpressionConverted.Member.Name;
PropertyInfo matchingProperty = typeof(TForm).GetProperties(BindingFlags.Public | BindingFlags.Instance)
.FirstOrDefault(p => p.Name == memberName);
if (matchingProperty == null)
return false; //should not occur
var fieldMeta = matchingProperty.GetCustomAttribute(typeof(FieldMetadataAttribute), true) as FieldMetadataAttribute;
if (fieldMeta == null)
{
actionToPerform();
return true;
}
var formConverted = form as FormDataContract;
if (formConverted == null)
return false;
if (fieldMeta.DeprecatedFromMajorVersion > 0 && formConverted.MajorVersion > fieldMeta.DeprecatedFromMajorVersion)
{
//major version of formConverted is deprecated for this field - do not execute action
return false;
}
if (fieldMeta.DeprecatedFromMinorVersion > 0 && fieldMeta.DeprecatedFromMajorVersion > 0
&& formConverted.MinorVersion >= fieldMeta.DeprecatedFromMinorVersion
&& formConverted.MajorVersion >= fieldMeta.DeprecatedFromMajorVersion)
return false; //the field is expired - do not invoke action
actionToPerform();
return true;
}