Як замінити локальну гілку на віддалену гілку повністю у Git?


777

У мене є дві гілки:

  1. місцева філія (з якою я працюю)
  2. віддалене відділення (загальнодоступне, там проходять лише перевірені комісії)

Нещодавно я серйозно заплутався у своєму місцевому відділенні.

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

Я вже шукав SO та перевірка локальної віддаленої гілки не впливає.


1
Я знаю, що у прийнятій відповіді 1280 голосів, але вам слід подумати про зміну прийнятої відповіді на одну від @TTT.
Джеймі

Відповіді:


1286
  1. Переконайтесь, що ви перевірили гілку, яку ви замінюєте (з коментаря Золтана ).
  2. Якщо припустити, що master - це локальна гілка, яку ви замінюєте, і що "origin / master" - це віддалена гілка, на яку потрібно скинути:

    git reset --hard origin/master
    

Це оновлює вашу локальну гілку HEAD на ту саму редакцію, що й джерело / головне, і --hardсинхронізує цю зміну в індекс і робочу область.


4
Дякую за вашу пропозицію, я просто так боюся використовувати --hard та --force, тому я просто вибрав рішення, яке не використовує.
YemSalat

13
@KonstantinLevin: Ага так, називання цих варіантів досить дратує. git resetза замовчуванням перенаправить поточну гілку та синхронізує індекс. --softпропустить оновлення індексу, --hardтакож синхронізує робочу область. Власний досвід я використовую --hardбільшу частину часу, за винятком випадків, коли я хочу скасувати останнє зобов'язання (що саме git reset HEAD^)
araqnid

9
Маючи більший досвід роботи з git, я переконаний, що це краще рішення, дякую.
YemSalat

24
напевно, вам потрібно буде git fetch origin remote_branch
зайняти

53
Слід зазначити, що це замінить будь-яку галузь, на яку ви зараз працюєте, вмістом головного . Отже, якщо ви працюєте, наприклад, з гілкою функцій, вона замінить усі її зобов'язання master, тому переконайтеся, що ви перевірили гілку, яку ви замінюєте спочатку.
Золтан

218

Це так просто, як три кроки:

  1. Видаліть локальну філію: git branch -d local_branch
  2. Отримати останню віддалену гілку: git fetch origin remote_branch
  3. Побудуйте локальну гілку на основі віддаленого: git checkout -b local_branch origin/remote_branch

7
Насправді те, що сказав @araqnid, є правильним і стислішим. Я тестував його, і ви можете спробувати.
adamsmith

Нічого собі, git checkout -b local_branch origin / remote_branch - це чудово! Я завжди робив це у двох окремих командах. Дякую!
kendepelchin

11
Вам може знадобитися зробити git branch -D local_branchна першому кроці, якщо ваша філія не об'єднана.
szeryf

спасибі, мені було важко під час використання gitflow, після публікації гілки та її закінчення я хотів перейти до видаленої гілки, і ваше рішення було єдиним, хто працював, тягнутий, здається, не працює .. або я мав не використовують це добре -
Decebal

2
ми повинні переконатися, що поточна гілка не є тією, яку потрібно видалити.
a_secenthusiast

43
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>

Що робить thetrack частина?
еоніст

3
@GitSync, про це git help branchйдеться --track. When creating a new branch, set up branch.<name>.remote and branch.<name>.merge configuration entries to mark the start-point branch as "upstream" from the new branch. This configuration will tell git to show the relationship between the two branches in git status and git branch -v. Furthermore, it directs git pull without arguments to pull from the upstream when the new branch is checked out. Цю команду я зафіксував у відповіді. Дякуємо за підвищення точки.
Sailesh

Отже, в простому плані: він додає віддалену URL-адресу до нової гілки. Тому вони синхронізовані назавжди. Так сказати.
еоніст

2
Можна сказати, що це просто для зручності. Якщо ви зробите git statusце, він повідомить, якщо ваша локальна філія попереду або позаду віддаленої гілки, якщо у вас їх пов’язано. Крім того, ви можете зробити git pull(або push) замість повного, git pull <remote> <branch>якщо ви вже встановили свою філію для відстеження <remote/branch>.
Sailesh

22

Все замініть на віддалену гілку; але лише з того самого комітету, на якому працює ваша місцева філія:

git reset --hard origin/some-branch

АБО , отримайте останню інформацію з віддаленого відділення та замініть все:

git fetch origin some-branch
git reset --hard FETCH_HEAD

У сторону, якщо потрібно, ви можете викреслити відслідковувані файли та каталоги, які ви ще не зробили:

git clean -fd

git cleanКоманда зробила це для мене. git reset hard origin/masterне викреслюйте файли, що не відслідковуються. Дякую!
Морнор

9

Найбезпечніший і найповніший спосіб замінити поточну локальну гілку на віддалену:

git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch

stashЛінія зберігає зміни , які ви не робили. branchЛінія рухається вашу гілку з іншим ім'ям, звільняючи оригінальна назва. fetchРядок витягує останню копію пульта дистанційного керування. checkoutЛінія відтворює вихідну гілку в якості відстеження галузі.

Або як функція bash:

replaceWithRemote() {
    yourBranch=${1:-`git rev-parse --abbrev-ref HEAD`}
    git stash
    git merge --abort
    git rebase --abort
    git branch -M ${yourBranch} replaced_${yourBranch}_`git rev-parse --short HEAD`
    git fetch origin ${yourBranch}:${yourBranch}
    git checkout ${yourBranch}
}

яка перейменовує поточну гілку на щось на зразок substitu_master_98d258f.


Може захотіти включити git stash popв цей робочий процес. Якщо ви хочете повторно застосувати збережені файли.
еоніст

Що ви робите з прихованою гілкою? Боюся, що знову з’явиться десь у майбутньому, довго, коли я забуду, для чого це було.
Скотт Біггс

1
@ScottBiggs Якщо ви хочете видалити приховану гілку, використовуйте "git stash clear".
Марк А. Дарем

4

Я здивований, що про це ще ніхто не згадав; Я використовую його майже щодня:

git reset --hard @{u}

По суті, @{u}це лише стенограма для верхньої гілки, яку відстежує ваша поточна гілка. Наприклад, це зазвичай дорівнює origin/[my-current-branch-name]. Це приємно, тому що це галузевий агностик.

git fetchСпочатку переконайтеся, щоб отримати останню копію віддаленого відділення.


1
це виглядає дуже приємно, я втомився копіювати та вставляти назву гілки для скидання!
pedroct92

1
У мене було кілька випадків, коли я додав відповіді на старі запитання, і мої відповіді підійшли до лідерів. Я сподіваюся, що це так.
Джеймі

3

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

1) Скидання важко

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

git reset --hard origin/develop

2) Видаліть поточну гілку та ще раз отримайте скарб із віддаленого сховища

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

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

3) Скасувати злиття

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

git merge --abort

4) Скасувати базу даних

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

git rebase --abort

2

Ви можете зробити так, як сказав @Hugo з @Laurent, або можете git rebaseвидалити комісії, які ви хочете позбутися, якщо ви знаєте, які з них. Я схильний використовувати git rebase -i head~N(де N - це число, що дозволяє вам маніпулювати останніми N комітами) для такого роду операцій.


Насправді саме команда 'git rebase' зіпсувала всю справу, потім деякі примусові злиття та жорсткі перезавантаження .. У будь-якому разі, що я шукав - це лише якийсь простий спосіб витягнути всю репо з віддаленого сервера без злиття.
YemSalat

2

Обраний відповідь є абсолютно правильним , однак він не залишив мене з останньої фіксацією / поштовхів ...

Тож для мене:

git reset --hard dev/jobmanager-tools
git pull  ( did not work as git was not sure what branch i wanted)

Оскільки я знаю, я хочу тимчасово встановити свою гілку на потоці протягом декількох тижнів на конкретну гілку (таку ж, яку я перейшов / перевірив раніше та зробив жорсткий перезавантаження)

Тож ПІСЛЯ скидання

git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 

1

Якщо ви хочете оновити відділення, яке наразі не перевірено, ви можете зробити:

git fetch -f origin rbranch:lbranch

0

Як передбачено у вибраному поясненні, добре скинути git . Але сьогодні ми часто використовуємо підмодулі: сховища всередині сховищ. Наприклад, якщо ви використовуєте ZF3 та jQuery у своєму проекті, ви, ймовірно, хочете, щоб вони були клоновані зі своїх оригінальних сховищ. У такому випадку скидання git недостатньо. Нам потрібно оновити підмодулі до тієї точної версії, яка визначена в нашому сховищі:

git checkout master
git fetch origin master
git reset --hard origin/master
git pull

git submodule foreach git submodule update

git status

це те саме, що ви (cd) прийдете рекурсивно до робочого каталогу кожного підмодуля і запустить:

git submodule update

І це дуже відрізняється від

git checkout master
git pull

тому що підмодулі вказують не на гілку, а на комітку.

У тих випадках, коли ви вручну перевіряєте якусь гілку для 1 або більше підмодулів, ви можете запустити

git submodule foreach git pull

Будь ласка, надайте пояснення, особливо, відповідаючи на запитання цієї старої. Ваша відповідь не є корисною, як є.
Ерік А

Прийнята відповідь вже пропонує git reset --hard. Це додає малої цінності.
florisla

0
git reset --hard
git clean -fd

Це працювало для мене - clean показав усі файли, які він також видалив. Якщо це говорить про те, що ви втратите зміни, вам потрібно приховати.


-6

Потворний, але простіший спосіб: видалити локальну папку та знову клонувати віддалений сховище.


10
Або просто видаліть гілку та перевірити її ще раз.
ларан

Так, я думаю, що я буду робити, якщо не знайду, як це зробити менш "потворним"
YemSalat

2
Потворне іноді корисно знати. Я б хотів, щоб люди не брали на себе відповідальність за те, що вони не є загальноприйнятим способом: повинна бути більш раціональна причина заборони ... і це слід надати. Git - це річ, яка досягає результатів. Це не якийсь сакральний текст.
мійський гризун

3
Я не розумію суті: --( Так, це неелегантно і т. Д., Але може працювати найкраще в деяких випадках ... Вибачте @Hugo
silverdr

@Hugo, погодився. Щось таємниче і смердюче трапилося з моїм місцевим відділом розвитку, і обидва керівника команди та менеджер з інженерії запропонували, серед більш елегантних рішень, просто (зашпаркувати, скопіювати та зберегти мою функціональну роботу, а потім) занурити місцеве репо і повторно запустити.
AmitaiB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.