Вопрос по master, git, git-branch – Git: убрать изменения из мастер ветки

27

Основной вопрос, но это происходит со мной все время:

Внести изменения вworking-branchПереключиться наmastergit merge working-branchgit pushcap deploy(к постановке)сделать новую чашку чая

затем я возвращаюсь и думаю о чем-то еще и начинаю вносить некоторые изменения ... пока еще на мастере.

Какие'Это простой способ:

предотвратить прямое редактирование на мастере (возможно, предупреждение)перенести все изменения вworking-branch и ясноmaster так что я могу продолжить редактирование наworking-branchвнести изменения в совершенно новую веткуnew-working-branch а потом выбросить?working-branch

Взял на себя риск и попробовал рекомендации в последней частиВетви" разделэта страница но это просто уничтожило ВСЕ мои правки!?! возможно потому что послеgit branch dubious-experiment а такжеgit checkout master git status на обеих ветках было одинаково (не вышлочистый» на мастера). Такgit reset --hard  уничтожены все изменения на обоих!?!

  git branch dubious-experiment

  M---N-----O----P---Q ("master" and "dubious-experiment")

  git checkout master

  # Be careful with this next command: make sure "git status" is
  # clean, you're definitely on "master" and the
  # "dubious-experiment" branch has the commits you were working
  # on first...

  git reset --hard 

Ваш Ответ

6   ответов
6

Если вы уже зафиксировали свои изменения вmaster но нет толкать куда угодно ...

создать новую ветку для последних изменений

git checkout -b newfeat master

Переиграйте все изменения (переместите коммиты) поверх вашегоworking-branch ветка

git rebase --onto working-branch origin/master newfeat

изменить наmaster ветвь и сбросьте его в состояние последнего нажатия

git checkout master
git reset --hard origin/master

На данный момент у вас есть:

master указывая на последний нажатый коммит ()origin/masterworking-branch никогда не менялсяновыйnewfeat ветвь, которая содержит все новые коммиты и опережает.working-branch
0

Я использовал для подобных случаев:

git branch -f 
git checkout 

или же.

git checkout -B 

Оба варианта перемещают веткуbranch-name на ваш текущий коммит без переустановки вашего дерева.

-1

Получить привычку печатать$ git status прежде чем вы на самом деле выполните команду git, которая изменит что-то.

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

если тыиметь запустил коммит для master, затем просто переместил файл между ветками примерно так:

 $ git checkout --patch master 

Ты нена самом деле не нужно сбрасывать мастер, если вы просто собираетесь объединить один и тот же файл с ним, но, вероятно, у вас нетВы ничего не нажали, вам нужно просто вернуться к веткам удаленного отслеживания ...

$ git reset master origin/master
$ git reset stage origin/stage # whatever
Я думаю я'Мне не хватает чего-то концептуального в Git?!? Извините за мое невежество, но что вы подразумеваете под "Git делает правильные вещи, если вы просто переключаете ветви "? Meltemi
@Meltemi, изменение файла во время извлечения ветки незаблокировать эти изменения для мастера. Если вы извлекаете другую ветку, вы можете просто зафиксировать свои изменения в ней, и мастер не будет знать об этой деятельности. @ Chronial, ну по умолчанию--mixed оставит свои изменения доступными для фиксации в правильной ветке темы. DigitalRoss
-1 - просто "кража» файл от мастера сgit checkout опасный - master может содержать изменения, которых нет в рабочей ветке, что вызывает беспорядок. Бегgit reset без--hard в основном просто будет очень запутанным. Chronial
27

Из вашего описания я предполагаю, что вы еще не зафиксировали никаких изменений - это верно?

Если да, то здесьВаши ответы:

Как предотвратить прямое редактирование мастером

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

Как перенести изменения в новую веткуnew-working-branch а затем выброситьworking-branch
git checkout -b new-working-branch
git add …
git commit -m "mycommit" 

Как ты не сделалВы ничего не делаете, чтобы освоить, вы неНе нужно ничего менять на мастере. Теперь вы можете отказаться от своей рабочей ветки, если захотите.

Как перенести изменения вworking-branch
git checkout -b temp-branch
git add …
git commit -m "mycommit" 
git rebase --onto working-branch master
git checkout working-branch
git reset --hard temp-branch
git branch -d temp-branch

Если ваши изменения неt конфликтовать с любыми изменениями на master, но не в рабочей ветке, это можно сделать намного проще:

git stash
git checkout working-branch
git stash pop
-1

1. предотвратить прямое редактирование на мастере (возможно, предупреждение)

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

[[email protected] directory:git_branch]

Я также раскрасил запись git_branch, так чтоСовершенно очевидно, что яЯ работаю над все время.Эти два ссылки на переполнение стека должны помочь с вашей подсказкой.

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

или же

3. Вложить правки в совершенно новую ветку new-working-branch и затем отбросить working-branch?

Это действительно один и тот же вопрос - как перенести изменения с мастера на ветку?s старая ветка или новая ветка. И ваш собственный ответ правильный. Хотя на второй взгляд, если вына мастер, вы могли бы проще запустить:

git branch new_branch
git reset --hard origin/master

Я предпочитаю просто сбросить master на origin / master, а не беспокоиться о конкретном коммите SHA. Но ваши шаги были по существу правильными. Что касается того, почему вы потеряли изменения, яЯ должен был думать, что по ошибке не былоt указатель ветки на Q при сбросе мастера. Никакое другое объяснение не имеет смысла. Опять же, наличие приглашения ветки shell поможет избежать этих ошибок. Дальше больше яЯ большой поклонник использования gitk или git log --graph, чтобы проверить, где находятся мои ветви, прежде чем я переместу их. Так как я могуя не могу использовать gitk на работе, в моем .gitconfig есть псевдоним "граф,» по сути, это версия командной строки:

[alias]
    graph = log --graph --all --date=short --pretty=format':%C(yellow)%h%Cblue%d%Creset %s %Cgreen %aN, %ad%Creset'

Это покажет график в крайнем левом углу, SHA для фиксации в желтом, ветви в синем, сообщение для фиксации в белом, и автор & дата в зеленом. Конечно, это можно изменить по своему вкусу.

[отредактировано для упрощения вышеуказанных команд]

==============================

В ответ на комментарий ниже:

Начать с

A-B < origin/master
   \
    C-D < master

Сейчас выполняюgit checkout -b new_branch

A-B < origin/master
   \
    C-D < master, new_branch

Теперь мастер проверки,git checkout master, Обратите внимание, чтоgit checkout -b new_branch && git checkout master такой же какgit branch new_branch если вы уже были на мастере. Я отредактировал приведенный выше ответ, чтобы отразить это.

Теперь сбросьте мастер на источник / мастер,git reset --hard origin/master

A-B < master, origin/master
   \
    C-D < new_branch

Поскольку у вас была ветвь (new_branch), указывающая на D, никакие изменения не теряются. Если я'Мы ошиблись, пожалуйста, уточните, где.

Ах, тогда я исправлюсь. Это кажется наиболее вероятным объяснением. Mike Monkiewicz
Абсолютная чепуха, я просто запустил это в тестовом хранилище, и этохорошо. (редактирование основного сообщения, чтобы доказать мою точку зрения) Mike Monkiewicz
Цитата из ОП: «git status на обеих ветках было одинаково (не вышлочистый» на мастера) » - он явно нене совершать его изменения -> ваш3. удалит эти изменения (навсегда). Chronial
-1 - ваш3. удалит все изменения. Chronial
0

Я обычно рекомендую следующую настройку Git:

git config push.default nothing

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

Похожие вопросы