2009-12-03 3 views
3

Я работаю в филиале и получаю рабочую копию с действительно нечистым. При просмотре изменений в фиксации я хотел, чтобы некоторые исправления oneliner были привязаны к ветке master.С Git, как я могу внести некоторые изменения в рабочую копию в другую ветку?

В этом случае использование git stash на самом деле не помогает, потому что в моей рабочей копии есть много других изменений, которые еще не сливаются с мастером.

Есть ли более эффективный способ исправить эту ситуацию? (например, совершение фиксации и перемещение его родителя?)

ответ

1

Основываясь на предыдущем предложения, это решение, которое я придумал:

решение 1 с вишней-забрать

Просто совершить одно изменение в самой отрасли:

git add --patch <files>  # record every change to move to master 
git commit 

Перейти к мастеру, и вишневое выбрать

git stash 
git checkout master 
git cherry-pick <commitid> 

Назад в отрасли, это может быть нормированный.

git checkout <branch> 
git rebase master 

Для каждого дублируют фиксации, вам будет предложено ввести:

git rebase --skip 

Повторяющиеся фиксаций отфильтровываются из лоскутного установить в отрасли, и история чиста. Финал git merge все еще может быть быстрым.

Решение 2, без фиксации в отрасли первого

Сначала извлечь все, чтобы перейти к мастеру:

git add --patch <files>  # record every change to move to master 

Затем перейти к мастеру совершить:

git stash --keep-index  # clear the working copy only 
git checkout master -m  # merge the index. 
git commit 

И обратно в ветку, он может быть непосредственно переформирован до конца мастера:

git checkout <branchname> 
git rebase master   # move to branch start to the tip of master. 
git stash apply    # restore working copy, auto merges the changes 

Solution 3, чтобы сделать клон текущего мастер филиала

В случае, если вы не возражаете, имеющих несколько рабочих копий (я всегда делал это с SVN на самом деле), есть третье решение:

mkdir ../newrepos 
cd ../newrepos 
git init 
git remote add origin /path/to/your/repository 
git fetch master:remotes/origin/master # fetch remote master to local remotes/origin/master 
git checkout -t origin/master   # make new "master" branch, link to remote, checkout. 

git commit 
git push origin master     # inject the change in the original repository. 

Настройка клонирования выполняется вручную здесь, потому что git clone всегда клонирует активную ветвь.


Для более сложных ситуаций, всегда есть дополнительный сейф охранник с git diff > to-master.patch и git apply to-master.patch. Это позволяет вам больше свободы сбросить все, и попробуйте, пока вы не попрактитесь.

В этой ситуации мы имеем дело с однострочным исправлением в файле, который существует в обеих ветвях. Это не даст никаких конфликтов слияния и позволяет использовать некоторые ярлыки, такие как checkout -m.

1

Я не знаю, если это то, что вы хотите, но я бы просто проверил другую ветку (которая не теряет незавершенных изменений), а затем выборочно проверьте изменения, которые вы хотите совершить.

3

Используйте git add -i, чтобы выбрать то, что вы хотите зафиксировать в этой ветке, а затем перейти на мастер и совершить остаток.

С помощью add -i вы можете выбрать, какие части файлов вы хотите подготовить для совершения, а затем зафиксировать их, оставив другие части тех же файлов вне коммита.

+1

По моему опыту, 'add -p' - это то, что большинство людей хотят, когда они используют' add -i' – Dustin

+0

Я часто использую 'git add -patch' для этих случаев, к сожалению, я также хочу сохранить некоторые изменения в рабочей копии, поэтому я не могу переключать ветви. – vdboor

6

Для использования интерактивного режима вы можете использовать git add -i. Там вы можете указать, что совершать и что пропускать.

Таким образом вы можете совершать свои oneliners как отдельные фиксации. Используя git cherry-pick, вы можете объединить их с вашим мастером позже.

+0

Испытывал git cherry-pick, и это работает довольно аккуратно! При rebase дубликаты будут снова отфильтрованы с помощью git rebase -skip. Спасибо за совет! – vdboor

2

git add -p отправит вас прямо в режим исправления, чтобы следить за процессом @ arkaitz-jimenez правильно рекомендует.

0

Вместо использования git add -i/git add -p вы также можете использовать интерактивный добавить режим git gui
(вероятно, другой GIT графических интерфейсов, которые находятся в лать вывод о фиксации инструмента, как, например, QGit, имеют эту функцию)

Смежные вопросы