git Пример создания двух веток - с разными изменениями для теста объединения, без конфликта. Тестовый репозиторий

Задача

Создать ситуацию, когда мы после какой-то истории ответвились от основной витке, создали коммит в новой ветке и параллельно за это время кто-то поправил основную. В нашем примере будет участвовать один текстовый файл somefie.txt

Т.е. такие шаги:

  1. До ответвления в файле имеем:
    Строка 1
    Строка 2
    
  2. В новой ветке добавляем еще одну строку:

    Строка 1
    Строка 2
    Строка 3
    
  3. И "параллельно" в основной ветке меняем первую строку:
    Строка первая
    Строка 2
    

-- таким образом здесь перед слиянием (любым способом) у нас будет по одному не общему коммиту в каждой из двух веток.

Делаем

Посмотрим на практике:

  1. Создаем новый репозиторий:
    1. Создадим новый пустой репозиторий (просто отдельную папку на компьютере)
    2. Выполним в ней
      git init
    3. Добавим в этот репозиторий файл somefie.txt
  2. Ну и начнем эксперимент.

  3. Для начала, создадим историю в главной ветке.

    Мы находимся в основной ветке, давайте сделаем в ней пару коммитов:

    1. В наш файл добавим строку:
      Строка 1

      И закоммитимся:

      git add . && git commit -m "master cmt 1"
    2. Добави вторую строку, так что файл теперь выглядит так:
      Строка 1
      Строка 2
      

      И закоммитимся:

      git add . && git commit -m "master cmt 2"

    Ну что, пришло время посмотреть на историю измений. например так:

    git log --oneline --name-only

    Получим что-то вроде (хэши у вас могут быть другими):

    a2ec666 (HEAD -> master) master cmt 2
    somefile.txt
    6dd2199 master cmt 1
    somefile.txt

    -- тут два коммита, отлично.

  4. Ответвимся ка теперь (надоже нам rebase где-то проверять), создадим новую ветку:
    git checkout -b newbranch

    Добавим в наш файл еще одну - третью строку:

    Строка 1
    Строка 2
    Строка 3

    и закоммитимся:

    git add . && git commit -m "newbranch cmt 1"

    Теперь глянем все коммиты:

    git log --oneline --name-only

    Получим три штуки:

    4ac039a (HEAD -> newbranch) newbranch cmt 1
    somefile.txt
    a2ec666 (master) master cmt 2
    somefile.txt
    6dd2199 master cmt 1
    somefile.txt
    

    А если отфильтровать только те, что после ответвления

    git log --oneline --name-only master..

    то только 1 коммит:

    4ac039a (HEAD -> newbranch) newbranch cmt 1
    somefile.txt
  5. Последний этап - сэмулируем параллельные изменения в основной ветке, для этого:
    1. Переключимся на нее:
      git checkout master
    2. После чего наш файл перейдет в состояние:
      Строка 1
      Строка 2

      поправим первую строчку:

      Строка первая
      Строка 2

      Сохраним файл и добавим третий коммит в основной ветке:

      git add . && git commit -m "master cmt 3"
    3. Глянем историю мастера (основной ветки):
      git log --oneline --name-only

      - вот у нас тут уже три коммита:

      4394661 (HEAD -> master) master cmt 3
      somefile.txt
      a2ec666 master cmt 2
      somefile.txt
      6dd2199 master cmt 1
      somefile.txt
      

Готово! Репозиторий переведен в состояние, описанное в начале этой заметки.