GIT
Last updated
Was this helpful?
Last updated
Was this helpful?
git add --all
добавит в коммит все что есть в папка и подпапках
Следующие две команды добавляют в коммит все измененные файлы кроме file.cpp
git add -u
git reset -- path/file.cpp
Аналогично можно создать коммит, используя все файлы, кроме одной директории:
git add -u
git reset -- mydir/*
Git не копирует всю директорию каждый раз, а ужимает (когда это возможно) коммит в набор изменений или «дельту» между текущей версией и предыдущей. Очевидно, что для первого коммита он копирует весь репозиторий. Также Git хранит всю историю о том, когда какой коммит был сделан
git commit -m "first commit"
Каждый коммит имеет своего родителя(кроме первого), это показано стрелочками.
Мы находились на втором коммите и создали новую ветку newImage
git branch newImage
Чтобы сменить нашу ветку нужно сделать
git checkout newImage
Сделаем коммит
git commit
Создание новой ветки и переключение на нее
git checkout -b yourbranchname
git commit
git checkout -b bugfix
git commit
Вот у нас две ветки, каждая содержит по одному уникальному коммиту. Это означает, что ни одна из веток не содержит полный набор "работ", выполненных в этом репозитории. Можно исправить эту ситуацию, выполнив слияние.
git merge bugfix
Ветка master теперь указывает на коммит, у которого два родителя. Если проследовать по стрелкам от этого коммита, вы пройдёте через каждый коммит в дереве прямиком к началу. Это означает, что теперь в ветке master содержатся все изменения репозитория.
git checkout bugfix
git merge master
Теперь каждая ветка содержит все изменения репозитория
git rebase master
Теперь изменения из bugFix находятся в конце ветки master и являют собой линейную последовательность коммитов. Коммит С3 до сих пор существует где-то, а С3' - это его "копия" в ветке master. Единственная проблема - ветка master не обновлена до последних изменений.
git rebase bugfix
HEAD - это символическое имя текущего выбранного коммита — это, по сути, тот коммит, над которым мы в данным момент работаем. HEAD всегда указывает на последний коммит из вашего локального дерева. Большинство команд Git, изменяющих рабочее дерево, начнут с изменения HEAD.
git checkout C1
git checkout master
git commit
git checkout C2
Отделение (detaching) HEAD означает лишь присвоение его не ветке, а конкретному коммиту. Посмотрим, что было до отделения:
HEAD -> master -> C1
git checkout C1
А вот что получилось теперь
HEAD -> C1
Относительные ссылки - мощный инструмент, но мы покажем два простых способа использования:
Перемещение на один коммит назад ^
Перемещение на num коммитов назад ~
git checkout master^
git branch -f master HEAD~3
Есть два основных способа отмены изменений в Git: первый - это git reset, а второй - git revert.
git reset отменяет изменения, перенося ссылку на ветку назад, на более старый коммит. Это своего рода "переписывание истории"; git reset перенесёт ветку назад, как будто некоторых коммитов вовсе и не было.
git reset HEAD~1
Git просто перенёс ссылку на master обратно на коммит C1. Теперь наш локальный репозиторий в состоянии, как будто C2 никогда не существовал. Reset отлично работает на локальных ветках, в локальных репозиториях. Но этот метод переписывания истории не сработает на удалённых ветках, которые используют другие пользователи. Чтобы отменить изменения и поделиться отменёнными изменениями с остальными, надо использовать git revert.
git revert HEAD
Появился новый коммит. Дело в том, что новый коммит C2' просто содержит изменения, полностью противоположные тем, что сделаны в коммите C2. После revert можно сделать push и поделиться изменениями с остальными.
git cherry-pick <Commit1> <Commit2> <...>
Это очень простой и прямолинейный способ сказать, что ты хочешь копировать несколько коммитов на место, где сейчас находишься (HEAD).
git cherry-pick C2 C4
git rebase -i HEAD~4