2012-03-21 2 views
192

Я просто раздавил некоторые коммиты с git rebase и сделал git push --force (что злобно, я знаю).Git pull after принудительное обновление

Теперь у других инженеров-программистов есть другая история, и когда они делают git pull, Git будет сливаться. Есть ли способ исправить это, за исключением выполнения rm my-repo; git clone [email protected]:my-repo.git?

Мне нужно что-то вроде напротив git push --force, но git pull --force не дал ожидаемых результатов.

+10

они могут удалить свою ветку и снова создать ее, без необходимости удаления всего репо: 'git checkout master && git branch -D test && git checkout -b test origin/test' – Florian

+1

Возможный дубликат [Force Git to перезаписать локальные файлы при загрузке] (http://stackoverflow.com/questions/1125968/force-git-to-overwrite-local-files-on-pull) – gpoo

ответ

318

Чтобы получить новые коммиты

git fetch 

Сброс

Вы можете сбросить фиксации для местного отделения с помощью git reset.

Чтобы изменить коммит местного филиала:

git reset origin/master --hard 

Будьте осторожны, так как документация ставит его:

возвратов индекс и рабочее дерево. Любые изменения в отслеживаемых файлах в рабочем дереве с < commit> отбрасываются.

Если вы хотите сохранить все изменения, которые у вас есть на месте, сделайте вместо этого сброс --soft. Что будет обновлять историю фиксации для ветви, но не изменять какие-либо файлы в рабочем каталоге (и вы можете их зафиксировать).

Rebase

Вы можете воспроизводить локальные коммиты поверх любой другой фиксации/ветвь с помощью git rebase:

git rebase -i origin/master 

Это будет вызывать перебазироваться в интерактивном режиме, где вы можете выбрать, как применять каждый индивидуальная фиксация, которой нет в истории, которую вы перегружаете сверху.

Если вы удалили (с git push -f), уже были занесены в местную историю, они будут перечислены как коммиты, которые будут повторно применены - их нужно будет удалить как часть перестановки или они просто будут повторно - включается в историю для отрасли - и вновь появляется в отдаленной истории при следующем нажатии.

Для получения более подробной информации и примеров по любой из вышеуказанных (или других) команд воспользуйтесь справкой git command --help.

+0

Что делать, если они уже сделали некоторые локальные коммиты? – iblue

+0

@iblue выбирать между потерями всех изменений, удалением истории фиксации, сохранением изменений файла или попыткой применить каждую фиксацию поверх новой главы. Самый простой вариант - это, вероятно, мягкий сброс. – AD7six

+0

@iblue Когда ваш коллега использует «git reabse origin/master», и в то же время, у них уже был некоторый фиксат до этого, git напишет вашу фиксацию за их фиксацией. – Tim

11

Это не будет фиксировать ветви, у которых уже есть код, который вам не нужен (см. Ниже, как это сделать), но если они потянули какую-то ветвь и теперь хотят, чтобы она была чистой (а не «вперед» происхождения/какой-ветви), то вы просто:

git checkout some-branch # where some-branch can be replaced by any other branch 
git branch base-branch -D # where base-branch is the one with the squashed commits 
git checkout -b base-branch origin/base-branch # recreating branch with correct commits 

Примечание: вы можете объединить их все, поставив & & между ними

Примечание2: Флориан упомянул об этом в комментариях, но кто читает комментарии при поиске ответов?

Примечание3: Если у вас есть зараженные ветви, вы можете создавать новые, основанные на новой «немой ветке», и только вишневый захват завершается.

Ex:

git checkout feature-old # some branch with the extra commits 
git log     # gives commits (write down the id of the ones you want) 
git checkout base-branch # after you have already cleaned your local copy of it as above 
git checkout -b feature-new # make a new branch for your feature 
git cherry-pick asdfasd # where asdfasd is one of the commit ids you want 
# repeat previous step for each commit id 
git branch feature-old -D # delete the old branch 

Теперь предлагается новый ваш филиал без дополнительных (возможно, плохо) нарушает!

+0

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

+0

@ peter-mortensen Редактирование должно быть значительным в соответствии с https://stackoverflow.com/help/editing –

Смежные вопросы