Вы должны сливаться только с/от мастера один раз, в конце жизни ветки. Идея ветки функции/темы заключается в том, что она содержит только изменения, относящиеся к этой функции; вы теряете это при повторном объединении в мастер. (Вы можете прочитать, что Junio Hamano, the git maintainer, says about branches.)
Вы можете сделать «практическое» слияние, которое вы выбросите, и использовать git-rerere
, чтобы Git автоматически записывал ваши разрешения слияния, чтобы их можно было повторно использовать, когда вы действительно готовы к слиянию. См. http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html для фона и учебника. Это действительно здорово, потому что это позволяет вам выполнять работу слияния, не делая явно никаких явлений, а затем возвращать эту работу «волшебным образом», когда вы действительно готовы создать слияние. Таким образом, вместо одного большого мучительного слияния в конце вы можете сделать кучу меньших, надеюсь, более простых, промежуточных «практик» слияния на этом пути. Грубо говоря:
# Enable rerere
git config --global rerere.enabled 1
# Start a feature branch
git checkout -b feature
# Hack hack hack
git commit
git commit
# Practice merge
git merge master
# ...then throw the merge commit away, the work is saved by rerere
git reset --hard HEAD^
# Hack hack hack
git commit
# Really merge to master, reusing any saved work from rerere
git checkout master
git merge feature
git branch -d feature
Смотрите также http://progit.org/2010/03/08/rerere.html для другого учебника.
Вы также можете периодически переустанавливать ветку темы поверх мастера, а затем просто выполнять слияние в конце.
Чтобы справиться с ситуацией, подобной той, в которой вы сейчас находитесь, с веткой темы (например, с именем feature
), которая имеет серию объединений от основного, смешанного с различными незавершенными сделками, самый простой способ - сделать сжимаемое слияние для создания «объединенного» рабочего дерева, а затем создать новый коммит (или ряд коммитов) на main.Например:
git checkout master
git merge --squash feature
git commit
Это произведет один фиксацию, которая представляет состояние дерева во главе функции, объединено в мастер.
Конечно, вы можете просто сделать регулярное слияние до master
для этого изменения, оставив грязную историю feature
и просто работайте более чисто в будущем. например, просто
git checkout master
git merge feature
и двигаться дальше.
Теперь я еще более смущен. Я никогда не слышал git-rerere. Я читаю справочную страницу, и это имеет смысл, но я теряюсь в том, как работать с ней. Таким образом, перезагрузка используется не только для комков сквоша, но и для перемещения вперед в направлении вперед? Я весьма озадачен. Каков фактический процесс, который я должен использовать здесь? Особенно для длинных ветвей. – Micah 2010-12-02 16:59:06