2009-05-24 6 views
9

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

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

project 
     | - I 
     | - myTeamMate1 
     | - myTeamMate2 

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

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

project 
     | - I - myTeamMate1 - myTeamMate2 

Однако, я бег команды клона для меня и для моего товарища по команде:

git clone <url> 

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

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

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

ответ

10

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

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

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

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

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

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

Я принимаю этот ответ, так как его достаточно «в глубину». Однако, пожалуйста, см. Ответ Самуила и мой ответ о конкретных примерах для решения проблемы. -- Спасибо за ваш ответ! –

+0

@VonC: ** Работает ли модуль ruby ​​«удаленные ветви» в вашем Ubuntu Jaunty? ** Он получает команду 'grb not found' после установки rubygems и всех зависимостей, перечисленных в файле README. –

+0

@Masi, да, он должен (не тестировался напрямую): 'sudo gem install git_remote_branch --include-dependencies' должен делать это, если ваш' $ PATH' ссылается на рубинский 'bin' каталог для скриптов. – VonC

5

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

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

+0

Спасибо за ваш ответ! –

+0

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

+0

Точно. Репозиторий удален, как только он достигнут, локально или удаленно. Eh, вы даже можете назначить свой собственный репозиторий как удаленный, но использование будет очень ограниченным. –

4

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

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

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

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

5

примеры кода

Для отслеживания удаленных филиалов

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

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

Чтобы получить ветвь своего товарища по команде, запустите

git fetch Hnr 

Чтобы увидеть, что у вас действительно есть ваши товарищи по команде филиала, запустить

git branch -a 

или, чтобы видеть только ваши друг ветви

git branch -r 

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

второй способ иметь филиал вашего друга

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

git clone UrlAtGithub 

Затем, вы можете по-видимому, использовать Git-пульт, как описано выше, чтобы иметь филиал в вашем 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?


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

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

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

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


Проблема в сравниваете и слияние точечных файлов в FileMerge Мака

мне нужно обновить Git, так как только новейший Git имеет difftool -command. Вы можете найти решение на thread.

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

git difftool master:README dev:README 

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

Вашего счета GitHub может быть исчезли в .git/конфигурации. В этом случае вам необходимо выполнить следующий код

git remote add -f YourUserName [email protected] 

Вы тогда можете заметить, что вы не можете ГИТ-толчок обычно от

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 перестановки Маси, мастера и происхождения. Однако ни одна из команд не работала.

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

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

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

Обратите внимание, что вы могли бы origin2 в месте GitHub. Происхождение - это просто соглашение об именах репо.

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

git push github master 

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

+0

Некоторые хорошие моменты в вашем собственном ответе, спасибо вам за эту обратную связь. +1 – VonC

+1

Примечание: git merge или git rebase могут дать вам конфликты, как указано здесь (http://stackoverflow.com/questions/457927/git-workflow-and-rebase-vs-merge-questions). Вам нужно решить эти конфликты слияния с помощью хорошего инструмента сравнения: подробнее там (http://stackoverflow.com/questions/861995/is-it-possible-for-git-merge-to-ignore-line-ending- отличия) – VonC

+0

@VonC: Спасибо за советы! - В настоящее время я работаю над тем, чтобы мои программы Mac могли запускаться непосредственно в Zsh. Я заметил, что Mac имеет FileMerge -program по умолчанию. В вашем ответе, похоже, аналогично вашим упомянутым программам. –

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