Як повернути "master" до "origin / master"?


215

Чи можу я зробити наступне простішим способом?

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

Іноді це можна зробити, не торкаючись робочого дерева: stackoverflow.com/a/12343727/586086
Andrew Mao

6
Будь ласка, оновіть прийняту відповідь: @ Відповідь KindDragon коректна та коротша.
Роберт Сімер

Відповіді:


310

Як згадується у відповіді KindDragon , ви можете відтворити masterбезпосередньо за origin/masterдопомогою:

git checkout -B master origin/master

Сторінка git checkoutчоловіка згадує:

Якщо -Bдано, <new_branch>створюється, якщо його не існує; в іншому випадку вона скидається . Це транзакційний еквівалент

$ git branch -f <branch> [<start point>]
$ git checkout <branch>

Спочатку запропоновано:

Щось на зразок:

$ git checkout master

# remember where the master was referencing to
$ git branch previous_master

# Reset master back to origin/master
$ git reset --hard origin/master

з кроком 2 необов’язковим.


1
Це можна зробити одним рядком.
Роберт Сімер

93

Git підтримує цю команду:

git checkout -B master origin/master

Ознайомтеся з origin/masterгілкою, а потім скиньте masterгілку там.


4
Єдина правдива відповідь.
Роберт Сімер

3
збережіть чотири натискання клавіш - цитати вам не потрібні. Просто: git checkout -B master origin / master
zumalifeguard

скажімо, я зробив дві речі, перша - це злиття з гілкою, а друга - регулярна. Що відбувається зі злиттям, якщо я повернусь до початкового / головного?
утдев

1
чи не потрібно git fetch origin masterраніше, щоб переконатися origin/master, що оновлення?
педрозат

Так, звичайно з усіма рішеннями, які ви повинні зробити git fetchспочатку
KindDragon

29

Я думаю, що навіть відповідь VonC має складність порівняно з цим варіантом:

git update-ref refs/heads/master origin/master
git reset --hard master

git автоматично реєструє кожне значення ref (через рефлог). Тож після запуску цієї команди, тоді master@{1}посилається на попереднє значення master.

Відповідь VonC правильна, але він витрачає час на перевірку старого значення master у файловій системі.

Якщо ви дбаєте про осиротілі предмети в репо, то можете бігти git gc


1
Звучить цікава альтернатива. +1
VonC

Я все одно отримуюAlready on 'master'
yourfriendzak

@yourfriendzak, я забув про врахування того, що ви, можливо, вже перевірили майстра перед оновленням майстра. Я оновив відповідь таким, який повинен працювати навіть у тому випадку.
Олександр Птах

Це працює навіть у тому випадку, якщо ви не є головним (наприклад, окремий стан HEAD, який фактично вказує на початок / головний наконечник). Потім ви можете отримати майстер оформлення замовлення без необхідності гортати старі файли через репо. Чудово!
Ендрю Мао

20

Якщо ви вже є, masterви можете зробити наступне:

git reset --hard origin/master

Він вкаже локальну masterгілку на віддалений origin/masterта відкине будь-які зміни в робочому режимі.


І буде видаляти файли! Якщо ви створили / відредагували файли та запустили на них "git add", ця команда видалить їх. Будьте попереджені.
Сисо

Чи краще такий підхід git checkout -B master origin/master?
Джим Ахо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.