git: Ваша гілка та 'origin / master' розійшлися - як відкинути локальні коміти?


79

У мене є таке повідомлення в git:

# Your branch and 'origin/master' have diverged,
# and have 3 and 8 different commits each, respectively.
#   (use "git pull" to merge the remote branch into yours)

Я хотів би викинути 3 локальних коміти та витягнути 8 віддалених комітів у джерелі / майстрі.

(Злиття буде занадто складним, я волів би зробити 3 локальні коміти ще раз, коли master буде оновлений.)

Як я можу це зробити?

Відповіді:


213
git fetch origin
git reset --hard origin/master

19
Безперечно найкраща відповідь, яку я бачив. Для будь-кого, хто цим користується, будь-які непроштовхувані коміти або локальні зміни будуть втрачені лише до уваги.
DemitryT

4
чи можна обійтися git reset origin/masterбез --hardтого, щоб зміни робочого каталогу не втрачалися?
Wisbucky

Працює для мене. Це ідеальне рішення.
Уттам Панара,

Я бачу подібне повідомлення, але для гілки, яка не є головним, коли я перебазую його до останнього майстра. Що в такому випадку зробить тяга? Чи слід тягнути? Я хочу, щоб моє зобов'язання було присвячене останнім змінам.
Rajeev Ranjan

@RajeevRanjan: Pull буде (намагатися) об’єднати ваші існуючі зміни. Скидання скине їх.
Слакс

29

Щоб зберегти свої старі коміти на тимчасовій гілці, якщо вони вам потрібні:

git branch temp

Потім перейдіть до нового майстра

git fetch origin
git reset --hard origin/master

Тож у цьому випадку він розгалужує свою гілку? Якщо, наприклад, він працював у `` mydevbranch '', то це тимчасове відділення просто створює нову гілку копіювання mydevbranch? Це здається запобіжним заходом, як ви це робите, якщо вони коли-небудь знадобляться, вони є в цій копії ..
приземлився

1
Так, це запобіжний захід. Це просто гарантує, що комітети не будуть втрачені, якщо вони вам знадобляться в майбутньому.
jdramer

інтуїтивно я міг би подумати, що вам потрібно буде створити свій локальний код, перш ніж робити це - і в цьому проблема, тому що ви не хочете, щоб те, що ви щойно зробили, пішло вгору. Я припускаю, що ви заходите на місцевому рівні і не натискаєте - але врешті-решт йому доведеться підніматися ... це небажане, я припускаю. Гілка призначена для варіації чи іншої ознаки, але це має відбуватися із стану коміту? А може, саме про це ви говорите. Можливо, мені потрібно НЕ турбуватися про комітинг - я просто думав, що гілка бере копію з джерела коміту (втрачаючи локальні зміни)
приземлився

@landed: так, ви внесли б свої локальні зміни після створення гілки temp. Ви можете пізніше, якщо ви хочете відновити деякі з цих комітів, вибирайте їх (див. git help cherry-pick).
Cris Luengo

5

Спробуйте зробити це, щоб підірвати місцеві комітети:

git reset --hard HEAD~4

3

Як альтернативу об’єднанню ви можете перебазувати гілку об’єкта на головну гілку, використовуючи такі команди:

git checkout feature
git rebase master

2

Якщо апаратне скидання не вирізає його для вас, і ви не хочете робити злиття, ви можете викинути свої місцеві небажані зміни, видаливши локальну гілку та повторно завантаживши вихідну:

git branch -D <local branch>
git checkout -b <branch name> origin/<branch name>

Використовуючи в masterякості прикладу:

git branch -D master
git checkout -b master origin/master

Якщо локальна гілка відхилена від 'origin / <branch>', це не дозволяє видалити локальну гілку.
Anirban

1

Щоб стерти останній локальний коміт, використовуйте наступне:

git reset HEAD^

Це поверне заголовок до стану, що передував фіксації, і дозволить вам git pullз майстра. Не забудьте зберегти всі зміни в іншому місці (локально), перш ніж витягувати з віддаленого сховища.

Щоб мати можливість тягнути без конфліктів, використовуйте git stash, а потім git pull.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.