Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Коммит — это патч. Все. Он перечисляет некоторые изменения в некоторых файлах в формате «единого diff-а». [...] История Git — это очень длинная цепочка инструкций для пересоздания кодовой базы с нуля, шаг за шагом. Представь это как стопку патчей, [...] В общем, да, но также они буквально являются SHA-1-хэшами патча, включая заголовки.
The major difference between Git and any other VCS (Subversion and friends included) is the way Git thinks about its data. Conceptually, most other systems store information as a list of file-based changes. [...] Git doesn’t think of or store its data this way. Instead, Git thinks of its data more like a set of snapshots of a miniature filesystem. Every time you commit, or save the state of your project in Git, it basically takes a picture of what all your files look like at that moment and stores a reference to that snapshot.
С технической точки зрения, вы, скорее всего, правы насчёт природы коммитов
Однако, семантика использования (за исключением rebase) больше всего напоминает набор патчей.
когда возникают проблемы, переучивать
Никогда не занимались рефакторингом? Или вы всегда и сразу строите безупречную и полную модель бизнесс процессов?
или введения вас в git
размазать достаточно Git-а по твоему лицунет, спасибо :)
… Когда они впервые скачивают код, они могут привязать его к директории под названием master (потому что это мастер-копия). Затем, когда они приступают к работе над своим драйвером, они могут все это полностью скопировать в директорию под названием ужасный-драйвер-broadcom. Чтобы сгенерировать патч, им нужно просто получить разницу между этими двумя директориями.
Лучшим по тем критериям, что ничего лучше в опенсорсе на тот момент не было.
Не должна система контроля версий автоматически утрачивать такую важную часть метаданных, как ветка, в которую сделан коммит.
Но после обновления выходит, что уже есть 3 версии: локальная, та которая push и обновленный репозиторий. Сидишь, думаешь, с чем сливать.
эээ… ТРИ версии? откуда?
<<<
/>>>
, то используйте другой mergetool (см. git help mergetool
и git help config
, во втором искать mergetool
).git branch -f branch origin/branch
. Но не всегда это легко. git reflog
вам поможет.Если удаленная версия изменилась, то, как я понимаю, Git заставляет её взять начала.
git reset
. Но я предпочитаю просто работать с ветками‐закладками, которые трогаю только я, потому с такой ситуацией практически не сталкиваюсь. Но, насколько я помню, автослияние только при pull, а с push такого быть не должно. Если после push идёт автослияние, то вам поможет только push -f {remote} {old-commit-hash}:{branch-name}
, если я правильно понимаю (точнее, вам точно нужен push -f
, но не уверен, что он примет {old-commit-hash}
: если нет, то придётся использовать ещё и branch -f {branch-name} {old-commit-hash}
, предварительно слиняв с ветки или тот же reset
(что проще: линять с ветки не нужно)).reset
. Помните, что под «откатом» в git имеется ввиду исключительно перемещение закладок: само изменение никуда не денется, просто на него после отката перестанут ссылаться, а через некоторое время оно будет удалено сборщиком мусора. Поэтому в особо сложных случаях можно «откатывать» через branch -f {branch-name} {commit-hash}
, восстанавливая изменения в рабочем каталоге через checkout {removed-commit-hash} -- '*'
. Предварительно сделав checkout --detach
и в конце не забыв checkout {branch-name}
.точнее, вам точно нужен push -f
Предварительно сделав checkout --detach
gitk --all
?
git log --all --oneline --graph --decorate
на «худой конец»?push -f
лучше забыть. Версия Б находится локально в виде изменения и изменить её нельзя никак, но можно создать версию Г, что‐то сделав (rebase, к примеру) из Б и обычно этот вариант считают изменённой версией Б (знание о том, что версия Б не изменилась и никуда не делась пригодиться, если вы где‐то накосячили — Б можно добыть из reflog). Я предлагаю следующее:git stash
— фиксирую версию А в специальном изменении, которое никуда не push’ится. Достаётся с помощью git stash apply
, при этом происходит аналог rebase. Это лучше вообще делать до pull, если вы хотите нормально работать с Б.Чисто для красоты дерева коммитов что ли?!
Применений много.
На всякий случай уточню: в git ведь не обязательно для актуализации с мастером (при длительной разработке) делать ребэйсы?
Просто можно время от времени смерживать актуальные изменения?
Git мне чем-то напоминает регулярные выражения. Когда понимаешь, как он работает, ты можешь делать все, что угодно очень легко и изящно.
git commit
. Просто как и с git checkout -b
налицо прямое нарушение принципа разделения обязанностей: git commit --all
с какой‐то радости что‐то делает с индексом (для чего есть тот же git add
), git checkout -b
с какой‐то радости создаёт новую закладку (для чего есть git branch
).git commit-tree
), но «спуск на уровень ниже» ≠ «нахождению другого способа что‐то сделать». В некоторой степени пару git add && git commit
можно рассматривать как что‐то на уровень ниже git commit --all
. Или, скорее, второе как alias первого.commit
(т.е. то же, что и через командную строку). hg …
— тоже официальный внешний API, как и command server (преимущества command server — нужен один fork+exec и одна инициализация Python). А внутренний только для дополнений, остальное на свой страх и риск.Отсоединенный коммит получить не просто, а очень просто.
Да, с помощью командной строки, рефлога и какой-то матери все можно вернуть до сборки мусора
gc.pruneExpire
в git help config
).Напоминаю, что по умолчанию рефлоги хранятся и не трогаются сборщиком мусора аж 90 дней.
С трудом представляю себе ситуацию, когда программист пишет код, коммитит его в виде отсоединенного коммита — и забывает про него на 3 месяца, после чего жалуется что гит плохой :)
git bisect
и начали исправлять проблему, не сделав git bisect reset
. Решили поработать в «ветке» origin/master
вместо master
. Решили посмотреть «как оно там в изменении deadbeef» и забыли сделать checkout обратно в ветку. Решили поработать в «ветке» pulls/42/head
. Я такого уже почти никогда не допускаю, но «прострелить себе ногу» вполне можно.HEAD@{1}
, а создавать имена для веток не всегда охота: получается что‐то вроде временных веток для простых (т.е. не требующих прогона тестов) изменений вроде изменений в документации.)git help bisect
(кстати, слово «detached» здесь нигде не упоминается). Кстати, git checkout -b branch
во многих случаях не является правильным способом решить проблему: в случае того же bisect вы вполне можете хотеть зафиксировать изменение в какой‐то существующей ветке‐закладке. И почти наверняка хотите иметь какую‐то закладку в качестве родителя, а не изменение где‐то посередине. И проще всего первое делать через stash→checkout→stash apply (второе, впрочем, через checkout -b→rebase). Впрочем, это неважно, т.к. вместо большого предупреждения при commit вы получите просто [detached HEAD {hash}] msg…
на первой строке из трёх.А то, что Git при этом стал более популярным только говорит в его пользу.
Git — работа с ветками очень легкая, гибкая и простая
Я не знаю как они работают, но пользователи Mercurial рассказывали мне, что это такая боль в заднице, что никто на самом деле их больше не использует.
git log --graph --oneline
* c43413e Merged: fixed: #644: Ошибка при рассылке e-mail.
|\
| * e25152f fixed: #644: Ошибка при рассылке e-mail.
| * edbbd74 issue #644: improve: tests: add TMailSender.InitService[Params] tests
| * 2befdc3 fixed: tests: fake SMTP-server: possible "stream is closed" error
| * 266c11c refactoring: tests: fake SMTP-server: add a space
| * 8d1b795 refactoring: tests: fake SMTP-server: log incoming request BEFORE its processing
| * ebcb002 issue #644: refactoring: tests: fake SMTP-server: add tests
| * 30157bf issue #644: refactoring: tests: fake SMTP-server: rename authenticator classes
| * 6dbd039 issue #644: refactoring: tests: fake SMTP-server: lib/auth: introduce SMTP module
|/
* c096916 fixed: #472: Ошибка при установке АС.
* c5d7dee Merged: issue #644: improve: tests: добавить тестовыe SMTP-серверы с LOGIN-аутентификацией
|\
| * b2b96c7 issue #644: improve: tests: добавить тестовыe SMTP-серверы с LOGIN-аутентификацией
| * 6909136 issue #644: fixed: tests: тестовый SMTP-server PLAIN не работает, если параметр задавать позже
| * cb12e39 issue #644: refactoring: tests: fake SMTP-server
| * 4cafc56 issue #644: fixed: tests: тестовый SMTP-сервер с PLAIN аутентификацией "пускает" с пустыми логином и паролем
| * 905d7d6 issue #644: improve: tests: fake SMTP-servers: добавить ключ запуска --extend-with-shutdown
| * d96eef1 issue #644: improve: tests: fake SMTP-servers: добавить ключ запуска --debug
| * c96652f issue #644: improve: introduce EUnknownMessageSenderException
| * fdc3693 issue #644: tests: fake SMTP-server: уточнить текст ошибки при неверном методе аутентификации
| * af2375e issue #644: refactoring: tests: fake SMTP-server: rename classes (remove "T" prefix)
| * 577ed4b issue #644: improve: tests: avoid processor load
| * a45a153 issue #644: refactoring: tests: fake SMTP-server: add module SMTP
|/
* 8baa7d6 refactoring: tests: avoid compiler warning
* 87913f6 issues #624, #625, #637: rake: add "prepare:accompanies:mail:..." tasks
* 4a44395 Merged: fixed: #643: Пропала компенсация из списка.
|\
| * 02065f2 fixed: #643: Пропала компенсация из списка.
| * 7be70bd issues #607, #643: improve: добавить скрипт для анонимизации БД
|/
* 206e9d3 Merged: refactoring: update lib/CF, lib/Common
|\
| * aa2035b refactoring: update lib/CF, lib/Common
| * 7c90634 fixed: TUpdater зависает, если при вызове .Start происходит исключение
| * b55d639 refactoring: убрать директивы условной компиляции Indep и AladdinSupport
| * ba54807 refactoring: убрать директиву условной компиляции ASK_GROUP_SAVE
|/
* 188a580 refactoring: tests: use const keyword for string parameters
* bb51653 fixed: tests: `TTestTimeoutsSetup` is shown as `imeouts`
git log --graph --decorate
* commit c43413eb9199a3797157d821a366f051e8703758 (HEAD -> devel, tag: v3.0.157, origin/branch-v3.0)
|\ Merge: c096916 e25152f
| | Author: ***Developer***
| | Date: Thu Oct 22 11:19:45 2015 +0300
| |
| | Merged: fixed: #644: Ошибка при рассылке e-mail.
| |
| * commit e25152f57a18d25dff44d06858bc46ceb0c77ac0
| | Author: ***Developer***
| | Date: Thu Oct 22 11:19:23 2015 +0300
| |
| | fixed: #644: Ошибка при рассылке e-mail.
| |
| | При рассылке e-mail используется тип авторизации AutoSelect, что значит,
| | что авторизация БУДЕТ выполняться, если сервер её поддерживает, даже
| | если логин/пароль не заданы.
| | До сих пор это работало. Пока не появился клиент с сервером, который
| | поддерживает и авторизацию, и анонимную рассылку, и этот сервер постоянно
| | запрашивает имя пользователя (которое не задано, т.к. пользователь
| | знает, что сервер может рассылать и анонимно)
| | (см. 6909136 (issue #644: fixed: tests: тестовый SMTP-server PLAIN не
| | работает, если параметр задавать позже, 2015-10-19)).
| |
| | Доработаем АС так, что он при будет пытаться авторизоваться на
| | SMTP-сервере (с типом AutoSelect), только если задан логин.
| |
| | З.Ы. А в тестах нужно доработать SMTP-серверы так, чтобы они
| | обрабатывали аутентификацию одной сессии за раз, и могли поддерживать и
| | анонимную рассылку тоже (по флагу).
| |
| * commit edbbd74f03550a6a47560ecc59a1c848cab817f5
| | Author: ***Developer***
| | Date: Wed Oct 21 18:46:59 2015 +0300
| |
| | issue #644: improve: tests: add TMailSender.InitService[Params] tests
| |
| * commit 2befdc3a7325bc71dfd10b3760ce58952bdd3b3b
| | Author: ***Developer***
| | Date: Wed Oct 21 17:51:34 2015 +0300
| |
| | fixed: tests: fake SMTP-server: possible "stream is closed" error
| |
| | Обычно выход из цикла обработки входящих команд происходит по команде,
| | но может и по закрытию потока. Однако, в этом случае запись в поток
| | вызовет ошибку, чего нам не надо.
| |
| | Будем проверять поток на закрытие перед попыткой в него писать.
| |
| * commit 266c11c41563022386bd2a78a3ef8d5c48196604
| | Author: ***Developer***
| | Date: Wed Oct 21 17:50:13 2015 +0300
| |
| | refactoring: tests: fake SMTP-server: add a space
| |
| * commit 8d1b795c5aece2d463e97c26963d801a1a4420d7
| | Author: ***Developer***
| | Date: Wed Oct 21 17:49:12 2015 +0300
| |
| | refactoring: tests: fake SMTP-server: log incoming request BEFORE its processing
| |
| * commit ebcb00245337614cca4ad2a38b88102c42a4f7d5
| | Author: ***Developer***
| | Date: Tue Oct 20 14:49:47 2015 +0300
| |
| | issue #644: refactoring: tests: fake SMTP-server: add tests
| |
| | Add missing tests.
| |
| * commit 30157bf5a02e4da8a3939353e5de225ee77171dd
| | Author: ***Developer***
| | Date: Tue Oct 20 14:37:42 2015 +0300
| |
| | issue #644: refactoring: tests: fake SMTP-server: rename authenticator classes
| |
| | Remove "T"-prefix.
| |
| * commit 6dbd039f033f80d7dda5e8b14a77affb5b973802
|/ Author: ***Developer***
| Date: Tue Oct 20 14:33:00 2015 +0300
|
| issue #644: refactoring: tests: fake SMTP-server: lib/auth: introduce SMTP module
|
* commit c096916c2fa92ac02a883f6f60e4393d1abaaee3 (tag: v3.0.156)
| Author: ***Developer***
| Date: Wed Oct 21 14:13:32 2015 +0300
|
| fixed: #472: Ошибка при установке ...
|
| Решили усложнить пароль для пользователя "..." при установке MS
| SQL-сервера, т.к. на серверах часто включены политики сложного пароля.
|
| Пароль "...." вполне удовлетворяет самым строгим политикам.
|
* commit c5d7dee3bbba6538b9d844bb47709889e2ca3021
|\ Merge: 8baa7d6 b2b96c7
| | Author: ***Developer***
| | Date: Mon Oct 19 15:37:14 2015 +0300
| |
| | Merged: issue #644: improve: tests: добавить тестовыe SMTP-серверы с LOGIN-аутентификацией
| |
| * commit b2b96c7a3ac662fe50ad9787fa6d85fdfc04e110
| | Author: ***Developer***
| | Date: Mon Oct 19 15:35:59 2015 +0300
| |
| | issue #644: improve: tests: добавить тестовыe SMTP-серверы с LOGIN-аутентификацией
| |
| | Один из них симулирует поведение сервера, который в ответ на MAIL FROM
| | выдаёт 334 Password: при попытке анонимной отправки.
| |
| * commit 69091362a1bba12c8f2f06e18a6a1a2e8b11e270
| | Author: ***Developer***
| | Date: Mon Oct 19 13:14:06 2015 +0300
| |
| | issue #644: fixed: tests: тестовый SMTP-server PLAIN не работает, если параметр задавать позже
| |
| | Сервер с PLAIN аутентификацией работает, только если использовать
| | параметр во время команды
| | AUTH PLAIN <...>
| | 235 Authentication successful
| |
| | но НЕ если захотим использовать схему
| | AUTH PLAIN
| | 334
| | <...>
| | 235 Authentication successful
| |
| | И хотя наш SMTP-клиент использует первый вариант, исправим это, т.к.
| | дальше мы добавим LOGIN-аутентификацию, которая работает по похожей
| | схеме.
| | Заодно уберём текст "Username:" в ответе 334.
| |
| * commit cb12e395078cbeee22d5c492d98a5bf90b0fa4eb
| | Author: ***Developer***
| | Date: Fri Oct 16 17:32:24 2015 +0300
| |
| | issue #644: refactoring: tests: fake SMTP-server
| |
| | Rename @pass to @password. Initialize @login and @password.
| |
| * commit 4cafc56b15cdb287e3c6c6869ed0dccdff2caf9e
| | Author: ***Developer***
| | Date: Fri Oct 16 15:23:40 2015 +0300
| |
| | issue #644: fixed: tests: тестовый SMTP-сервер с PLAIN аутентификацией "пускает" с пустыми логином и паролем
| |
| | Хотя не должен, должен пускать с непустым логином (и, как и раньше,
| | паролем, равным логину).
| |
| * commit 905d7d6103bde4f37ec446f8f5c1f95b49103c5f
| | Author: ***Developer***
| | Date: Mon Oct 19 12:20:50 2015 +0300
| |
| | issue #644: improve: tests: fake SMTP-servers: добавить ключ запуска
| | --extend-with-shutdown
| |
| | В тестах используется команда SHUTDOWN, которая завершает работу сервера
| | (чтобы не приходилось "прибивать" процессы). Клиент посылает, а сервер
| | корректно обрабатывает эту команду.
| | Однако, иногда приходится запускать скрипт smtp-server.rb "вручную", и
| | тогда не очень нужно, чтобы серверы завершали работу после "прогона"
| | тестов.
| | Так что сделаем опцией команду SHUTDOWN.
| |
| * commit d96eef1a70633e28e249a1011ee686b94b368f79
| | Author: ***Developer***
| | Date: Fri Oct 16 15:24:59 2015 +0300
| |
| | issue #644: improve: tests: fake SMTP-servers: добавить ключ запуска --debug
| |
| * commit c96652fb687c17744e50ba5d1f60d987717fdc5d
| | Author: ***Developer***
| | Date: Mon Oct 19 13:56:26 2015 +0300
| |
| | issue #644: improve: introduce EUnknownMessageSenderException
| |
| | В тестах нужно определять, что ошибка неизвестная, а та же
| | EAuthSenderException, например, - наследник от EMessageSenderException,
| | что не даёт уверенности, что возникла не она. Поэтому нужно ввести
| | специальный тип исключения - EUnknownMessageSenderException.
| |
| * commit fdc3693263f1768ef62d037850f50f304ded71a6
| | Author: ***Developer***
| | Date: Fri Oct 16 14:44:44 2015 +0300
| |
| | issue #644: tests: fake SMTP-server: уточнить текст ошибки при неверном методе аутентификации
| |
| | При неверном методе аутентификации выдаётся ошибка с текстом "Unknown
| | command", хотя лучше выдавать "Unknown authentication type".
| |
| * commit af2375ea04e4d51494bb352a40ef77a60e0fe2bf
| | Author: ***Developer***
| | Date: Mon Oct 19 12:00:18 2015 +0300
| |
| | issue #644: refactoring: tests: fake SMTP-server: rename classes (remove "T" prefix)
| |
| * commit 577ed4b4b173a30ff13e2a97ebc0b3d37f12311e
| | Author: ***Developer***
| | Date: Mon Oct 19 12:58:57 2015 +0300
| |
| | issue #644: improve: tests: avoid processor load
| |
| | Sleep in a loop
| |
| * commit a45a1536176b30801ac2820b2e9403bb3fd8b1af
|/ Author: ***Developer***
| Date: Mon Oct 19 11:54:55 2015 +0300
|
| issue #644: refactoring: tests: fake SMTP-server: add module SMTP
|
* commit 8baa7d698231cbb880a2ab5ed54e721ad270268f
| Author: ***Developer***
| Date: Mon Oct 19 15:30:44 2015 +0300
|
| refactoring: tests: avoid compiler warning
|
* commit 87913f6f4263d02bb3456d6ebeba39d6b6fa1d1f
| Author: ***Developer***
| Date: Tue Oct 6 12:53:30 2015 +0300
|
| issues #624, #625, #637: rake: add "prepare:accompanies:mail:..." tasks
|
| Google Mail не позволяет отсылать исполняемые и командные файлы даже в
| .zip-архивах. Поэтому их нужно переименовывать, добавляя, например, знак
| подчёркивания суффиксом. Автоматизируем это.
|
* commit 4a443957ef3b946a76876335d4fe4ef3de961d69 (tag: v3.0.155)
|\ Merge: 206e9d3 02065f2
| | Author: ***Developer***
| | Date: Tue Oct 13 15:19:01 2015 +0300
| |
| | Merged: fixed: #643: Пропала компенсация из списка.
| |
| * commit 02065f2756b834507961a57cc68e8d1951e4a9e0
| | Author: ***Developer***
| | Date: Tue Oct 13 12:52:40 2015 +0300
| |
| | fixed: #643: Пропала компенсация из списка.
| |
| | Если при добавлении/редактировании компенсации её название совпадёт с
| | наименованием НАЧИСЛЕНИЯ, и после сообщения об ошибке об этом исправить
| | название компенсации и сохранить её, то она "пропадёт" из дерева
| | компенсаций.
| | Происходит это потому, что при проверке на дубликат названия, получается
| | и тип этого дубликата (если он есть), и тип компенсации ошибочно
| | изменяется на этот тип, что сказывается при её сохранении.
| |
| | Исправим это, не изменяя тип компенсации при проверке на дубликат.
| |
| * commit 7be70bd51a2d35280fb64519e3c79f6f62a64497
|/ Author: ***Developer***
| Date: Wed Jun 3 11:05:16 2015 +0200
|
| issues #607, #643: improve: добавить скрипт для анонимизации БД
|
| Некоторые абоненты не хотят давать БД по соображениям конфиденциальности
| Таким мы можем предложить следующий скрипт, который преобразовывает
| имена абонетов и групп в имя вида Contractor/Group-<ID>-<номер_телефона>
|
| UPDATE c
| SET ....
| FROM dbo.b_Co....
| LEFT JOIN dbo.Vi....
| ON t.ID_....
|
* commit 206e9d33703cd997d277a5f10e37f122757b976e
|\ Merge: 188a580 aa2035b
| | Author: ***Developer***
| | Date: Tue Oct 13 15:17:53 2015 +0300
| |
| | Merged: refactoring: update lib/CF, lib/Common
| |
| * commit aa2035b9dadaa86e16c7b687382f0ad629f5c624
| | Author: ***Developer***
| | Date: Thu Oct 8 15:20:02 2015 +0300
| |
| | refactoring: update lib/CF, lib/Common
| |
| | Модули CF, Common обновлены: добавлены директивый условной компиляции
| | URLREADER_USE_PROXY и URLREADER_USE_BASEUNIT.
| |
| | И т.к. мы всегда используем XMLHTTPRequest, то флаг не нужен.
| |
| | Submodule lib/CF 038eab1..c80a287:
| | > refactoring: avoid BaseUnit dependency
| | Submodule lib/Common 580a371..895856f:
| | > improve: introduce TInternetOpenClient class
| | > refactoring: removed commented code
| |
| * commit 7c9063457fc9c5f4d27e490fabcee183359c92cf
| | Author: ***Developer***
| | Date: Tue Oct 13 13:46:39 2015 +0300
| |
| | fixed: TUpdater зависает, если при вызове .Start происходит исключение
| |
| | В деструкторе ожидается обнуление FCurrent, однако, если при Start
| | вызовется исключение, отчего не вызовется FreeOnTerminatе, который
| | вызывает FreeCurrent, то деструктор "повиснет" в бесконечном цикле.
| |
...
---cut---
prepare-commit-msg
hook'у, как, собственно, у меня и происходит (Вы же не думаете, что я каждый раз при закрытии задачи её ID и summary пишу руками?)prepare-commit-msg
hook оказался бы совершенно бесполезен: commit message я предпочитаю писать в том же редакторе, что и код, а не запускать git commit
(редактор потом запустит git commit -m
или git commit -f
). Если нужно что‐то вставлять туда автоматически и всегда, то нужно использовать не prepare-
, а просто commit-msg
.«refactoring: убрать директивы условной компиляции Indep и AladdinSupport»
Переход на задачу — в один клик по номеру задачи.
А комменты вроде:
«refactoring: убрать директивы условной компиляции Indep и AladdinSupport»
и так очевидны из диффа.
задачи в issue tracker'е могут быть долгоживущими
кстати, у вас к комментам задачи добавляется связь с коммитом репозитория?
у нас бы завели задачу и сделали бы один коммит по одной задаче. Тогда у другого разработчика не возникло бы вопросов о том, зачем убрали одни атрибуты и добавили другие. Сейчас для этого требуется Ваше пояснение.
А комменты вроде:
«refactoring: убрать директивы условной компиляции Indep и AladdinSupport»
и так очевидны из диффа.
-DFirstConditionalDefine;SecondConditionalDefine;...
Понимаю, что сейчас минусов нахватаю за не популярную точку зрения :(Я предпочитаю не ставить минусы за непопулярную точку зрения.
для Mercurial существует (хоть и не релизнут) плагин
править историю в хвост и в гриву без оглядки на коллег и чтобы вам за это ничего не было
История должна отражать, кто и что сделал. А как он это делал — не должна.
Возможно вам (и всем остальным интересно знать), что вот пароль добавлен в историю, а вот он из нее удален
Есть хитрая политика мерджа, которую могут нарушать
Вам нужно проследить то место, где этот код появился и кто его изначально написал.
Есть хитрая политика мерджа, которую могут нарушать
На мой взгляд, это уже проблема.
Информация, кто код написал, в гите есть. А вот зачем мне место, где код появился — я и правда не очень знаю.
Это реальная жизнь больших компаний и больших проектов с распределёнными командами.
Чтобы понять зачем эта строчка нужна вам нужно проследить откуда она появилась и просмотреть на весь ченджсет с которым она пришла.
На больших проектах исследование истории может дать очень много информации
Но вот зачем знать именно ветку, в которой это было — не очень
например ветки это задачи в TM.
А ещё можно посмотреть все изменения в ветке до её слияния
git blame
показывает «правильный» коммит для каждой строчки, а затем (благодаря тому, что коммит хранит ссылку на родителя), можно пройти от этого коммита назад (да и вперед) по истории.Но вот зачем знать именно ветку, в которой это было — не очень.
А в гите (при fast-forward) вообще может не быть информации, что ветка создавалась.
git merge --no-ff
при fast-forward
прав был наш интернет-обму…омбудсмен, когда говорил, что программистов можно будет заменить компьютером
Какие конкретно изменения в Git за последние 6 лет помогают предупредить/предотвратить перезаписывание уже опубликованных коммитов?
этого недостаточно.
git push -f
. Этого тоже недостаточно?Затем, когда они приступают к работе над своим драйвером, они могут все это полностью скопировать в директорию под названием ужасный-драйвер-broadcom.
Моё мнение: beta release ответвляется от мастера (trunk = master) каждый раз, когда проект подходит к очередному релизу. release candidate – состояние ветки beta release, а не отдельная ветка.
Имел ввиду, что перед каждой задачей, нужно ответвляться?
В транке могут делаться тяжелые задачи
При переключении локальных веток сначала как бы откатываются коммиты текущей ветки до последнего общего коммита ветки на которую переключаешься, а потом накатываются её коммиты.
можно комитить все что захочешь в контексте своей ветки, вот в паблик что-то неработающее отдавать нельзя да, при этом при сливе своей ветке в общую всегда можно все коммиты объеденить например в один, если хочется.
Идея умерла в муках, когда оказалось, что конфликт, единожды разрешённый при merge --squash, требуется разрешать снова и снова при каждом последующем слиянии между эти двумя ветками. То же самое относится и к git cherry-pick.
Всякие идеи о том, что разработчик может зачекаутить проект с сабмодулями, внести изменения в один из модулей, исправить баг во втором, а потом засунуть всё это обратно на сервер, надо сразу отбросить, потому что git submodules не предоставляет вам ничего. Ссылки на сабрепы не трекают ветви (вернее, трекают на уровне default pull/push, но эта привязка никак не сохраняется на сервере); git commit толком не умеет обнаруживать изменения в сабмодулях;
Коммитить недоделанные вещи, потому что вы собрались в командировку или в отпуск, вам категорически не рекомендуется. Любая тестовая правка «туда-обратно» непременно потом вылезет на git blame, даже если в итоге ничего не изменилось; редактирование истории выходит себе дороже
вот черт, github не разрешает регистрировать funny_guy из-за подчеркивания ((git clone https://github.com/funny_guy/just_for_lulz_code
В слиянии твоя ветка «наша», а чужая ветка — «их». Но в перемещении все наоборот — ты начинаешь с чужой ветки и заново добавляешь свои собственные коммиты поверх нее, даже если ты думал, что перемещал свою текущую ветку. Поэтому с точки зрения Git, твоя ветка «их», а чужая ветка — «наша»!не сразу понял, что это mine и theirs. Может стоит вписать в статью? Так как все diff-tool (по крайней мере, которыми я пользовался) пишут именно так.
Статья хорошая, но есть пара "но":
Достаточно Git-а, чтобы быть (менее) опасным