2010-03-25 7 views
11

У меня есть фиксация, я сохранил ее в ветке, потому что это должно идти только к определенному ящику.Git исключить фиксацию в ветке

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

Теперь, по ошибке, я объединил master-dev и ввел эту фиксацию в dev.

Я знаю, что может git вернуть sha, к ветви dev; но так как это собирается ввести коммит, который отменяет это совершение (я предполагаю, что я точно не пробовал это), когда я объединю мастер, эта фиксация тоже будет отменена?

Если да, то как мне отменить это фиксацию только от ветви dev.

И oh, git reset HEAD^1 --hard не является вариантом, потому что есть другие фиксации на хозяине после неотвеченного фиксации.

Если сброс назад и применение является единственным вариантом, то как я могу объединить эти дополнительные коммиты с мастером, кроме ненужной фиксации.

Обновление:

Это дерево фиксации. Выглядит сложным. Я указал на фиксацию, что мне не нужно в dev. (Я также удалил личную информацию, спасибо за понимание. Это намного проще скриншот gitk чем ASCii искусства.) alt text

Заранее спасибо!

+1

Можно ли ASCii-искусство это, как я не полностью ясно, где происходит слияние, связано с нежелательным фиксацией? –

+0

В svn вы можете объединить диапазоны ревизий, 1-19, 49, 52-90 ... Я уверен, что вы можете сделать это и в git. – SeanJA

+1

@SeanJA: Я не уверен, что аналогия svn - лучший способ ответить. В частности, с git, если вы начинаете с 'A-B-C' и удаляете' B', чтобы получить 'A-C'', фиксация' C'' не совпадает с фиксацией 'C', потому что она не имеет одного и того же родителя. Таким образом, вы можете построить вторую ветвь, состоящую из первоначальных коммитов с нужной нужной, а затем слить ее, но вы не должны объединить исходную ветвь. – Cascabel

ответ

16

На пустой копии вашей ветки, git rebase --interactive и отказаться от нежелательной фиксации. В качестве альтернативы вы можете создать новую ветвь, расположенную выше по потоку от нежелательной фиксации, и git cherry-pick желаемая фиксация на ней.

Есть, вероятно, больше способов достичь этого.

2

git reflog, затем git reset --hard - ваши друзья, чтобы отменить ошибки.

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

  • Предположима: слияние из ветви В голове.
  • Определить revid коммиттерских следует избегать (R0)
  • Определить revid коммиттерских непосредственно перед R0 (R1)

    git merge <R1> 
    git merge -s ours R0 
    git merge B 
    
Смежные вопросы