Как вы исправляете плохое слияние и воспроизводите свои хорошие коммиты на фиксированное слияние?

Для синхронизации потоков рекомендуется использовать один из классов EventWaitHandle, например ManualResetEvent. Хотя немного проще использовать простой логический флаг, как вы здесь (и да, вы хотели бы отметить его как volatile), IMO лучше освоиться с использованием инструментов потоковой обработки. Для ваших целей вы бы сделали что-то вроде этого ...

private System.Threading.ManualResetEvent threadStop;

void StartThread()
{
    // do your setup

    // instantiate it unset
    threadStop = new System.Threading.ManualResetEvent(false); 

    // start the thread
}

В вашей теме ..

while(!threadStop.WaitOne(0) && !operationComplete)
{
    // work
}

Затем в GUI для отмены ...

threadStop.Set();
395
задан Trevor Boyd Smith 21 June 2018 в 18:57
поделиться

5 ответов

не используйте этот рецепт, если Ваша ситуация не является той, описанной в вопросе. Этот рецепт для фиксации плохого слияния и воспроизведения Ваших хороших фиксаций на фиксированное слияние.

, Хотя filter-branch сделает то, что Вы хотите, это - вполне сложная команда, и я, вероятно, принял бы решение сделать это с git rebase. Это - вероятно, персональное предпочтение. filter-branch может сделать это в единственной, немного более сложной команде, тогда как rebase решение выполняет эквивалентные логические операции один шаг за один раз.

Попытка следующий рецепт:

# create and check out a temporary branch at the location of the bad merge
git checkout -b tmpfix <sha1-of-merge>

# remove the incorrectly added file
git rm somefile.orig

# commit the amended merge
git commit --amend

# go back to the master branch
git checkout master

# replant the master branch onto the corrected merge
git rebase tmpfix

# delete the temporary branch
git branch -d tmpfix

(Отмечают, что Вам на самом деле не нужно временное ответвление, можно сделать это с 'отдельной ГОЛОВОЙ', но необходимо обратить внимание на идентификатор фиксации, сгенерированный эти git commit --amend шаг для предоставления к эти git rebase команда вместо того, чтобы использовать временное имя ответвления.)

293
ответ дан CB Bailey 21 June 2018 в 18:57
поделиться

Это - то, для чего git filter-branch был разработан.

0
ответ дан CesarB 21 June 2018 в 18:57
поделиться

Если Вы ничего не фиксировали с тех пор, всего git rm файл и git commit --amend.

, Если Вы имеете

git filter-branch \
--index-filter 'git rm --cached --ignore-unmatch path/to/file/filename.orig' merge-point..HEAD

, пройдет каждое изменение от merge-point до HEAD, удалит filename.orig и перепишет изменение. Используя --ignore-unmatch означает, что команда не перестанет работать, если по некоторым причинам filename.orig будет отсутствовать в изменении. Это - рекомендуемый путь от раздела Examples в страница справочника .

ответвления фильтра мерзавца Примечание для пользователей Windows: путь к файлу должен наклонные черты вправо использования

118
ответ дан Zain Rizvi 22 June 2018 в 04:57
поделиться

Вы также можете использовать:

git reset HEAD файл / путь

-1
ответ дан 22 November 2019 в 23:40
поделиться

Это лучший способ:
http://github.com/guides/completely-remove-a-file-from-all-revisions

Просто не забудьте сначала сделать резервную копию файлов.

EDIT

Правка Neon была, к сожалению, отклонена во время просмотра.
См. ниже сообщение Neons, оно может содержать полезную информацию!


Например, удалить все *.gz файлы, случайно попавшие в git-репозиторий:

$ du -sh .git ==> e.g. 100M
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch *.gz' HEAD
$ git push origin master --force
$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now
$ git gc --aggressive --prune=now

Это всё равно не сработало? (В настоящее время я нахожусь на git-версии 1.7.6.1)

$ du -sh .git ==> e.g. 100M

Не знаю почему, так как у меня была только ОДНА мастер-ветка. В любом случае, в конце концов, я действительно очистил git-репозиторий, переместив его в новый пустой и пустой git-репозиторий, например,

$ git init --bare /path/to/newcleanrepo.git
$ git push /path/to/newcleanrepo.git master
$ du -sh /path/to/newcleanrepo.git ==> e.g. 5M 

(да!)

Затем я клонировал его в новый каталог и переместил его в этот каталог через .git-папку. например,

$ mv .git ../large_dot_git
$ git clone /path/to/newcleanrepo.git ../tmpdir
$ mv ../tmpdir/.git .
$ du -sh .git ==> e.g. 5M 

(да! наконец-то очистили!)

После проверки, что всё в порядке, можно удалить каталоги .../large_dot_git и .../tmpdir (может быть, через пару недель или месяцев, на всякий случай...)

.
48
ответ дан 22 November 2019 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: