2014-01-26 4 views
0

Я работал над мастер-ветвью, модифицируя 10 файлов и добавляя 5 новых.
Я понял, что один из файлов не должен быть изменен, и я должен отключить его, поскольку исходная версия была правильной.
Я также решил продолжить свою работу в филиале.
Я сделал: git checkout -b newBranch
Затем я сделал git add и git commit всей моей работы в филиале.
Но я забыл, что мне пришлось отключить один из файлов!
Итак, теперь единственным решением, которое я могу придумать, является копирование исходного файла из главной ветви в мою ветку, а затем добавление и комманду для замены измененного файла.
Я думаю, что это должно сработать, но я думаю, будет странно объединять позже мое последнее завершение моей частной ветви с моей главной ветвью и доставить файл такой же, как тот, который находится на главном сервере.
Есть ли лучший способ справиться с этим беспорядком?Как удалить файл из фиксации частной ветки?

ответ

2

Пока вы не делитесь этой веткой, у вас есть несколько решений.


совершает --amend

Если вы только что совершили все ваши файлы, вы могли бы сделать

#Restore the file 
git checkout HEAD -- my/file.txt 

#Fix your commit 
git add my/file.txt 
git commit --amend 

Это будет заново последним коммитом с файлом фиксированного

rebase -i

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

Вы можете раздавить свои коммиты.

Допустим, у вас есть

  • один совершить где вы добавили все ваши файлы (назовем его abc)
  • один совершить где вы извлечь старую версию файла, который вы не хотите изменить (назовем это def)

Вы могли бы просто сделать git rebase -i HEAD^^.Это откроет текстовый редактор с двумя вашими последних фиксаций, как

pick abc first commit message 
pick def second commit message 

заменить его на

pick abc first commit message 
fixup def second commit message 

затем сохранить и выйти, и мерзавец будет объединить эти две фиксации


Edit1: некоторые пояснения по 2-му решению по комментарию

git rebase -i HEAD^^ означает «пусть меня изменить свое дерево совершить, начиная с HEAD^^» (А HEAD^^ означает «the parent of the parent of my current commit»)

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

pick, действие по умолчанию, означает «не изменить фиксации. squash означает„слияние этой фиксации и предыдущий“. fixup является„слияние этой фиксации и предыдущий, и повторно использовать сообщение фиксации“

Во всяком случае, если вы не уверены в том, что вы делаете, вы можете пометить первоначальное обязательство перед выполнением такого рода манипуляций. Пример:

git tag safetyNet 
git rebase -i HEAD^^ 
#damned, I screwed up 
git checkout safetyNet 

Edit2, чтобы ответить на другой комментарий

Если вы уже нажали на свою ветку на удаленный компьютер, и если вы единственный, кто ее использует, то это не имеет большого значения. Однако вам придется «заставить» толчок. Вот почему

Допустим, у вас есть следующие фиксаций:

A -- B 
    L newBranch | commit with the file you didn't want to modify 

Так как вы толкали, это то, что у вас есть как на локальном компьютере и на удаленных РЕПО.

После фиксации его (с помощью раствора 1 или 2), вы будете иметь в вашем репо

A -- B2 
\ L newBranch |fixed commit 
    \ 
    \- B 
     L commit with the file you didn't want to modify, not on any branch anymore 

Если вы пытаетесь git push origin newBranch он потерпит неудачу, так как вы не можете fast forward от B к B2.

Так что вам нужно сделать git push -f origin newBranch, чтобы рассказать git «Я знаю, что я делаю, идите в любом случае».

Чтение http://git-scm.com/book/en/Git-Branching-Remote-Branches может помочь прояснить эти понятия

+0

'мерзавец Rebase ГОЛОВА ^^' это rebases в моей частной отрасли? Что это делает? Также я не уверен, что такое 'pick/fixup' – Jim

+0

« Пока вы не делились этой ветвью », я нажал ее на удаленный, если это то, что вы имеете в виду. Но я единственный, кто работает над этим. – Jim

+0

Поскольку вы работаете только с ней, вы в безопасности. Однако обратите внимание, что вам придется «git push -f» после этого – gturri

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