Dispatcher - это компонент WPF, а не компонент WinForms.
Если вы хотите отправлять рабочие элементы в поток пользовательского интерфейса, вам придется либо использовать Control.BeginInvoke, как вы уже нашли, или реагировать на ResetEvents / WaitObjects по потокам.
Обычно вызывать рабочие элементы в потоке пользовательского интерфейса - это плохо, если только это не произведение пользовательского интерфейса (то есть обновление содержимого элемента управления или что-то еще), и в этом случае Control .BeginInvoke () будет достаточным.
Если вы просто ищете простое решение для исправления предыдущих коммитов, прочитайте вопрос! Это все объясняет. Но так как Эльмарко просил скользкий путь, здесь мы идем:
Начиная с Git 1.7.0, есть опция --autosquash
для rebase
, которая делает то, что ты хочешь. Есть также опции --fixup
и --squash
для commit
, чтобы упростить задачу. С помощью псевдонимов вы, вероятно, сможете объединить все это в одну команду.
Я бы предложил перейти на новейший Git для максимальной крутости:
git/Documentation/RelNotes $ grep -i -A1 autosquash\\\|fixup *
1.7.0.txt: * "git rebase -i" learned new action "fixup" that squashes the change
1.7.0.txt- but does not affect existing log message.
--
1.7.0.txt: * "git rebase -i" also learned --autosquash option that is useful
1.7.0.txt: together with the new "fixup" action.
1.7.0.txt-
--
1.7.3.txt: * "git rebase -i" peeks into rebase.autosquash configuration and acts as
1.7.3.txt: if you gave --autosquash from the command line.
1.7.3.txt-
--
1.7.4.txt: * "git commit" learned --fixup and --squash options to help later invocation
1.7.4.txt- of the interactive rebase.
--
1.7.4.txt: * "git rebase --autosquash" can use SHA-1 object names to name which
1.7.4.txt: commit to fix up (e.g. "fixup! e83c5163").
1.7.4.txt-
Мой текущий рабочий процесс git настолько интенсивен --fixup
/ --squash
, что я написал новую команду git-fixup
, которая автоматически обрабатывает большинство раздражающих битов:
git fixup
показывает измененные файлы, сгруппированные в соответствии с последними коммитами, которые касаются тех же файлов git fixup -a
фиксируют все эти изменения при изменении --fixup
вместе с их соответствующими «родительскими» коммитами git fixup -r
выполняет автоматический git rebase --autosquash
для всех фиксаций фиксации. Многие изменения таковы, что для выполнения работы достаточно только трех приведенных выше команд, без копирования-вставки коммитов. идентификаторы или чтение через git log
, чтобы найти правильные --fixup
цели.
Источник: https://github.com/ohmu/git-crust
То, что вы делаете, опасно, если вы делитесь веткой, в которую вносите изменения, с другими людьми. В вашем случае вы переписываете коммит A и перебираете B и C поверх нового A, который является совершенно новым объектом. Любой, кто уже вытащил старый А в свои репозитории, может испортить свой репозиторий, так как история в вашем репозитории «волшебным образом» изменится. Их мерзавец не мог знать, что история была переписана.
Из-за этого факта разработчики Git намеренно не сделали это легким делом, так как вы должны знать о последствиях выполнения такой операции.
Я создал несколько псевдонимов , чтобы упростить использование команд git commit --fixup
и git commit --squash
, добавленных в git 1.7. Добавьте их к ~/.gitconfig
:
[alias]
fixup = !sh -c 'REV=$(git rev-parse $1) && git commit --fixup $@ && git rebase -i --autosquash $REV^' -
squash = !sh -c 'REV=$(git rev-parse $1) && git commit --squash $@ && git rebase -i --autosquash $REV^' -
Использование:
$ git commit -am 'bad commit'
$ git commit -am 'good commit'
$ git add . # Stage changes to correct the bad commit
$ git fixup HEAD^ # HEAD^ can be replaced by the SHA of the bad commit
Плохой коммит может быть несколько коммитов назад.