Прочный (libgit2) этап для индекса
Глядя на указатель (после звонка merge_commits
между мастером и веткой), я вижу 3 результата для того же файла,
{:path=>"file.txt", :oid=>"c6fdbacd7400805042668f4ccf70fc1ebbdac361", :dev=>0, :ino=>0, :mode=>33188, :gid=>0, :uid=>0, :file_size=>0, :valid=>false, :stage=>1, :ctime=>1969-12-31 19:00:00 -0500, :mtime=>1969-12-31 19:00:00 -0500}
{:path=>"file.txt", :oid=>"0838a4be16d19278e1e549614ffd2b6759549185", :dev=>0, :ino=>0, :mode=>33188, :gid=>0, :uid=>0, :file_size=>0, :valid=>false, :stage=>2, :ctime=>1969-12-31 19:00:00 -0500, :mtime=>1969-12-31 19:00:00 -0500}
{:path=>"file.txt", :oid=>"4bd2639f786bef1000dad7d59c6779a4e99fb27c", :dev=>0, :ino=>0, :mode=>33188, :gid=>0, :uid=>0, :file_size=>0, :valid=>false, :stage=>3, :ctime=>1969-12-31 19:00:00 -0500, :mtime=>1969-12-31 19:00:00 -0500}
Мое понимание, глядя на содержание каждого из них, заключается в том, что этап 3 является наиболее "недавним / продвинутым" изменением, но может ли кто-нибудь объяснить концепцию этих этапов и нумерацию? И этап 0 отсутствует, потому что есть изменения в этом файле, которые не передаются?
2 ответа
Я не знаком с libgit2, но ненулевые этапы в файлах индекса git предназначены для разрешения конфликтов слияния.
Пока конфликт не будет решен, для одного имени пути будет до трех записей, как описано в gitrevisions
документация:
Двоеточие, за которым необязательно следует номер этапа (от 0 до 3), и двоеточие, за которым следует путь, именует объект BLOB-объекта в индексе по указанному пути. Отсутствующий номер этапа (и двоеточие, следующее за ним) именует запись этапа 0. Во время объединения стадия 1 является общим предком, стадия 2 является версией целевой ветви (обычно текущей ветвью), а стадия 3 является версией из ветви, которая объединяется.
Если конфликт слияния вызван удалением (т. Е. Файл существует у общего предка, но отсутствует в одной ветви и изменен в другой), будет только один из этапов 2 или 3; если это происходит из-за создания (файл не существует у общего предка, но был создан в обеих ветвях), запись стадии 1 не будет. (Я не уверен, что рассмотрел все случаи, когда здесь было менее 3 записей.)
Прежде чем вы сможете завершить и зафиксировать объединение, вы должны заменить ненулевые записи этапа одной записью этапа 0.
Когда вы делаете слияние, git нуждается в изменениях в каждой подсказке от базовой версии. Индекс записывает идентификатор базовой версии и oid каждой версии подсказки: 1 (базовая) 2 ("наша"), 3 ("их"). Запись идентификаторов контента позволяет вам повторно запускать diff-файлы при различных параметрах (например, чтобы получать отчеты о конфликтах 3-diff или игнорировать изменения пробелов) по мере необходимости. Этап 0 предназначен для разрешенного контента, контента без слияния в полете.