Здійснення Git не завершено, але не може продовжуватися на цій машині


11

Іноді я стикаюся з проблемою недозволеного коду на робочій станції, яка не готова взяти на себе зобов’язання, але її потрібно заповнити на іншій робочій станції чи ноутбуці.

Хто-небудь має рішення для цієї проблеми, наприклад, "м'яке фіксування" чи якийсь інший спосіб перенесення змін на іншу машину для роботи над ними в іншому місці?

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


2
цю публікацію досить важко читати (стіна тексту). Ви б не хотіли відредагувати його в кращій формі?
гнат

..звучить, як ти після git stash...?
Саймон Уайтхед

@SimonWhitehead так, але чи можна легко перемістити скрипт git на іншу машину?
csteifel

Усі коміти Git - це "м'які коміти".
користувач253751

Відповіді:


12

Далі передбачається, що ваше локальне репо є клоном репо на іншому сервері, наприклад, github; і що ви маєте права вносити зміни на верхній сервер. У своєму прикладі я назвав це репо вгору за течією "походженням". Запустіть git remote showсписок інших репост, це може дати вам підказку щодо того, як воно називається.

Я б запропонував зробити гілку, тоді ви можете перевірити гілку на іншій машині. Насправді, якщо ви зробите філію, як тільки ви почнете роботу, ви можете «взяти на себе» свою філію, мати слід та резервну копію вашої роботи, не маючи стабільного набору коду. Після того, як ви будете задоволені своєю роботою, ви зможете об'єднати її назад у свою "головну" гілку.

  • Щоб відділити ваше РЕПО: git checkout -b MyNewBranch
  • Щоб пришвидшити зміни вашої нової філії: git push origin MyNewBranch
  • Щоб перевірити відділення на іншій машині: git checkout MyNewBranch
  • Для переходу до іншої гілки (наприклад, "майстер"): git checkout master
  • Перебуваючи в майстер, щоб знову об'єднати MyNewBranch: git merge MyNewBranch
  • Щоб перелічити гілки: git branch

3
Так, завжди робота у власному приватному відділенні по суті вирішує цю проблему. Ви можете робити зобов’язання так часто, як вам захочеться, не зачіпаючи нікого іншого. Ще краще - створювати нову гілку щоразу, коли ви починаєте роботу над новою функцією або починаєте виправляти новий дефект. Це дозволяє дуже легко переходити назад і назад між базами кодів.
Gort the Robot

Також і причина цього: якщо ви помилилися на півдорозі, ви можете перейти до попередніх комісій на поточній гілці. Або відскочити назад, схопити шматок, стрибнути вперед і застосувати.
AMADANON Inc.

1
Чи не буде цей метод також включати неповні коміти в об'єднану головну гілку?
eimrek

Так, і (на мою думку) це, мабуть, не погано. Якщо ви цього не хочете, виконайте вищесказане, тоді замість того, щоб ввести код, створіть diff (який включає всі зміни файлу, але ніякі коміти), застосуйте його до нової копії гілки, а потім натисніть її.
AMADANON Inc.

2
щодо " Переключитися на іншу гілку робитиgit branch -d master ", я плутаюсь, чи не просить Git видалити головну гілку ?? (таке враження я отримую, будь-коли читаючи посібник з
гіткової

2

Ви можете використовувати git diffдля створення патча, а потім застосувати його на іншій машині. Або ви можете створити тимчасовий фіксатор, а потім витягніть його з іншої машини. Ви навіть можете створити тимчасову гілку на якійсь іншій машині, натиснути на неї тимчасовий фіксатор, а потім видалити гілку.

Мій улюблений метод - другий: створити тимчасовий фіксатор, потім перейти на іншу машину і зробити щось подібне:

$ git fetch ssh://first_machine/path/to/repo whatever_branch_i_was_working_on
$ git reset --hard FETCH_HEAD
$ git reset HEAD^

Чому так складно і не просто використовувати git format-patch?
пробуй-нарешті,

Не дуже відрізняється від git diff. Щось мені не вистачає?
aragaer

1
git format-patch deadbee..badcab1e- Він створює .patchфайли для кожної фіксації окремо з гарним ім'ям та повідомленням про фіксацію.
пробуй-нарешті

Чи він також створює виправлення для змін, які ще не здійснені? Чи він відокремлює поточний індекс та речі, які ще не встановлені? Схоже, це не так.
aragaer

Ні, не для незапущених / незмінених змін. Але оскільки фіксація не шкодить нікому іншому, доки ви не натискаєте, це повинно бути нормально (з чітким повідомленням, що говорить "WIP" - робота в процесі виконання).
try-catch-нарешті

2

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

Звичайно, ви можете натиснути безпосередньо між репостами, ви можете використовувати пакет або format-patch/ am, але особиста гілка - це найпростіше рішення. І переписування історії не є великою справою, доки вона не підштовхується до будь-якої спільної гілки. У багатьох проектах люди повинні перемотувати гілки функцій, щоб їх було легше зрозуміти для огляду.


0

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

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

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


0

Як відповіли інші, з Git вам не варто піклуватися про незакінчений код у ваших особистих відділеннях. Однак, якщо ви з якоїсь причини дійсно дуже не хочете, щоб ваша незавершена робота коли-небудь торкнулася головного репо, ви можете використовувати розподілену природу Git!

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

git clone https://github.com/octocat/Spoon-Knife.git working_copy_1
cd working_copy_1

внести деякі зміни та скористатись тимчасовою філією:

git checkout -b tmp_branch
git commit -a -m "temporary changes"

Тепер, пакет їх змін:

git bundle create ../tmp.bundle tmp_branch

Тепер у вас є файл пакету, який ви можете відправити на вашу нову машину. Як ви його там використовуєте? Створимо нову робочу копію:

cd ..
git clone https://github.com/octocat/Spoon-Knife.git working_copy_2
cd working_copy_2

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

git remote add tmp ../tmp.bundle
git fetch tmp

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

git merge tmp/tmp_branch --squash

і залишається лише видалити тимчасовий пульт:

git remote remove tmp

ВІОЛА! Зміни були перенесені на нову робочу копію, не залишаючи сліду ні філії, ні комісії!

Але насправді - цей процес досить тривалий і громіздкий. Це Git, а не SVN - насправді не повинно бути причин не заштовхувати свою персональну гілку до центрального репо.

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