Git commit не закончен, но не может продолжить на этой машине


11

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

У кого-нибудь есть решение этой проблемы, такое как «мягкая фиксация» или какой-либо другой способ передачи изменений на другую машину для работы на них в другом месте?

Я бы предпочел, чтобы меня не принуждали к фиксации и продвигали изменения, которые не реализованы должным образом.


2
этот пост довольно трудно читать (стена текста). Не могли бы вы изменить его в лучшую форму?
Комнат

... похоже, что вы после git stash...?
Саймон Уайтхед

@SimonWhitehead да, но я могу легко перенести git stash на другую машину?
csteifel

Все коммиты Git являются «мягкими коммитами».
user253751

Ответы:


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
Разве этот метод также не включает неполные коммиты в объединенную главную ветку?
Эймрек

Да, и (на мой взгляд) это, вероятно, неплохо. Если вы этого не хотите, сделайте вышеописанное, затем вместо фиксации вашего кода создайте diff (который включает в себя все изменения файла, но не фиксации), примените его к свежей копии ветви, а затем нажмите его.
AMADANON Inc.

2
относительно " чтобы переключиться на другую ветку делатьgit branch -d master ", я запутался, разве это не просит git удалить главную ветку ?? (это впечатление, которое я получаю от чтения руководства по ветке git)
Tasos Papastylianou

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» - работа в процессе).
попробуй поймай-наконец

2

Я совершаю это. Я толкаю его в личную ветку , захожу на другую сторону и поправляю. И удалите личную ветку, когда закончите.

Конечно, вы можете нажать прямо между репозиториями, вы можете использовать bundle или format-patch/ am, но персональная ветка на сегодняшний день является самым простым решением. И переписывание истории не имеет большого значения до тех пор, пока она не отправлена ​​в какую-либо общую ветку. Во многих проектах люди должны перематывать ветви функций, чтобы их было легче понять для обзора.


0

Простой подход - тот, который вы описываете: скопируйте .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

VIOLA! Изменения были перенесены в новую рабочую копию, не оставив следов ни веток, ни коммитов!

Но на самом деле - этот процесс довольно долгий и громоздкий. Это Git, а не SVN - на самом деле не должно быть никаких причин не подталкивать вашу личную ветку к центральному репо.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.