мерзавец: лучший путь к мерзавцу возвращается без дополнительной вернувшейся фиксации

Простой способ сделать это состоит в том, чтобы заказать Guid.NewGuid(), но тогда упорядочивание происходит на стороне клиента. Можно быть в состоянии убедить EF сделать что-то случайное на стороне сервера, но это не обязательно просто - и выполнение его с помощью "порядок случайным числом" , по-видимому, повреждается .

, Чтобы заставить упорядочивание произойти на стороне.NET вместо в EF, Вам нужно AsEnumerable:

IEnumerable results = context.MyEntity
                                       .Where(en => en.type == myTypeVar)
                                       .AsEnumerable()
                                       .OrderBy(en => context.Random());

было бы лучше стать незаказанным версия в списке и затем переставить это все же.

Random rnd = ...; // Assume a suitable Random instance
List results = context.MyEntity
                                .Where(en => en.type == myTypeVar)
                                .ToList();

results.Shuffle(rnd); // Assuming an extension method on List

Перестановка более эффективна, чем сортировка кроме чего-либо еще. Посмотрите мой статья о случайности для получения дополнительной информации о получении соответствующего Random экземпляр все же. Существует много реализаций перестановки Фишера-Йетса, доступных на Переполнении стека.

8
задан Albert 6 October 2009 в 16:29
поделиться

3 ответа

Если вы опубликовали, значит, вы правы, что не хотите переписывать историю master . Что вы хотите, так это опубликовать фиксацию в мастере, которая вернет ее в состояние, которое было на D , с сохранением текущей истории, чтобы другие пользователи могли легко объединить или переустановить свою работу.

Если вы планируете в будущем объединить тему в master , тогда вы, вероятно, также захотите создать новую общую базу между master и ] тему , так что при последующем объединении темы вы не потеряете коммиты, которые были отменены в мастере . Самый простой способ сделать это - сделать коммит «повторить» поверх «отмены». commit, который сбрасывает master обратно в исходное состояние и основывает новую ветку topic поверх этого.

# checkout master branch (currently at G)
git checkout master

# Reset the index to how we want master to look like
git reset D

# Move the branch pointer back to where it should be, leaving the index
# looking like D
git reset --soft HEAD@{1}

# Make a commit (D') for the head of the master branch
git commit -m "Temporarily revert E, F and G"

# Create the new topic branch based on master.
# We're going to make it on top of master and the 'undo'
# commit to ensure that subsequent merges of master->topic
# or topic->master don't merge in the undo.
git checkout -b topic

# Revert the undo commit, making a redo commit (G').
git revert HEAD

В качестве альтернативы вы могли бы сделать коммиты E ', F' и G переделывать каждую часть отдельно, но поскольку E, F и G уже есть в вашей опубликованной истории, вероятно, будет более понятным, если вы просто укажете фиксацию «отменить» и скажете, что эта фиксация отменяется. В любом случае, это то, что делает git revert .

По сути, вы знаете, что есть это.

D -- E -- F -- G -- D'      <-- master
                     \
                      \
                        G'  <-- topic

Важно то, что вы не переписывали историю, а тема основана на главном, поэтому слияния не будут случайно применить любые «отменить» коммиты. Теперь вы можете безопасно отправить главный и топик в удаленный репозиторий.

# checkout master branch (currently at G)
git checkout master

# Reset the index to how we want master to look like
git reset D

# Move the branch pointer back to where it should be, leaving the index
# looking like D
git reset --soft HEAD@{1}

# Make a commit (D') for the head of the master branch
git commit -m "Temporarily revert E, F and G"

# Create the new topic branch based on master.
# We're going to make it on top of master and the 'undo'
# commit to ensure that subsequent merges of master->topic
# or topic->master don't merge in the undo.
git checkout -b topic

# Revert the undo commit, making a redo commit (G').
git revert HEAD

В качестве альтернативы вы могли бы сделать коммиты E ', F' и G ', переделывая каждую часть отдельно, но поскольку E, F и G уже есть в вашей опубликованной истории, это, вероятно, будет более понятно, если вы просто сделаете ссылку на фиксацию «отменить» и говорят, что эта фиксация отменяется. Во всяком случае, это то, что делает git revert .

По сути, вы знаете, что есть это.

D -- E -- F -- G -- D'      <-- master
                     \
                      \
                        G'  <-- topic

Важно то, что вы не переписывали историю, а тема основана на мастере, поэтому слияния не будут случайно применить любые «отменить» коммиты. Теперь вы можете безопасно отправить главный и топик в удаленный репозиторий.

# checkout master branch (currently at G)
git checkout master

# Reset the index to how we want master to look like
git reset D

# Move the branch pointer back to where it should be, leaving the index
# looking like D
git reset --soft HEAD@{1}

# Make a commit (D') for the head of the master branch
git commit -m "Temporarily revert E, F and G"

# Create the new topic branch based on master.
# We're going to make it on top of master and the 'undo'
# commit to ensure that subsequent merges of master->topic
# or topic->master don't merge in the undo.
git checkout -b topic

# Revert the undo commit, making a redo commit (G').
git revert HEAD

В качестве альтернативы вы могли бы сделать коммиты E ', F' и G ', переделывая каждую часть отдельно, но поскольку E, F и G уже есть в вашей опубликованной истории, это, вероятно, будет более понятно, если вы просто сделаете ссылку на фиксацию «отменить» и говорят, что эта фиксация отменяется. Во всяком случае, это то, что делает git revert .

По сути, вы знаете, что есть это.

D -- E -- F -- G -- D'      <-- master
                     \
                      \
                        G'  <-- topic

Важно то, что вы не переписывали историю, а тема основана на мастере, поэтому слияния не будут случайно применить любые «отменить» коммиты. Теперь вы можете безопасно отправить главный и топик в удаленный репозиторий.

Вероятно, будет более понятным, если вы просто укажете фиксацию «отменить» и скажете, что эта фиксация отменяется. Во всяком случае, это то, что делает git revert .

По сути, вы знаете, что есть это.

D -- E -- F -- G -- D'      <-- master
                     \
                      \
                        G'  <-- topic

Важно то, что вы не переписывали историю, а тема основана на мастере, поэтому слияния не будут случайно применить любые «отменить» коммиты. Теперь вы можете безопасно отправить главный и топик в удаленный репозиторий.

Вероятно, будет более понятным, если вы просто укажете фиксацию «отменить» и скажете, что эта фиксация отменяется. Во всяком случае, это то, что делает git revert .

По сути, вы знаете, что есть это.

D -- E -- F -- G -- D'      <-- master
                     \
                      \
                        G'  <-- topic

Важно то, что вы не переписывали историю, а тема основана на мастере, поэтому слияния не будут случайно применить любые «отменить» коммиты. Теперь вы можете безопасно отправить главный и топик в удаленный репозиторий.

7
ответ дан 5 December 2019 в 20:17
поделиться

Вы можете переписать свою историю, если хотите, но это плохая идея, если у кого-то еще есть копии истории. В этом случае вы, вероятно, использовали бы интерактивную перебазировку: git rebase -i master topic . Это даст вам список коммитов от мастера к теме с подсказками о том, как с ними играть. Вы' d просто нужно удалить строку, содержащую коммит, который вы хотите удалить.

Тем не менее, я должен подчеркнуть, что делать это безответственно, если у кого-то еще есть такая история. Вам придется принудительно протолкнуть его в центральное репо, и всем остальным придется исправить свои репозитории, чтобы они соответствовали, может быть относительно простым или сложным в зависимости от обстоятельств.

Есть хороший раздел под названием «восстановление из исходной перебазировки» в страница руководства git-rebase , где обсуждается, как с этим справиться, если вы действительно решите.

Редактировать:

Для простой истории обычным сценарием будет: после принудительного нажатия на не-fastforward в центральный репо ( push -f ), другие разработчики:

  • создают резервную копию своего старого мастера: git branch -m master master_old
  • получить обновления и воссоздать мастер из источника: git источник удаленного обновления; git branch master origin / master
  • переназначить все ветки темы на новый мастер: git rebase --onto master master_old topic

Если у них есть работа в , их главная ветка не в origin тем не менее, им придется стать более причудливыми, перенастроив эту работу и все тематические ветки на новую должность мастера ... это должно дать вам представление, почему так ужасно переписывать историю, которая есть у других людей. На самом деле, как только что-то попало в общедоступное хранилище, вы должны рассматривать это как надежно записанную историю, а не как незавершенную работу.

Придется усложниться, перенастроив эту работу и все тематические ветки на новую должность мастера ... это должно дать вам представление, почему так ужасно переписывать историю, которая есть у других людей. На самом деле, как только что-то попало в общедоступное хранилище, вы должны рассматривать это как надежно записанную историю, а не как незавершенную работу.

Придется усложниться, перенастроив эту работу и все тематические ветки на новую должность мастера ... это должно дать вам представление, почему так ужасно переписывать историю, которая есть у других людей. На самом деле, как только что-то попало в общедоступное хранилище, вы должны рассматривать это как надежно записанную историю, а не как незавершенную работу.

4
ответ дан 5 December 2019 в 20:17
поделиться

Я считаю, что git stash очень полезен

Просто спрячьте его и никогда больше не смотрите.

-3
ответ дан 5 December 2019 в 20:17
поделиться
Другие вопросы по тегам:

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