Сообщение Re[2]: Git: спрятанные головы? от 21.01.2015 18:22
Изменено 21.01.2015 18:27 ·
Здравствуйте, Bluebarry, Вы писали:
B>Я существенно продвинулся в изучении гита. Прочитал "Про Гит 2", и еще кучу статей.
B>Большое спасибо всем за ответы. Они мне реально помогли.
B>Я все-таки, прихожу к выводу, что Меркуриал мне для работы удобнее. Так что, Гитом я буду пользоваться только обмена с ГитХабом (или с другими гит-хостингами).
B>Но, вернусь, все-таки, к исходному вопросу.
B>Есть проект, над которым я работаю. У меня два компа — десктоп и лаптоп, на обоих есть клоны этого проекта. Еще один клон проекта находится на флешке.
B>Вот поработал я на десктопе, сделал несколько коммитов. А в поездку взял с собой лаптоп, и тоже сделал несколько коммитов. Все, история разветвилась, но я, возможно, об этом пока не подозреваю.
B>Теперь я хочу перенести все новые коммиты с лаптопа на флешку, причем, на на флешке, возможно уже есть коммиты, сделанные на десктопе. Какой командой это лучше всего сделать?
делаешь "git push". Оно пытается послать новые коммиты лаптопа в "центральный" флешковый репозиторий.
B>Какой командой затем перенести все новые коммиты с флешки на десктоп (на флешке, возможно, раздвоившаяся история)?
"git pull"
B>И как обнаружить это раздвоение истории на десктопе
Просто смотришь разницу истории, например "git log branchX..branchY" — показывает список коммитов, которые есть в Y, но ещё нет в X. И тут четыре комбинации:
B> и гарантированно не потерять лаптопные коммиты?
Потерять коммиты можно только если ты специально их решишь удалить. Для этого нужно выполнить две-три хитрые команды, с хитрыми ключами. Проще сделать "rm -rf /".
B>Другими словами. Я хочу обнаруживать и разруливать конфликты и выполнять мерджи на десктопе в спокойной обстановке. Я не хочу заниматься этим на лаптопе, а также во время переноса данных с компа на флешку и с флешки на комп. И при этом я не хочу свои коммиты.
B>С Меркуриалом все это делается просто.
B>А возможно ли это с Гитом? У меня как-то не получается...
Так, это немножко другой сценарий. Если ты не хочешь делать мержи на лаптопе, то на флешке можно завести специальный лаптопный бранч, в который ты будешь пушить только с лаптопа, поэтому конфликты возникать не должны. Т.е. на лаптопе делаешь "git push <flash_drive_repo> HEAD:laptop_branch". Потом на десктопе делаешь "git fetch <flash_drive_repo> laptop_branch && git merge FETCH_HEAD" — ну и резолвишь конфликты|етс. "git log HEAD..FETCH_HEAD" и "git log FETCH_HEAD..HEAD" выдадут тебе разницу истории как я описал выше.
Интересно, как этот сценарий ты делаешь в hg?
B>Я существенно продвинулся в изучении гита. Прочитал "Про Гит 2", и еще кучу статей.
B>Большое спасибо всем за ответы. Они мне реально помогли.
B>Я все-таки, прихожу к выводу, что Меркуриал мне для работы удобнее. Так что, Гитом я буду пользоваться только обмена с ГитХабом (или с другими гит-хостингами).
B>Но, вернусь, все-таки, к исходному вопросу.
B>Есть проект, над которым я работаю. У меня два компа — десктоп и лаптоп, на обоих есть клоны этого проекта. Еще один клон проекта находится на флешке.
B>Вот поработал я на десктопе, сделал несколько коммитов. А в поездку взял с собой лаптоп, и тоже сделал несколько коммитов. Все, история разветвилась, но я, возможно, об этом пока не подозреваю.
B>Теперь я хочу перенести все новые коммиты с лаптопа на флешку, причем, на на флешке, возможно уже есть коммиты, сделанные на десктопе. Какой командой это лучше всего сделать?
делаешь "git push". Оно пытается послать новые коммиты лаптопа в "центральный" флешковый репозиторий.
- Если флешка не имеет новых коммитов (с десктопа), то команда отработает нормально, произойдёт так называемый fast-forward и на флешке окажутся коммиты лаптопа.
Если флешка имеет новые коммиты (с десктопа), то команда обломится с ошибкой. Значит у тебя развлетвлённая история. Делаешь "git pull", оно скачивает историю с флешки, появляется специальный merge-commit. Возможно будут конфликты, их надо разрешить. Смерженная история — естественно новая версия кода. Поэтому надо её скомпилировать, протестировать, етс. Потом делаешь "git push".
B>Какой командой затем перенести все новые коммиты с флешки на десктоп (на флешке, возможно, раздвоившаяся история)?
"git pull"
B>И как обнаружить это раздвоение истории на десктопе
Просто смотришь разницу истории, например "git log branchX..branchY" — показывает список коммитов, которые есть в Y, но ещё нет в X. И тут четыре комбинации:
- branchA..branchB — пусто, branchB..branchA — пусто => оба брача синхронизированы.
branchA..branchB — не пусто, branchB..branchA — пусто => branchB новее.
branchA..branchB — пусто, branchB..branchA — не пусто => branchA новее.
branchA..branchB — не пусто, branchB..branchA — не пусто => diverged history, нужно явно мержить.
B> и гарантированно не потерять лаптопные коммиты?
Потерять коммиты можно только если ты специально их решишь удалить. Для этого нужно выполнить две-три хитрые команды, с хитрыми ключами. Проще сделать "rm -rf /".
B>Другими словами. Я хочу обнаруживать и разруливать конфликты и выполнять мерджи на десктопе в спокойной обстановке. Я не хочу заниматься этим на лаптопе, а также во время переноса данных с компа на флешку и с флешки на комп. И при этом я не хочу свои коммиты.
B>С Меркуриалом все это делается просто.
B>А возможно ли это с Гитом? У меня как-то не получается...
Так, это немножко другой сценарий. Если ты не хочешь делать мержи на лаптопе, то на флешке можно завести специальный лаптопный бранч, в который ты будешь пушить только с лаптопа, поэтому конфликты возникать не должны. Т.е. на лаптопе делаешь "git push <flash_drive_repo> HEAD:laptop_branch". Потом на десктопе делаешь "git fetch <flash_drive_repo> laptop_branch && git merge FETCH_HEAD" — ну и резолвишь конфликты|етс. "git log HEAD..FETCH_HEAD" и "git log FETCH_HEAD..HEAD" выдадут тебе разницу истории как я описал выше.
Интересно, как этот сценарий ты делаешь в hg?
Re[2]: Git: спрятанные головы?
Здравствуйте, Bluebarry, Вы писали:
B>Я существенно продвинулся в изучении гита. Прочитал "Про Гит 2", и еще кучу статей.
B>Большое спасибо всем за ответы. Они мне реально помогли.
B>Я все-таки, прихожу к выводу, что Меркуриал мне для работы удобнее. Так что, Гитом я буду пользоваться только обмена с ГитХабом (или с другими гит-хостингами).
B>Но, вернусь, все-таки, к исходному вопросу.
B>Есть проект, над которым я работаю. У меня два компа — десктоп и лаптоп, на обоих есть клоны этого проекта. Еще один клон проекта находится на флешке.
B>Вот поработал я на десктопе, сделал несколько коммитов. А в поездку взял с собой лаптоп, и тоже сделал несколько коммитов. Все, история разветвилась, но я, возможно, об этом пока не подозреваю.
B>Теперь я хочу перенести все новые коммиты с лаптопа на флешку, причем, на на флешке, возможно уже есть коммиты, сделанные на десктопе. Какой командой это лучше всего сделать?
делаешь "git push". Оно пытается послать новые коммиты лаптопа в "центральный" флешковый репозиторий.
B>Какой командой затем перенести все новые коммиты с флешки на десктоп (на флешке, возможно, раздвоившаяся история)?
"git pull"
B>И как обнаружить это раздвоение истории на десктопе
Просто смотришь разницу истории, например "git log branchX..branchY" — показывает список коммитов, которые есть в Y, но ещё нет в X. И тут четыре комбинации:
B> и гарантированно не потерять лаптопные коммиты?
Потерять коммиты можно только если ты специально их решишь удалить. Для этого нужно выполнить две-три хитрые команды, с хитрыми ключами. Проще сделать "rm -rf /".
B>Другими словами. Я хочу обнаруживать и разруливать конфликты и выполнять мерджи на десктопе в спокойной обстановке. Я не хочу заниматься этим на лаптопе, а также во время переноса данных с компа на флешку и с флешки на комп. И при этом я не хочу свои коммиты.
B>С Меркуриалом все это делается просто.
B>А возможно ли это с Гитом? У меня как-то не получается...
Так, это немножко другой сценарий. Если ты не хочешь делать мержи на лаптопе, то на флешке можно завести специальный лаптопный бранч, в который ты будешь пушить только с лаптопа, поэтому конфликты возникать не должны. Т.е. на лаптопе делаешь "git push <flash_drive_repo> HEAD:laptop_branch". Потом на десктопе делаешь "git fetch <flash_drive_repo> laptop_branch && git merge FETCH_HEAD" — ну и резолвишь конфликты|етс. Между fetch и merge можешь сделать "git log HEAD..FETCH_HEAD" и "git log FETCH_HEAD..HEAD", чтобы изучить разницу истории, как я описал выше.
Интересно, как этот сценарий ты делаешь в hg?
B>Я существенно продвинулся в изучении гита. Прочитал "Про Гит 2", и еще кучу статей.
B>Большое спасибо всем за ответы. Они мне реально помогли.
B>Я все-таки, прихожу к выводу, что Меркуриал мне для работы удобнее. Так что, Гитом я буду пользоваться только обмена с ГитХабом (или с другими гит-хостингами).
B>Но, вернусь, все-таки, к исходному вопросу.
B>Есть проект, над которым я работаю. У меня два компа — десктоп и лаптоп, на обоих есть клоны этого проекта. Еще один клон проекта находится на флешке.
B>Вот поработал я на десктопе, сделал несколько коммитов. А в поездку взял с собой лаптоп, и тоже сделал несколько коммитов. Все, история разветвилась, но я, возможно, об этом пока не подозреваю.
B>Теперь я хочу перенести все новые коммиты с лаптопа на флешку, причем, на на флешке, возможно уже есть коммиты, сделанные на десктопе. Какой командой это лучше всего сделать?
делаешь "git push". Оно пытается послать новые коммиты лаптопа в "центральный" флешковый репозиторий.
- Если флешка не имеет новых коммитов (с десктопа), то команда отработает нормально, произойдёт так называемый fast-forward и на флешке окажутся коммиты лаптопа.
Если флешка имеет новые коммиты (с десктопа), то команда обломится с ошибкой. Значит у тебя развлетвлённая история. Делаешь "git pull", оно скачивает историю с флешки, появляется специальный merge-commit. Возможно будут конфликты, их надо разрешить. Смерженная история — естественно новая версия кода. Поэтому надо её скомпилировать, протестировать, етс. Потом делаешь "git push".
B>Какой командой затем перенести все новые коммиты с флешки на десктоп (на флешке, возможно, раздвоившаяся история)?
"git pull"
B>И как обнаружить это раздвоение истории на десктопе
Просто смотришь разницу истории, например "git log branchX..branchY" — показывает список коммитов, которые есть в Y, но ещё нет в X. И тут четыре комбинации:
- branchA..branchB — пусто, branchB..branchA — пусто => оба брача синхронизированы.
branchA..branchB — не пусто, branchB..branchA — пусто => branchB новее.
branchA..branchB — пусто, branchB..branchA — не пусто => branchA новее.
branchA..branchB — не пусто, branchB..branchA — не пусто => diverged history, нужно явно мержить.
B> и гарантированно не потерять лаптопные коммиты?
Потерять коммиты можно только если ты специально их решишь удалить. Для этого нужно выполнить две-три хитрые команды, с хитрыми ключами. Проще сделать "rm -rf /".
B>Другими словами. Я хочу обнаруживать и разруливать конфликты и выполнять мерджи на десктопе в спокойной обстановке. Я не хочу заниматься этим на лаптопе, а также во время переноса данных с компа на флешку и с флешки на комп. И при этом я не хочу свои коммиты.
B>С Меркуриалом все это делается просто.
B>А возможно ли это с Гитом? У меня как-то не получается...
Так, это немножко другой сценарий. Если ты не хочешь делать мержи на лаптопе, то на флешке можно завести специальный лаптопный бранч, в который ты будешь пушить только с лаптопа, поэтому конфликты возникать не должны. Т.е. на лаптопе делаешь "git push <flash_drive_repo> HEAD:laptop_branch". Потом на десктопе делаешь "git fetch <flash_drive_repo> laptop_branch && git merge FETCH_HEAD" — ну и резолвишь конфликты|етс. Между fetch и merge можешь сделать "git log HEAD..FETCH_HEAD" и "git log FETCH_HEAD..HEAD", чтобы изучить разницу истории, как я описал выше.
Интересно, как этот сценарий ты делаешь в hg?