Простой способ сделать это состоит в том, чтобы заказать 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
экземпляр все же. Существует много реализаций перестановки Фишера-Йетса, доступных на Переполнении стека.
Если вы опубликовали, значит, вы правы, что не хотите переписывать историю 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
Важно то, что вы не переписывали историю, а тема основана на мастере, поэтому слияния не будут случайно применить любые «отменить» коммиты. Теперь вы можете безопасно отправить главный
и топик
в удаленный репозиторий.
Вы можете переписать свою историю, если хотите, но это плохая идея, если у кого-то еще есть копии истории. В этом случае вы, вероятно, использовали бы интерактивную перебазировку: 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 тем не менее, им придется стать более причудливыми, перенастроив эту работу и все тематические ветки на новую должность мастера ... это должно дать вам представление, почему так ужасно переписывать историю, которая есть у других людей. На самом деле, как только что-то попало в общедоступное хранилище, вы должны рассматривать это как надежно записанную историю, а не как незавершенную работу.
Придется усложниться, перенастроив эту работу и все тематические ветки на новую должность мастера ... это должно дать вам представление, почему так ужасно переписывать историю, которая есть у других людей. На самом деле, как только что-то попало в общедоступное хранилище, вы должны рассматривать это как надежно записанную историю, а не как незавершенную работу. Придется усложниться, перенастроив эту работу и все тематические ветки на новую должность мастера ... это должно дать вам представление, почему так ужасно переписывать историю, которая есть у других людей. На самом деле, как только что-то попало в общедоступное хранилище, вы должны рассматривать это как надежно записанную историю, а не как незавершенную работу. Я считаю, что git stash
очень полезен
Просто спрячьте его и никогда больше не смотрите.