Git ребазинг в апстрим - PullRequest
       1

Git ребазинг в апстрим

12 голосов
/ 27 июля 2011

Итак, я разработал проект, сделал несколько изменений и подтолкнул их к origin / master.Я не собирался отправлять эти изменения обратно в апстрим.До сих пор все было хорошо и хорошо, но теперь у меня есть некоторые изменения, которые я хочу перенести в восходящий поток.

Могу ли я перебазироваться обратно в восходящий поток в другой ветви и зафиксировать эту ветку?Могу ли я зафиксировать эти изменения из моей ветки?Я ужасно изуродовал свой репо?

Ответы [ 3 ]

5 голосов
/ 28 июля 2011

Если коммиты A, B, C являются вашими личными изменениями, а коммиты 1,2,3 - это то, что вы хотите выдвинуть, ваша история будет выглядеть так:

                   (origin/master)
                  /
.... o - A - B - C - 1 - 2 - 3  (master)
      \
       (upstream/master)

Теперь вы хотите переместить 1,2,3 в новую ветку из восходящего направления:

git checkout master
git checkout -b upstream
git rebase origin/master --onto upstream/master

Это переключается на новую ветку с именем upstream, где находится ваш текущий master. Затем он отменяет коммиты 1,2,3 после коммита, на который ссылается upstream/master.

После операции у вас будет:

         1' - 2' - 3' (upstream)
        /
       /           (origin/master)
      /           /
.... o - A - B - C - 1 - 2 - 3  (master)
      \
       (upstream/master)

Теперь вы будете готовы переместить ветвь вверх по течению к пульту вверх по течению.

5 голосов
/ 27 июля 2011

Нет, не калечит.Просто ответвьте от upstream / master, сделайте там свои коммиты, и затем вы можете вставить (или pull-request) те коммиты, которые аккуратно помещаются в upstream / master.

Если у вас есть A --- B---C, где upstream / master находится в A, а master в C, то есть B и C - это коммиты, которые вы не хотите отправлять в восходящем направлении, тогда:

git checkout -b to-send-upstream A
# work, work, work
# commits
git log A..HEAD # this will be the commits to send upstream

Если у вас есть коммиты, вы неПри отправке обратно на master, может быть проще отслеживать вещи, если вы перемещаете их в другую ветку и синхронизируете ваш master с upstream / master:

git branch my-stuff-not-sent-upstream
git reset --hard A # will wipe out local changes!
git push origin master -f # can lose history if a shared remote!
git push origin my-stuff-not-sent-upstream

эффективно заменит «master»с "my-stuff-not-sent-upstream" и установите master и origin / master обратно в тот же коммит, что и upstream / master.

1 голос
/ 27 июля 2011

Во-первых, вам нужно добавить апстрим как удаленный.

git remote add upstream https://github.com/upstream/repo.git

Это означает, что у вас есть не только «происхождение» (которое ссылается на ваш собственный клон на стороне GitHub), но и «восходящий поток» (то есть исходное репо, которое вы разветвляли на стороне GitHub).

Затем вам нужно получить исходящие данные и оформить заказ оттуда:

git checkout -b upstream/master

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

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