Перемістіть існуючу, незапущену роботу до нової філії в Git


3125

Я розпочав деяку роботу над новою функцією, і після кодування трохи вирішив, що ця функція повинна бути на власній гілці.

Як перенести існуючі незапущені зміни до нової гілки та скинути поточну?

Я хочу скинути свою поточну гілку, зберігаючи існуючу роботу над новою функцією.


Той самий цікавий предмет stackoverflow.com/q/556923/269514 ?
Гілберто

Відповіді:


3640

Використовуйте наступне:

git checkout -b <new-branch>

Це дозволить залишити поточну філію такою, якою вона є, створити та оформити нову гілку та зберегти всі зміни. Потім ви можете поетапно змінити файли, з якими потрібно скористатися:

git add <files>

і взяти на себе зобов’язання зі своєю новою філією :

git commit -m "<Brief description of this commit>"

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

Ви не скидаєте початкову гілку, вона залишається такою, якою вона є. Останнє зобов’язання <old-branch>буде як і раніше. Тому ви checkout -bі тоді виконуватимете.


Оновлення 2020 / Git 2,23

Git 2.23 додає нову switchпідкоманду, намагаючись очистити деяку плутанину, яка виникає внаслідок перевантаженого використання checkout(перемикання гілок, відновлення файлів, вилучення HEAD тощо).

Починаючи з цієї версії Git, замініть команду вище на:

git switch -c <new-branch>

Поведінка ідентична і залишається незмінною.


15
Просто для того, щоб переконатися, мені потрібно виконати незакінчену функцію ДО ПЕРЕД Я скинути свою початкову гілку? Чи збережуться ці непослані файли незалежно від вчинення?
Дейн О'Коннор

192
FYI: зміни в робочому каталозі та зміни в індексі не належать до галузі. git checkout -b <new branch>зміни, на яких ці зміни закінчуватимуться
Якуб Нарбскі

152
Якщо у вас вже є філія і хочете перемістити зміни в існуючу гілку, Checkout stackoverflow.com/questions/556923 / ...
Chirantan

14
Якщо ви хочете перенести свою нову гілку до віддаленого сховища: stackoverflow.com/questions/2765421/…
Dewayne

10
@JDSmith: неспроможні зміни НЕ належать до жодної галузі. Вони живуть тільки в робочому каталозі git checkout ./ git reset --hardбуде безповоротно видалити їх
knittl

329

Як варіант:

  1. Збережіть поточні зміни в тимчасовій сховищі:

    $ git stash

  2. Створіть нову гілку на основі цього сховища та перейдіть до нової гілки:

    $ git stash branch <new-branch> stash@{0}

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


51
Якщо інша гілка вже існує, ви можете просто перейти на неї з касовим замовленням git stash apply.
Архонічний

6
Я не розумію підказку "Порада: використовуйте клавішу вкладки, щоб зменшити введення скриньки." Чи не ім’я "скринька @ {0}"? Я не можу це запустити успішно.
Герберт

7
Чому це краще, ніж прийнята відповідь stackoverflow.com/a/1394804/754997 ?
Кріс Пейдж

10
Я не розумію, чому це краще, ніж прийнята відповідьgit checkout -b <new branch name>
Noitidart

6
Вам не потрібно до git add -Aприбирання.
vichle

48

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

  1. Скопіюйте свою поточну історію на нову гілку, ввімкнувши і будь-які неспроможні зміни:

    git checkout -b <new-feature-branch>
    
  2. Тепер змушуйте оригінальну "брудну" гілку відкотити: (не перемикаючись на неї)

    git branch -f <previous-branch> <earlier-commit-id>
    

    Наприклад:

    git branch -f master origin/master
    

    або якщо ви зробили 4 коміти:

    git branch -f master HEAD~4
    

Попередження: git branch -f master origin/master буде скидання відстеження інформації для цієї галузі. Тож якщо ви налаштували своюmasterгілку для того, щоб натиснути кудись, крімorigin/masterтого, ця конфігурація буде втрачена.

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


6
Це дає відповідь на запитання, яке дещо відрізняється від того, що поставили оп. Я вирішив поставити цю відповідь тут, тому що саме тут Google привіз мене, коли я шукав відповідь. Актуальне питання, яке стосується цієї ситуації , тут .
joeytwiddle

26

Поширений сценарій такий: я забув створити нову гілку для нової функції та провів всю роботу в старій гілці функцій. Я переклав всю "стару" роботу на головну галузь, і хочу, щоб моя нова гілка виросла з "господаря". Я не взяв жодного зобов’язання у своїй новій роботі. Ось структура гілки: "master" -> "Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply

18

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

git cherry-pick <commitID>

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


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

1
@Meredith, ха-ха, щось таке. Це чудово, якщо ви не плануєте свої зміни наперед ... і хто це робить;)
пароль

1

Це може бути корисно для всіх, хто використовує інструменти для GIT

Командування

Переключити гілку - вона перемістить ваші зміни до нової гілки. Тоді ви можете здійснити зміни.

 $ git checkout -b <new-branch>

ЧерепахаGIT

Клацніть правою кнопкою миші на сховищі, а потім використовуйте TortoiseGit-> Switch / Checkout

введіть тут опис зображення введіть тут опис зображення

SourceTree

Використовуйте кнопку "Оформити замовлення" для перемикання відділення. Після натискання на гілку ви побачите кнопку "замовлення" вгорі. Зміни від поточної гілки будуть застосовані автоматично. Тоді ви можете їх здійснити.

введіть тут опис зображення


0

Я використав @Robin відповідь і перерахував усе, що я зробив,

git status                               <-- review/list uncommitted changes
git stash                                <-- stash uncommitted changes
git stash branch <new-branch> stash@{1}  <-- create a branch from stash
git add .                                <-- add local changes
git status                               <-- review the status; ready to commit
git commit -m "local changes ..."        <-- commit the changes
git branch --list                        <-- see list of branches incl the one created above
git status                               <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch>                <-- switch back

! Якщо у РЕПО є більше одного сховища, подивіться, який з них застосувати до нової гілки:

git stash list  
  stash@{0}: WIP on ...  
  stash@{1}: WIP on ...

і оглянути індивідуальне сховище,

git stash show stash@{1}

Або огляньте всі сховища одразу:

git stash list -p

0

Насправді це дійсно простий спосіб зробити це за допомогою GitHub Desktop тепер, коли я не вважаю, що це було функцією раніше.

Все, що вам потрібно зробити, - це перейти на нову гілку в GitHub Desktop, і вона запропонує вам залишити свої зміни в поточній гілці (яка буде прихована) або перенести свої зміни з собою в нову гілку. Просто виберіть другий варіант, щоб внести зміни до нової гілки. Потім ви можете взяти на себе зобов'язання, як зазвичай.

GitHub Desktop

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