Як скинути гілку головного git до гілки вище у розгалуженому сховищі?


107

Я повністю зіпсував головну гілку мого розгалуженого репозиторію git.

Я хочу повністю скинути головну гілку, яка була висунута до моєї вилки разом із вмістом майстер-репо. Я не зацікавлений у збереженні будь-яких основних змін у галузі або історії.

Найпростішим підходом було б видалення мого розгалуженого репо та переформатування з попереднього проекту. Однак у мене є робота в інших відсунутих гілках, які я не хочу втрачати.

Таким чином, як скинути свою гілку push-майстра з майстром, що стоїть вище?


git clone https://myrepo.git
cd myrepo
git remote add upstream https://upstream.git
git fetch upstream

Куди я піду звідси, щоб скинути свої локальні та віддалені гілки головного майстра за допомогою головного майстра?

Відповіді:


202

Ви можете скинути свою локальну головну гілку до попередньої версії та надіслати до свого сховища.

Якщо припустити, що "upstream" є оригінальним сховищем, а "origin" - це ваша вилка:

# ensures current branch is master
git checkout master

# pulls all new commits made to upstream/master
git pull upstream master

# this will delete all your local changes to master
git reset --hard upstream/master

# take care, this will delete all your changes on your forked master
git push origin master --force

(Ви можете визначити оригінальний репо як "вище" за допомогою git remote add upstream /url/to/original/repo.)


1
Можливо, це теж має бути git reset --hard upstream/masterскидання робочого каталогу. Але ваша відповідь все ж правильна.
j6t

Невикористання "--hard" також працює, зберігаючи локальні зміни. Я б зробив апаратне скидання за певний крок, щоб можливо перевірити різницю.
Йоганнес Бароп,

1
Це було дуже корисно.
Aleem S

4
Потрібно зателефонувати git fetch upstreamпершим
Генрі Е

3
Як зазначає @HenryE, якщо не отримати спочатку зміни вище за течією, git fetch upstreamзазвичай виникає така помилка, яку неможливо прочитати людині:"fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree."
Сесіл Каррі

5

Це призведе до скидання вашої основної гілки з майстром вище за течією, і якщо гілка була оновлена ​​з моменту розгалуження, вона також внесе ці зміни.

git checkout master 
git reset upstream/master
git pull --rebase upstream master
git push origin master --force

PS: Припускаючи, що вище за течією - це оригінальне репо, а джерело - ваша копія.


Здається, ви створили свою гілку з іншого коміту. Основною причиною перебазування є ведення лінійної історії проекту. Тим не менш, ви ніколи не повинні перебазувати коміти, як тільки вони були опубліковані у загальнодоступному сховищі, оскільки це замінює старі коміти новими. Детальніше див. Atlassian.com/git/tutorials/rewriting-history/git-rebase
user8128167

0

Я спробував такий метод:

$REPO=<repo>
$ORIGIN=<user>/$REPO
$UPSTREAM=<upstream>/$REPO

$ git clone git@github.com:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream git@github.com:$UPSTREAM.git
$ git reset --hard upstream/master
$ git pull --rebase upstream master
$ git push origin master --force

на виході буде показано попередження:

fatal: ambiguous argument 'upstream/master': 
unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Тож правильний шлях поставлений git pullперед git reset:

$ git clone git@github.com:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream git@github.com:$UPSTREAM.git
$ git pull --rebase upstream master
$ git reset --hard upstream/master
$ git push origin master --force

тоді результат буде таким:

From github.com:<upstream>/<repo>
 * branch                master     -> FETCH_HEAD
 * [new branch]          master     -> upstream/master
HEAD is now at 7a94b1790 Merge pull request #4237 from <upstream>/...
Current branch master is up to date.
Everything up-to-date.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.