Невозможно понять ветку Git, объединить и перебазировать - PullRequest
9 голосов
/ 24 мая 2009

Я знаю поток , который говорит, что rebase предназначен для небольших изменений teamMates, а объединяется для больших изменений.

Я храню три Gits из трех товарищей по команде в следующей структуре каталогов, где у всех нас одинаковый исходный код:

project 
      | - I
      | - myTeamMate1
      | - myTeamMate2

Ветви не в одном Git. Это означает, что я не могу использовать ребаз и слияние. Я использовал vimdiff для синхронизации изменений между teamMates. Однако это отнимает много времени.

Я безуспешно пытался создать следующую структуру каталогов, где все ветви находятся под одним Git:

project
      | - I - myTeamMate1 - myTeamMate2

Тем не менее, я запускаю команду клонирования для себя и для моего партнера по команде:

git clone <url>

и я получаю сообщение об ошибке после запуска второго клона для моего партнера по команде

fatal: destination path 'dotFiles' already exists and is not an empty directory.

Какую структуру каталогов я должен использовать с командой из 3 человек, , чтобы я мог использовать команды rebase и merge?

Ответы [ 4 ]

10 голосов
/ 25 мая 2009

Просто несколько других мыслей, чтобы завершить ответ Самуила.

  • В отличие от SVN, ветви и каталоги в Git совершенно не связаны: наличие 3 филиалов (по одному на каждого члена команды) не означает 3 каталога. Это не то, что вы имели в виду в своем вопросе (поскольку ваши каталоги на самом деле имеют 3 корня для 3 Git-репозиториев), но я предпочитаю упомянуть об этом явно на всякий случай;)

  • Будучи DVCS, эти 3 репозитория могут быть где угодно (не в 3 каталогах на одном компьютере). Если они доступны через UNC-путь (\\desktop\path\to\repo), их можно обозначить как удаленные.

  • Git клон позволяет вам получать ссылки на удаленные ветви, но не создает отслеживание локальных ветвей, позволяющее вам получить работу ваших коллег. Может помочь модуль ruby ​​" Удаленные ветви ".

  • Будьте осторожны с ребазой , поскольку он переписывает SHA-1 вашей ветви (поскольку вы переигрываете свои коммиты поверх другой ветви): если ваши товарищи по команде основывают свои слияния на ваших ветвях, они придется объединять все ваши коммиты каждый раз, даже те, которые уже объединены!
    В этом случае лучше всего иметь 2 ветки:

    • рабочая ветвь , которую вы используете для своей разработки и перебазирования (для интеграции работ ваших коллег, хотя даже эта операция может быть выполнена в своей собственной ветке)
    • a публикует публичную ветку , в которой вы объединяете только свою стабильную работу и которую затем можете использовать другие удаленные репозитории в качестве источника для слияний.
5 голосов
/ 25 мая 2009

Примеры кодов

Для отслеживания удаленной ветки

git remote add -t master Hnr git://github.com/userName/files.git

Это не скачивает вам ветку. Он просто редактирует файл .git / config и добавляет несколько строк, которые сообщают Git, как, где и как получить данные удаленно.

Чтобы получить ветку вашего teamMate, запустите

git fetch Hnr

Чтобы увидеть, что у вас действительно есть ветка teamMates, запустите

git branch -a

или посмотреть только ветки ваших друзей

git branch -r

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

2-й способ получить ветку вашего друга

Однако учтите, что вы можете использовать git-clone для переноса кода вашего друга в отдельный каталог следующим образом

git clone UrlAtGithub

Тогда вы, очевидно, можете использовать Git-remote, как указано выше, чтобы иметь филиал в своем репозитории Git:

git remote add master Hnr PATH/ToYourFriendRepo.git

Вывод: Вы можете использовать два способа получить ветку вашего teamMate для вас, либо с помощью git-clone, либо без него. Оба способа требуют использования git remote add. Преимущество последнего заключается в том, что вам нужно выполнять на одну команду меньше. Первый из них снова дает вам полное репо вашего teamMates на ваш жесткий диск.

Пожалуйста, ознакомьтесь с руководствами Git о том, как вы можете обновлять свои удаленные ветки. (NB удаленная ветвь может быть на вашем компьютере. Она не обязательно должна быть на удаленном компьютере. Ваша ветвь также может быть удаленной, но это ограничивает ваш рабочий процесс.)


Затем вы можете захотеть объединить конкретный файл вашего друга с вашей веткой. В этом случае достаточно знать 5 первых букв коммита вашего друга, чтобы объединить файл.

[Я не уверен, как вы можете сделать следующее:] Вам нужно запустить, например,

git merge 76a32

Вы можете получить следующий вывод

CONFLICT (add/add): Merge conflict in shells/externalPrograms
Auto-merging shells/smallApps/extract
CONFLICT (add/add): Merge conflict in shells/smallApps/extract
Auto-merging shells/smallApps/extract~
CONFLICT (add/add): Merge conflict in shells/smallApps/extract~
Automatic merge failed; fix conflicts and then commit the result.

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

git rebase

и вы получите

shells/smallApps/extract: needs merge
shells/smallApps/extract~: needs merge
cannot rebase: you have unstaged changes

Упражнение 1: Тем не менее, я сейчас застрял, так как мой тиг не показывает коммит моего друга в моем дереве Git. Как вы можете получить коммит 76a32 вашего друга на ваше дерево Git какая ветка находится в вашем Git?


Возможно, теперь вы решили проблему. Проблема была в том, что я игнорировал разрешение конфликтов, о которых Git давал мне уведомления. Google снова сохраняет день на официальном сайте Git :

Если есть конфликты - например, если один и тот же файл изменен в двух разные способы в удаленной ветке и местный филиал - тогда вы предупрежден -

Следующая проблема - очистить проблемные детали и снова объединить. В ваших проблемных файлах вы видите нечто похожее на следующее - получайте удовольствие! (Я наконец дошёл до реальных проблем;)

альтернативный текст http://dl.getdropbox.com/u/175564/exampleGitProblemSolving.png


Проблема с расхождением и слиянием dotFiles в Mac FileMerge

Мне нужно было обновить мой Git, так как только у самого нового Git есть команда difftool. Вы можете найти решение в теме .

Difftool позволяет запускать dotFiles в FileMerge с терминала. Вы не можете получить к ним доступ в графическом интерфейсе. Это работает как

git difftool master:README dev:README

Проблема с вашей учетной записью в Github после добавления новой удаленной учетной записи

Ваша учетная запись Github, возможно, исчезла в .git / config. В этом случае вам нужно запустить следующий код

git remote add -f YourUserName UrlIn@form.git

Затем вы можете заметить, что вы не можете нормально толкать git-push

git push origin master

Вы можете получить следующее сообщение об ошибке

fatal: 'origin' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

Вы также можете попробовать следующие команды для решения проблемы

git push Masi master

и все 3 под 2 перестановки маси, мастера и происхождения. Однако ни одна из команд не сработала.

Упражнение 2 : Как вы можете зафиксировать свою учетную запись github, если у вас есть teamMate в вашем удаленном списке?

Origin - это короткое имя для вашего реального внешнего git-репо, например, на Github. Содержимое вашей переменной происхождения может быть заменено другим удаленным репо. В этом случае я рекомендую вам создать новую переменную

git remote add github git@github.com:myLogin/myProject.git

Обратите внимание, что у вас может быть origin2 вместо github. Origin - это просто соглашение по именованию репо.

Вы можете просто запустить

git push github master

Возможно, в вашем ssh-ключе есть пароль. Если у вас есть, вы можете получить разрешение отказано - предупреждение. Если вы это сделали, см. тему .

5 голосов
/ 24 мая 2009

Тот факт, что они не являются внутри того же самого git , как вы заявляете, никоим образом не ограничивает вас. Git распространяется, что означает, что вы можете выбирать между этими репозиториями, объединять, перебазировать и т. Д.

Посмотрите на git remote --help, чтобы увидеть, как вы можете назвать ваших репозиториев своих товарищей по команде, чтобы вы могли легко импортировать их изменения, перебазировать на них или выполнить слияния . Вам не нужно менять структуру каталогов, ваша идеально подходит для использования.

4 голосов
/ 25 мая 2009

По правде говоря, я начал работать над набором красивого, длинного, подробного ответа ... но мне это уже объяснили гораздо лучше, чем я мог бы http://excess.org/article/2008/07/ogre-git-tutorial/. Он охватывает использование различных веток, пультов и слияние. Это также делается в видеопередаче, так что потратьте час, выпейте кофе и наслаждайтесь лекцией.

Специфично для вашего вопроса: вы не должны использовать настройки каталога. Git не обрабатывает ветвления с каталогами так же, как SVN с папками веток. Ветки в git - это совсем другое. Хотя вы не можете настроить центральный репозиторий (я рекомендую его), вы должны настроить одну master ветку, с которой каждый выполняет свою окончательную, чистую работу.

В одном из моих репозиториев есть скриншот: Wikimedia Commons . В моем примере «бармен» отправляет свой код только в виде фрагментов tar, поэтому я должен импортировать его сам, чтобы управлять им. "master" (показанный здесь только как remotes / elf / master) - это общедоступный репозиторий SVN, который я импортирую, и база изменений изменяется. « autocracy » - моя собственная базовая линия для кода, а « private » - это место, где я храню файл конфигурации с паролями, которыми я хочу управлять, но никогда не публикую. Проверьте отметки времени для частного, и вы заметите, что они не совпадают с ветками ниже. Это потому, что я перебрасываю эту ветвь на «автократию» вместо слияния .

Вы заметите две удаленные ссылки: эльф и бард . Это две мои удаленные машины с программным обеспечением. Я могу толкать и тянуть туда свои ветви, как захочу. В вашем случае у вас будут удаленные репозитории других ваших разработчиков, и они будут изменять свои собственные ветки. Просмотр учебника даст вам лучшее представление о том, как он работает. Удачи:)

...