2014-08-30 2 views
2

Я новичок в git, я следил за этим tutorial.Как работает перезагрузка мастера на «удаленной» локальной ветке?

Я думаю, что я понимаю большую часть этого, пока не добрался до удаленных хранилищ. Единственное понятие о удаленных хранилищах, которые я понял, это git fetch и git remote. Согласно этому учебному пособию, git fetch получает удаленный репозиторий из указанного URL с помощью опции добавления git remote. Он загружает репозиторий в «удаленную» ветвь. Если я правильно понял, это не филиал в удаленном репозитории, а я, который я загрузил из удаленного репозитория. Пока он не является частью моего локального репозитория, он все равно должен быть объединен/скомпенсирован в него (мой локальный репозиторий). Возможно, я ошибаюсь, и я здесь что-то пропустил, пожалуйста, не стесняйтесь меня исправлять.

Теперь, что я чувствую, я вообще не понимаю, как git удается переустановить «удаленный» репозиторий в мой локальный репозиторий.

Я понимаю, что когда я переустанавливаю ветку, она будет основывать коммиты в этой ветви на другую фиксацию того, где она первоначально была разветвлена. Мне все равно нужно объединить ветвь в мою основную ветку. Что на самом деле происходит, когда я это делаю?

git checkout master 
git fetch origin 
git rebase origin/master 

Разве это не приведет к переустановке моей локальной ветви мастера в удаленную ведущую ветвь? Я все время думаю об этом picture.

Вместо функции у меня была бы моя локальная ветвь мастера, а вместо Мастера у меня была бы дистанционная ветвь происхождения/мастера. За исключением того, что Мастер не разветвляет происхождение/мастер.

Разве это не удалит мой локальный мастер? Разве это не переместило бы всю мою работу в «удаленный» репозиторий? Кроме того, мне не нужно объединиться, прежде чем перенаправить его в настоящий удаленный репозиторий?

+1

У вас есть это наоборот. 'git rebase origin/master' заменяет ваши коммиты поверх' origin/master'. – jcm

+0

Вы имеете в виду, что он копирует начало/мастер в мою локальную ветвь мастера и затем добавляет новые коммиты? – MinusFour

+0

Что-то в этом роде. Возможно, вы уже видели их, но я нашел [официальные документы] (ftp://www.kernel.org/pub/software/scm/git/docs/git-rebase.html) полезными. – jcm

ответ

6

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

  • найти коммиты в рамках фиксации графика и
  • только если применимо: переместить ветку так, что он указывает на правильное совершение

Так что, если вы бежите:

git checkout master 
git fetch origin 
git rebase origin/master 

первый шаг получает вас «на мастер филиала»: он просто пишет master в HEAD (и, конечно, обновляет рабочее дерево).

Второй шаг захватывает любые фиксации от origin, которые у вас еще нет. Они входят в ваш репозиторий, увеличивая фиксацию графа и обновляя origin/master, чтобы указать на новейшую фиксацию.Например, вы, возможно, было это перед fetch:

  * - * <-- HEAD=master 
     /
..- o - o   <-- origin/master 

После fetch будет сделано, и ваш ГИТ-Борг добавил origin «s биологические и технологические отчетливость к его собственному, теперь у вас есть:

  * - * <-- HEAD=master 
     /
..- o - o - o  <-- origin/master 

На этом этапе вы можете git rebase ваши две фиксации (заполненные * s) на кончике нового origin/master. Это на самом деле работает, делая копии ваших коммитов: вы получаете два новых, которые делают то же самое, что и старые, но имеют разные идентификаторы родителя: они соединяют новый наконечник origin/master вместо старого (pre- fetch) наконечник. После создания копий git rebase настраивает вашу ветку master, чтобы указать на новую максимальную фиксацию.

(И, в соответствии с темой Borg, ваши оригинальные фиксаций являются еще в вашем хранилище. Они в конечном итоге получить отбрасываются, как только reflog записи истекает, в течение 30 дней по умолчанию.)


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

Точнее, он пишет ref: refs/heads/master в .git/HEAD. Это то, что нужно, чтобы быть «на ветке»: полное имя ветки идет в этом файле плюс префикс «ref: (пробел)».

+0

+1, отчасти за замечание разницы между ветвями и коммитами, частично для хороших графиков фиксации ASCII, в основном для ассимиляции git –

+0

Спасибо за объяснение! Не могли бы вы подробнее остановиться на следующем: «После создания копий git rebase настраивает ваш мастер ветвей, чтобы указать на новый наконечник. Разве нет ничего на хозяине локального филиала после перезагрузки? Разве коммиты не переместились к кончику новоиспеченного происхождения/мастера? – MinusFour

+0

@MinusFour: вы можете посмотреть некоторые из моих других ответов, например http://stackoverflow.com/a/25222144/1256452, где я показываю, что старые «заброшенные» коммиты все еще находятся в репо и могут быть восстановлены до тех пор, пока вы можете найти способ их назвать. Кроме того, ищите ответы, где я говорю о том, как ветви «автоматически перемещаются вперед», например, http://stackoverflow.com/a/21055585/1256452 ... в этом случае вы не «на» «origin/master» (вы не можете быть), чтобы он * не * двигался. – torek

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

  • Нет связанных вопросов^_^