Сохранение набора небольших изменений, которые не следует вносить в SCM - PullRequest
2 голосов
/ 01 апреля 2011

Я использую git, но буду рад услышать ответы, относящиеся к другим SCM.

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

Правильнее всего сделать, конечно, объединить его в ствол, но до Я объединю его в ствол. Мне нужно сохранить список изменений, которые не будут зафиксированы.

Итак, допустим, мне нужно изменить мой make-файл на CC=mygcc (поскольку мне нужна символическая ссылка gcc, указывающая на неверную версию для другого программного обеспечения, которое я компилирую), но я не хочу его фиксировать другие не хотят, поэтому другие не хотят иметь mygcc символическую ссылку).

Что мне сделать, чтобы я мог легко синхронизировать и обновлять основной репозиторий?

Ответы [ 3 ]

4 голосов
/ 01 апреля 2011

Это действительно комментарий к второму варианту Элазара Лейбовича , который стал немного излишним для комментария :) В терминах графа коммитов я бы в основном сделал то же самое, что и вариант 2, но поддерживаюместный филиал, в котором есть мои изменения, а не остаться на хозяина.Другими словами, обычное состояние будет выглядеть так:

 A --- B --- C (master,origin/master) --- D --- E (local)

... если я хочу обновить с мастера, я бы сделал:

 git checkout local
 git fetch origin
 git rebase origin/master

... чтобы получитьto:

A --- B --- C (master) --- F --- G (origin/master) --- D' --- E' (local)

Если бы я добавил больше коммитов на local, я бы сделал это git rebase -i origin/master, чтобы я мог убедиться, что мои D и E по-прежнему наиболеенедавний в истории.

Преимущество этого по сравнению с вариантом 2 Элазара Лейбовича состоит только в том, что он уменьшает риск того, что вы случайно столкнете локальные изменения с master с git push или git push master, поскольку ваши локальные изменения никогда не будут в ветке master и не должно быть ветки с именем local удаленно.(Если это так, выберите другое имя, очевидно:))

Если у вас есть что-то, что вы хотите вернуть обратно к master, например, коммиты H и I здесь:

A -- B -- C (master) -- F -- G (origin/master) -- H -- I -- D'' -- E' (local)

... вы бы сделали:

git checkout master
git merge I
git push origin master
3 голосов
/ 01 апреля 2011

В Mercurial это лучше всего сделать с патчем mq .

Чтобы сделать начальный патч:

cd <working copy>
hg qinit
...make changes to your working copy
hg qnew <patch_name>

Затем, когда пришло время извлечь изменения с удаленного компьютера или фактически зафиксировать новые локальные изменения:

hg qpop -a        # remove all patches from your working copy
hg pull --update  # get new changesets from the remote and update to the latest
...work on local files
hg commit -m "commit changes without touching the patch"
hg push           # send changes to a remote repo that don't include the patch
hg qpush -a       # apply all patches to your updated working copy
2 голосов
/ 01 апреля 2011

В git Я вижу 2 варианта:

  1. Имейте это изменение, но никогда не добавляйте его в индекс.Это нормально, но если ваши изменения охватывают более одного файла, и если вам нужно зафиксировать только некоторые изменения в определенном файле, он становится утомительным (git add -p, подождите, нужна ли мне эта строка ...).
  2. Всегда на 1 коммит впереди удаленного мастера.Зафиксируйте изменения в мастере, и перед фиксацией перебазируйте все, чтобы коммит, который вы не хотите выдвигать, был на вершине.Затем отправьте все на сервер, кроме последнего коммита.

Позвольте мне показать быстрый сценарий, который я написал, чтобы убедиться, что ваш временный коммит всегда работает.Я предполагаю, что временный коммит будет иметь #alwaysontop в сообщении коммита.

Этот скрипт в основном ищет первый достижимый коммит с #alwaysontop в сообщении коммита и перебазирует все изменения после него, чтобыбыть на вершине.Убедитесь, что нет конфликтов с вашими коммитами и #alwaysontop, иначе он не будет работать хорошо.

Вы должны убедиться, что вы никогда не будете выдвигать коммит, помеченный #alwaysontop с помощью pre-push hook.

#!/bin/sh
if ! git diff-index --quiet HEAD --; then
        echo "Repository is dirty, only run with clean index and working tree"
        exit -1
fi

KEYWORD=':/#alwaysontop'

if ! git rev-parse $KEYWORD &>/dev/null; then
        echo No commit with $KEYWORD found
        exit -1
fi

TEMPREV=`git rev-parse $KEYWORD`
REMOTE_BRANCH=`git rev-parse $TEMPREV^`

echo @ rebasing current commit before $TEMPREV
git rebase --onto $REMOTE_BRANCH $TEMPREV && \
NEWHEAD=`git rev-parse HEAD` && \
echo @ now at $NEWHEAD moving to always-on-top commit && \
git reset --hard $TEMPREV && \
echo @ rebasing $TEMPREV to be topmost && \
git rebase $NEWHEAD
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...