Как уже указывал Саджиб Хан, вы хотите
git reset --hard HEAD~1
, а не
blockquote>git reset --hard HEAD@{1}
.Здесь есть некоторая полезная информация , которая объясняет разницу. * Короче говоря,
HEAD
в вашем случае никогда не указывал ни на что, кроме(HEAD, origin/feature/RXM-73-create-aws-rollback-script, feature/RXM-73-create-aws-rollback-script)
, а обозначение@
относится к тому, где головка была *.Вы можете изучить список возможных
@{#}
значений, посмотрев на, чтобы убедиться, что
HEAD
не указывал в другом месте. ,
Анонимный метод сохраняет ссылку на переменную в блоке включения - не фактическое значение переменной.
К тому времени, когда методы на самом деле выполняются (при запуске потоков), f
был присвоен для указания на последнее значение в наборе, таким образом, все 3 печати потоков то последнее значение.
Вот некоторые хорошие статьи об анонимных методах в C# и коде, который будет сгенерирован компилятором:
http://blogs.msdn.com/oldnewthing/archive/2006/08/02/686456.aspx
http://blogs.msdn.com/oldnewthing/archive/2006/08/03/687529.aspx
http://blogs.msdn.com/oldnewthing/archive/2006/08/04/688527.aspx
Я думаю, сделали ли Вы:
foreach (FileInfo f in files) { FileInfo f2 = f; //variable declared inside the loop Thread t = new Thread(delegate() { Console.WriteLine(f2.FullName); }); threads.Add(t); }
это было бы работать способ, к которому Вы хотели это.
Это потому что f.FullName
ссылка на переменную и не значение (который является, как Вы пытались использовать его). К тому времени, когда Вы на самом деле запускаете потоки f. FullName был увеличен полностью в конец массива.
Так или иначе, почему выполняют итерации через вещи здесь дважды?
foreach (FileInfo f in files)
{
Thread t = new Thread(delegate()
{
Console.WriteLine(f.FullName);
});
threads.Add(t);
t.Start();
}
Однако это все еще неправильно, и возможно еще хуже, так как у Вас теперь есть состояние состязания для наблюдения, какой поток идет быстрее: запись консольного объекта или итерация к следующему FileInfo.
Это - потому что базовый код для итератора (foreach) уже 'выполнил итерации' через все значения в Списке, прежде чем потоки запустятся... Таким образом, когда они запускают, значение, на которое 'указывает' на итератор, является последним в списке...
Запустите поток в повторении вместо этого....
foreach (FileInfo f in files)
{
string filName = f.FullName;
Thread t = new Thread(delegate()
{ Console.WriteLine(filName); });
t.Start();
}
Я не полагаю, что гонка возможна здесь, так как нет никакой общей памяти, доступной от всех потоков.
Следующее работало бы также.
Thread t = new Thread(delegate()
{
string name = f.Name;
Console.WriteLine(name);
});