Подтвердить что ты не робот

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]

Это отлично работает, но заставит компилятор (проверяющий дату) подумать, что целая куча файлов загрязнена и нуждается в перестройке, даже если содержимое одного и того же. Есть ли способ checkout-and-merge, который оставляет рабочее дерево неизменным в этом случае?

Что-то вроде:

git checkout master --merge-branch feature1

EDIT:

Я говорю только о быстрых слияниях, которые по определению не изменят состояние файлов.

4b9b3361

Ответ 1

[Edit] Это только частичное решение/обходное решение. См. Фактический ответ @djpohly ниже.

Во-первых, вы можете нажать из любого места. Не имеет значения, что вы проверили, или те коммиты, которые вы хотите нажать, находятся в главном.

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

Но это делает жесткий reset для мастера. т.е. он не проверяет ускоренную перемотку вперед.

Ответ 2

Простой и безопасный способ сделать это - без толчка или принудительного обновления - это получить feature1 в master:

(feature1)$ git fetch . feature1:master
From .
   4a6000d..8675309  feature1   -> master

Трюк использует ., чтобы получить локальную функцию1 ref. Это безопаснее, чем принудительное обновление основной ветки, поскольку она обеспечивает быстрое переключение. (Подробнее см. Параметр <refspec> в git -fetch документации.)

Теперь, когда feature1 и master одинаковы, переключение между ними не будет касаться каких-либо файлов:

(feature1)$ git checkout master
Switched to branch 'master'
(master)$

Ответ 3

Невозможно слияние (или rebase), не касаясь рабочего каталога (и индекса), так как могут возникнуть конфликты слияния, которые должны быть разрешены с использованием рабочего каталога (и/или индекса).

У вас всегда может быть другой клон (возможно, с помощью альтернативного или символического каталога объектов, чтобы сохранить дисковое пространство) или другой рабочий каталог с contrib/workdir/git-new-workdir. Или используйте такой инструмент, как

Ответ 4

Если вы только заботитесь о нескольких файлах и используете Unix, вы можете вручную изменить mtime после факта, используя touch -d <timestamp>. Убедитесь, что вы используете ls --full-time для получения метки времени, поскольку на дисплее по умолчанию отсутствует точность.

Например, представьте, что вы используете Docker для создания образа для веб-приложения на базе Python. Если файл requirements.txt изменяется, требуется много времени для восстановления, потому что ему необходимо загрузить кучу сторонних библиотек и скомпилировать их. Просто reset этот файл 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"