Нужно сбросить ветку git на исходную версию - PullRequest
349 голосов
/ 16 февраля 2012

Я случайно работал над веткой, которой я не должен был какое-то время быть, поэтому я отделился от нее, дав ей соответствующее имя.Теперь я хочу переписать ветку, на которой я не должен был работать, до версии от origin (github).Есть простой способ сделать это?Я попытался удалить ветку и затем сбросить отслеживающую ветку, но она просто дает мне версию, над которой я снова работал.

Ответы [ 3 ]

655 голосов
/ 16 февраля 2012

Если вы еще не нажали на источник, вы можете сбросить свою ветку на ветку upstream с помощью:

git checkout mybranch
git reset --hard origin/mybranch

(Убедитесь, что вы ссылаетесь на ваш последний коммит вотдельная ветка, как вы упомянули в своем вопросе)

Обратите внимание, что сразу после сброса mybranch@{1} ссылается на старый коммит, до сброса.

Но если вы уже нажали, посмотрите " Создайте ветку git и верните оригинал в исходное состояние"для других опций.


Как прокомментировал Брэд Херман , reset --hard будет удалите любой новый файл или сбросьте измененный файл в HEAD .

На самом деле, чтобы убедиться, что вы начинаете с «чистого листа», git clean -f -d после сброса обеспечит рабочее дерево точно , идентичное ветви, в которую вы только что сбросили.


В этом блоге предлагаются эти псевдонимы (только для master ветви, но вы можете их адаптировать / расширять):

[alias]
   resetorigin = !git fetch origin && git reset --hard origin/master && git clean -f -d
   resetupstream = !git fetch upstream && git reset --hard upstream/master && git clean -f -d

Тогда выМожно ввести:

git resetupstream

или

git resetorigin
13 голосов
/ 24 августа 2016

Предполагая, что это то, что произошло:

# on branch master
vi buggy.py                 # you edit file
git add buggy.py            # stage file
git commit -m "Fix the bug" # commit
vi tests.py                 # edit another file but do not commit yet

Тогда вы понимаете, что вносите изменения не в ту ветку.

git checkout -b mybranch    # you create the correct branch and switch to it

Но master все еще указывает на ваш коммит. Вы хотите, чтобы он указывал туда, куда указывал раньше.

Решение

Самый простой способ:

git branch --force master origin/master

Другой способ:

git checkout master
git reset --soft origin/master
git checkout mybranch

Обратите внимание, что использование reset --hard приведет к потере незафиксированных изменений (tests.py в моем примере).

6 голосов
/ 20 октября 2015

У меня есть частное репо на сервере, и я регулярно перебираю / принудительно отправляю на него, что заставляет часто перезагружать локальную ветку на моем другом компьютере. Поэтому я создал следующий псевдоним "catchup", который позволяет делать это для текущей ветви. В отличие от другого ответа в этом псевдониме нет жестко закодированного имени ветви.

Держись крепче.

[alias]
  catchup = "!f(){ echo -n \"reset \\033[0;33m$(git symbolic-ref -q --short HEAD)\\033[0m to \\033[0;33m$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))\\033[0m? (Y/n) \"; read -r ans; if [ \"$ans\" = \"y\" -o \"$ans\" = \"Y\" -o -z \"$ans\" ]; then git reset --hard $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)); else echo \"catchup aborted\"; fi }; f"

Правильно отформатированный (не будет работать с символами новой строки в .gitconfig) это выглядит так:

"
!f(){
  echo -n \"reset \\033[0;33m$(git symbolic-ref -q --short HEAD)\\033[0m to \\033[0;33m$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD))\\033[0m? (Y/n) \";
  read -r ans;
  if [ \"$ans\" = \"y\" -o \"$ans\" = \"Y\" -o -z \"$ans\" ]; then
    git reset --hard $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD));
  else
    echo \"catchup aborted\";
  fi
}; f
"
  • \\033[0;33m и \\033[0m предназначены для выделения текущей ветви и восходящего потока цветом.
  • $(git symbolic-ref -q --short HEAD) - текущее имя ветви
  • $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)) является восходящим потоком текущей ветви.

Поскольку сброс - это потенциально опасный вызов (особенно с параметром --hard, вы потеряете все незафиксированные изменения), он сначала сообщает вам, что он собирается делать. Например, если вы находитесь на ветке dev-container с удаленным именем qcpp / dev-container и вводите git catchup, вам будет предложено:

сбросить dev-container в qcpp / dev-container? (Y / N)

Если вы затем наберете y или просто нажмете return, произойдет сброс. Если вы введете что-либо еще, сброс не будет выполнен.

Если вы хотите быть сверхбезопасным и программно предотвратить потерю неустановленных / незафиксированных изменений, вы можете дополнительно увеличить указанный выше псевдоним с помощью в соответствии с проверками diff-index .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...