Если по какой-то причине вам не нравятся интерактивные редакторы, вы можете использовать git rebase --onto
.
Скажем, вы хотите изменить Commit1
. Во-первых, ответвьте от до Commit1
:
git checkout -b amending [commit before Commit1]
Во-вторых, возьмите Commit1
с cherry-pick
:
git cherry-pick Commit1
Теперь внесите изменения, Создание Commit1'
:
git add ...
git commit --amend -m "new message for Commit1"
И, наконец, после того, как спрятали любые другие изменения, перенесите оставшиеся коммиты до master
поверх вашего нового коммита:
git rebase --onto amending Commit1 master
Читать: «перебазировать на ветку amending
все коммиты между Commit1
(не включительно) и master
(включительно)». То есть, Commit2 и Commit3, полностью исключая старый Commit1. Вы можете просто выбрать их, но так проще.
Не забудьте почистить свои ветви!
git branch -d amending
ThreadPool.QueueUserWorkItem(o => FireAway());
(пять лет спустя .. .)
Task.Run(() => FireAway());
, как указано Луисперезфдом .
Чтобы добавить в ответ Уилла , если это консольное приложение,просто добавьте AutoResetEvent
и WaitHandle
, чтобы предотвратить его выход до завершения рабочего потока:
Using System;
Using System.Threading;
class Foo
{
static AutoResetEvent autoEvent = new AutoResetEvent(false);
static void Main()
{
ThreadPoolQueueUserWorkItem(new WaitCallback(FireAway), autoEvent);
autoEvent.WaitOne(); // Will wait for thread to complete
}
static void FireAway(object stateInfo)
{
System.Threading.Thread.Sleep(5000);
Console.WriteLine("5 seconds later");
((AutoResetEvent)stateInfo).Set();
}
}
Простой способ - создать и запустить поток с лямбда-выражением без параметров:
(new Thread(() => {
FireAway();
MessageBox.Show("FireAway Finished!");
}) {
Name = "Long Running Work Thread (FireAway Call)",
Priority = ThreadPriority.BelowNormal
}).Start();
Используя этот метод поверх ThreadPool.QueueUserWorkItem, вы можете присвоить новому потоку имя, чтобы упростить отладку. Кроме того, не забывайте использовать расширенную обработку ошибок в своей программе, потому что любые необработанные исключения вне отладчика внезапно приведут к сбою вашего приложения:
The simplest .NET 2.0 and later approach is using the Asynchnonous Programming Model (ie. BeginInvoke on a delegate):
static void Main(string[] args)
{
new MethodInvoker(FireAway).BeginInvoke(null, null);
Console.WriteLine("Main: " + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000);
}
private static void FireAway()
{
Thread.Sleep(2000);
Console.WriteLine("FireAway: " + Thread.CurrentThread.ManagedThreadId );
}
Призвание BeginInvoke и не поймание EndInvoke не является хорошим подходом. Ответ прост: Причина, по которой вы должны позвонить в ENDINVOOKE, заключается в том, что результаты вызова (даже если нет возврата), должен быть кэширован .NET, пока endInvoke не вызывается.Например, если вызываемый код бросает исключение, то исключение кэшируется в данных вызова. Пока вы не позвоните в EndInvoke, он остается в памяти. После того, как вы позвоните в ENDINVOOKE, память может быть выпущена. Для этого конкретного случая возможно, что память останется до тех пор, пока процесс не выключится, поскольку данные сохраняются внутри кода вызова. Я думаю, что GC может в конечном итоге сбрать его, но я не знаю, как GC будет знать, что вы отказались от данных по сравнению с тому, что вы просто долгое время забрали. Я сомневаюсь, что это делает. Следовательно, может возникнуть утечка памяти.
Больше можно найти на http://haacked.com/archive/2009/01/09/asynchronous-fire-ando-forget-with-lambdas.aspx