1) Определите короткую хэш-запись фиксации
# git log --pretty=oneline --abbrev-commit
abcd1234 Update to Fix for issue B
cdababcd Fix issue B
deab3412 Fix issue A
....
2) Если вы хотите скворовать (объединить) последние две фиксации
# git rebase -i deab3412
3) Это открывает кнопку nano
для слияния. И это выглядит ниже
....
pick cdababcd Fix issue B
pick abcd1234 Update to Fix for issue B
....
4) Переименуйте слово pick
в squash
, которое присутствует перед abcd1234
. После переименования он должен выглядеть следующим образом.
....
pick cdababcd Fix issue B
squash abcd1234 Update to Fix for issue B
....
5) Теперь сохраните и закройте редактор nano
. Нажмите ctrl + o
и нажмите Enter
для сохранения. И затем нажмите ctrl + x
, чтобы выйти из редактора.
6) Затем редактор nano
снова открывается для обновления комментариев, при необходимости обновляет его.
7) Теперь его сжатие успешно, вы можете проверить его, проверив журналы.
# git log --pretty=oneline --abbrev-commit
1122abcd Fix issue B
deab3412 Fix issue A
....
8) Теперь нажмите на репо. Примечание, чтобы добавить знак +
перед именем ветки.
# git push origin +master
Примечание. Это основано на использовании git на оболочке ubuntu
. Если вы используете разные os (Windows
или Mac
), то выше команды такие же, кроме редактора. Вы можете получить другой редактор.
Я предлагаю другой выбор:
Dictionary<Tuple<string, string, string>, string> pt;
Доступ к словарю:
pt[Tuple.Create("id","group","part")]
UPDATE:
blockquote>Значения Tuples , введенные в C # 7, наиболее привлекательны:
Dictionary<(string id, string group, string part), string> pt;
Доступ к словарю:
pt[("id", "group", "part")]
Я хотел бы предложить альтернативный подход, используя SortedDictionary и пользовательский сопоставитель:
public class PrerenderedTemplate
{
public string instanceID;
public string templategroup;
public string templatepart;
public PrerenderedTemplate(string id, string tempGroup, string tempPart)
{
instanceID = id;
templategroup = tempGroup;
templatepart = tempPart;
}
// custom comparer instance used as argument
// to SortedDictionary constructor
public class Comparer : IComparer<PrerenderedTemplate>
{
public int Compare(PrerenderedTemplate x, PrerenderedTemplate y)
{
int compare = 0;
if (compare == 0) compare = x.instanceID.CompareTo(y.instanceID);
if (compare == 0) compare = x.templategroup.CompareTo(y.templategroup);
if (compare == 0) compare = x.templatepart.CompareTo(y.templatepart);
return compare;
}
}
}
Используется так:
var dictionary = new SortedDictionary<PrerenderedTemplate, string>(new PrerenderedTemplate.Comparer());
dictionary.Add(new PrerenderedTemplate("1", "2", "3"), "123");
dictionary.Add(new PrerenderedTemplate("4", "5", "6"), "456");
dictionary.Add(new PrerenderedTemplate("7", "8", "9"), "789");
Assert.AreEqual<string>(dictionary[new PrerenderedTemplate("7", "8", "9")], "789");
Ответ RezaArab подходит для но лично мне не нравятся кортежи на основе их неоднозначных свойств и подробного синтаксиса.
Пользовательский класс с компаратором предлагает большую ясность и гибкость при любых изменениях требований.
Я бы создал пользовательский словарь. Что-то вроде этого
public class TrippleKeyDict
{
private const string Separator = "<|>";
private Dictionary<string, string> _dict = new Dictionary<string, string>();
public string this[string key1, string key2, string key3]
{
get { return _dict[GetKey(key1, key2, key3)]; }
set { _dict[GetKey(key1, key2, key3)] = value; }
}
public void Add(string key1, string key2, string key3, string value)
{
_dict.Add(GetKey(key1, key2, key3), value);
}
public bool TryGetValue(string key1, string key2, string key3, out string result)
{
return _dict.TryGetValue(GetKey(key1, key2, key3), out result);
}
private static string GetKey(string key1, string key2, string key3)
{
return String.Concat(key1, Separator, key2, Separator, key3);
}
}
Если вы считаете, что конкатенация строк недостаточно безопасна, поскольку ключи могут содержать разделители, тогда используйте свой собственный тип ключа или ключ Touple<string,string,string>
. Поскольку эта деталь реализации скрыта внутри вашего пользовательского словаря, вы можете изменить ее в любое время.
Вы можете использовать словарь, подобный этому
var dict = new TrippleKeyDict();
// Using the Add method
dict.Add(instanceID, templategroup, templatepart, "some value");
// Using the indexer
dict[instanceID, templategroup, templatepart] = "xy";
string result = dict[instanceID, templategroup, templatepart];
// Using the TryGetValue method
if (dict.TryGetValue(instanceID, templategroup, templatepart, out result)) {
// Do something with result
}