Git оформить заказ и слить, не касаясь рабочего дерева
Скажем, у меня есть ветвь функций, в которую я объединяю вышестоящие изменения, прежде чем откладывать свои изменения обратно:
git branch feature1
... [edit my code]
... [commit]
git fetch origin master
git merge fetch_head [or rebase]
... [resolve conflicts]
... [build and test code]
На данный момент я хочу подтолкнуть мои изменения. Обычный способ сделать это будет:
git checkout master [changes a bunch of working tree files]
git merge feature1 [changes the same files right back]
Это работает нормально, но заставит (проверяющий дату) компилятор думать, что целая куча файлов грязная и нуждается в перестройке, даже если содержимое одинаково. Есть ли способ проверки и слияния, который оставляет рабочее дерево неизменным в этом случае?
Что-то вроде:
git checkout master --merge-branch feature1
РЕДАКТИРОВАТЬ:
Я говорю только о быстрых слияниях, которые по определению не изменят состояние файлов.
4 ответа
[Редактировать] Это только частичное решение / обходной путь. См фактический ответ @djpohly ниже.
Во-первых, вы можете нажать откуда угодно. Неважно, что вы извлекли, или коммиты, которые вы хотите нажать, находятся в master.
git push REMOTE_REPO feature1:master
увидеть git help push
Подсказка: git push remoteRepo localRef:remoteRef
Что касается переноса мастера туда, где вы сейчас находитесь, не возиться с вашей рабочей копией... Вы можете принудительно сделать это так:
# (while still on feature1 branch)
git checkout -B master origin/master
Но это делает полный сброс на мастер. то есть он не проверяет перемотку вперед.
Простой и безопасный способ сделать это - без принудительного или принудительного обновления - это загрузить feature1 в master:
(feature1)$ git fetch . feature1:master
From .
4a6000d..8675309 feature1 -> master
Трюк использует .
чтобы получить местную функцию1 исх. Это безопаснее, чем принудительное обновление главной ветки, так как оно обеспечивает ускоренное обновление. (Подробнее см. Параметр
Теперь, когда feature1 и master совпадают, переключение между ними не затронет никаких файлов:
(feature1)$ git checkout master
Switched to branch 'master'
(master)$
Слияние (или перебазирование) не может работать без соприкосновения с рабочим каталогом (и индексом), поскольку могут возникнуть конфликты слияния, которые необходимо разрешить с использованием рабочего каталога (и / или индекса).
У вас всегда может быть другой клон (возможно, с использованием альтернатив или каталога символических ссылок для экономии места на диске) или другой рабочий каталог с contrib/workdir/git-new-workdir
, Или используйте инструмент, такой как ccache.
Если вы заботитесь только о нескольких файлах и используете Unix, вы можете вручную изменить mtime после факта, используя touch -d <timestamp>
, Убедитесь, что вы используете ls --full-time
чтобы получить метку времени, так как отображение по умолчанию не имеет точности.
Например, представьте, что вы используете Docker для создания образа для веб-приложения на основе Python. Если requirements.txt
Для изменения файла требуется много времени для восстановления, потому что он должен загрузить кучу сторонних библиотек и скомпилировать их. Просто сбросьте mtime этого файла после слияния:
ls -og --full-time src/requirements.txt
# -rw-r--r-- 1 282 2015-11-04 20:03:28.918979065 +0400 src/requirements.txt
git checkout master
git merge --no-ff feature-foo
touch src/requirements.txt -d "2015-11-04 20:03:28.918979065 +0400"