2014-10-20 2 views
2

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

enter image description here

Моя тема была реализована в С2 в тему ветви, а затем объединены в мастер-отрасли. Еще одна попытка C5 на мастере для другой темы. Теперь я просто нашел проблему с функцией, реализованной в C2. Должен ли я исправить это в ветке темы как C6, затем снова слить на главную ветку? Или я должен просто избавиться от ветви темы, так как она уже была объединена и просто исправить ее непосредственно в главной ветке?

В идеале я хотел бы сохранить C2 и C6 в одной фиксации, чтобы при внедрении удаленного репозитория я мог протащить чистую историю. Но я не думаю, что могу просто выжать C2 и C6 из-за слияния. Есть ли способ сделать это?

Что считается хорошей практикой для исправления темы после ее объединения?

ответ

1

Вам будет полезно узнать о git rebase для управления вашей местной историей. Например, рассмотрим эту историю команд, которые я думаю, что примерно воссоздает ситуацию и и возможное разрешение с помощью git rebase -i переставить вашу местную историю:

mkdir tmpfoo 
cd tmpfoo/ 
git init 
touch bar 
git add . 
git commit -am 'c1' 
git checkout -b topic 
touch baz 
git add . 
git commit -am 'c2' 
git checkout master 
touch foo 
git add . 
git commit -am 'c3' 
git merge topic 
touch quux 
git add . 
git commit -am 'c5' 
git checkout topic 
echo b >> baz 
git commit -am 'c6' 
git checkout master 
git merge topic 
git log --oneline --graph --decorate --all 
* 577f974 (HEAD, master) Merge branch 'topic' 
|\ 
| * 6750b0d (topic) c6 
* | 08ebbf2 c5 
* | 0cef647 Merge branch 'topic' 
|\ \ 
| |/ 
| * f1e6882 c2 
* | 0e19228 c3 
|/ 
* 90e6149 c1 
19933 git rebase -i 90e6149 
>>edit the sequence of commits to something like the following: 
pick 0e19228 c3 
pick 08ebbf2 c5 
pick f1e6882 c2 
s 6750b0d c6 
19934 git log --oneline --graph --decorate --all 
* 0e3afe0 (HEAD, master) c2 
* 7611fb9 c5 
* 0e19228 c3 
| * 6750b0d (topic) c6 
| * f1e6882 c2 
|/ 
* 90e6149 c1 
git diff ORIG_HEAD # no output here, the rebase didn't change the working tree's state 
+0

Спасибо @jonderry, похоже, что мне нужно. Если я правильно понимаю, вы удаляете c4 из истории с помощью интерактивной переадресации, а вместо слияния ветви темы вы оставляете ее там и потенциально можете использовать ее позже, если вам нужна другая переадресация? – loopkin

+0

Да, если вы считаете, что вам может понадобиться ваша старая работа, прежде чем переставлять, это хорошая идея, чтобы оставить ветку на некоторое время, поэтому вам не нужно искать в своем рефлоге, чтобы найти свою старую частичную работу. Интерактивная rebase может переупорядочить фиксации и «squash» несколько коммитов в одну большую фиксацию. – jonderry

+0

Возможно, вы захотите отредактировать свой ответ и заменить свои псевдонимы для 'commit' и' checkout' –

1

Ну, я могу придумать взломать это. Он работает только в том случае, если главная ветка находится в удаленном репозитории, и вы всегда можете ее оттуда оттуда. Тогда вы должны сделать следующие шаги в локальном хранилище:

  1. git checkout master
  2. git reset --hard <C3> - сброс к фиксации до слияния совершить
  3. git checkout topic
  4. делать то, что вы хотите сделать в C6
  5. git commit --amend - это позволяет сэкономить C6 в C2 на самом деле
  6. git checkout master
  7. git pull origin master - тянуть все коммиты вы сброс из удаленного хранилища
  8. git merge topic

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

+0

Это не звучит, как у него есть удаленный репозиторий. –

+0

Могу ли я создать копию этого репозитория и использовать его как удаленный, чтобы реализовать «хак», который вы описываете? – loopkin

+0

@ ZuoLi, спасибо за ваш ответ. Я не уверен, что могу применить его напрямую. Я также обновил свой вопрос, я думаю, что я ищу, это лучшая практика в отношении того, как справиться с такой ситуацией. Я недостаточно опытен, чтобы Гит знал, что то, о чем я прошу, это правильный способ сделать это. – loopkin

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