Невозможно понять ветвь Git, слияние и переустановка

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

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

project 
      | - I
      | - myTeamMate1
      | - myTeamMate2

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

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

project
      | - I - myTeamMate1 - myTeamMate2

Однако я запускаю команду clone для меня и для моего товарища по команде:

git clone <url>

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

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

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

Ответ 1

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

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

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

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

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

    Лучше всего иметь в этом случае 2 ветки:

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

Ответ 2

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

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

Ответ 3

Примеры кода

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

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 может находиться на вашем компьютере, и она не должна находиться на удаленном компьютере. Также может быть удаленной веткой, но это ограничивает ваш рабочий процесс.)


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

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

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 сайте :

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

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

alt text http://dl.getdropbox.com/u/175564/exampleGitProblemSolving.png


Проблема в разграничении и слиянии dotFiles в Mac FileMerge

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

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

git difftool master:README dev:README

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

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

git remote add -f YourUserName [email protected]

Затем вы можете заметить, что вы не можете 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 -repo, например, в Github. Содержимое вашего источника переменной может быть заменено другим удаленным репо. В этом случае я рекомендую вам создать новую переменную

git remote add github [email protected]:myLogin/myProject.git

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

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

git push github master

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

Ответ 4

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

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

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

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