2010-07-06 11 views
2

У меня была странная ситуация сегодня .. Я постараюсь и воссоздаю то, что я думаю.git: ветвление удалено некоторые коммиты

Я хотел переместить спекулятивное изменение (сделанное в a_file) в новую ветку и продолжить работу над главной ветвью без нее.

На мастер с a_file и b_fileгрязный я сделал:

git checkout -b saved_feature 

git commit a_file -m "Putting this modification on a different branch" 

git checkout master 

На данный момент мерзавца жаловался, что b_file был грязный - это предупреждающий знак, но я не узнал его.

я был еще на ветке saved_feature, так что я думал, что я мог сделать:

git stash save 

git checkout master 

До сих пор так хорошо

git stash pop 

На данный момент я получаю ошибку о том, что тайник не может быть слиты.

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

После изучения журнала ветви saved_feature, я вижу, что все они есть.

Что случилось?

следующий раз я попробовал на master:

git merge saved_feature 

Но перенесемся вариант не удалось с тонной конфликтов.

Я также использую Git-SVN, чтобы подтолкнуть изменения внешнего хранилища так далее master снова я сделал:

git svn rebase 

Это выздоровел некоторые из ранее подтолкнули фиксаций из SVN.

Я тогда вишня остального самый последних коммитов из saved_feature ветви, тогда я сделал git stash pop, закрепленные конфликты, которые должны были автоматически объединены, но не был, и, наконец, был мой master в состоянии это было изначально.

Может ли кто-нибудь указать на эту жалкую историю, где моя ментальная модель и git разложили пути &, как я могу избежать попадания в такие беспорядки, как эти?

ответ

3

Возможно, вы работали в течение последних 6 дней на detached HEAD от предка мастера HEAD.
(спасибо Chris Johnsen за предполагая, что последняя часть: она объясняет потенциально все)

Предположим, у вас есть:

x--x--x--x <- master 
    ^
     | 
     T1 (tag) 

Если вы делаете «git checkout T1», чтобы увидеть, что T1 содержание, бах: отдельностоящий ГОЛОВА право там.
Если вы сделать некоторые исправления из T1, вы в конечном итоге с

x--x--x--x <- master 
     ^\ 
     | -y--y--y--y--y--y <- detached HEAD (a dirty, b dirty) 
     | 
    T1(tag) 

Теперь, git checkout -b saved_feature в этой точке будет создать ветку с 6 последних (дней стоит) совершает в нем:

x--x--x--x <- master 
     ^\ 
     | -y--y--y--y--y--y--a <- saved_feature (a committed, b dirty) 
     | 
    T1(tag) 

, но выписка до master не является общей для файла b.
И слияние с master до saved_feature не будет нетривиальным (конечно, не быстро вперед один)

Во всяком случае, именно поэтому важно следить на протяжении всего времени в current branch you are actually working in.

+0

Я определенно рекомендую использовать функцию '__git_ps1' из завершения bash git (и использовать это тоже!) Вместо того, чтобы это домашнее решение этого блога. – Cascabel

+0

@Jefromi: Согласен. По крайней мере, это сообщение в блоге упоминает функцию '__git_ps1'. (хотя этот другой «доморощенный» тоже хорош: http://asimilatorul.com/index.php/2010/04/13/bash-prompt-with-git-branch-and-status/#readmore-entry100413- 221424) – VonC

+0

Одно из возможных объяснений того, почему объединение * saved_feature * в * master * может быть неудачным слиянием и иметь конфликты: OP отсоединил его HEAD у какого-то предка кончика * master * (например, для исследования старого моментального снимка), и его новые изменения имели конфликт с состоянием кончика * master * (например, исправление ошибок, которые уже были зафиксированы на кончике * master *, но по-разному). –

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