Статьи

Git команды новичка

Если вы новичок в Git, вы поймете, что некоторые вещи работают иначе, чем в репозиториях на основе SVN или CVS. Этот блог объясняет 10 самых важных команд в рабочем процессе Git, о которых вам нужно знать.

Если вы работаете в Windows и хотите выполнить приведенные ниже шаги, все, что вам нужно сделать, это настроить Git на локальном компьютере.

Прежде чем мы перейдем к командам Git, имейте в виду (и не забывайте!), Что у Git есть рабочий каталог, промежуточная область и локальный репозиторий. Смотрите обзор ниже, взятый с http://progit.org .

Рабочий процесс GIT выглядит следующим образом: Вы идете в каталог, где вы хотите иметь контроль версий. Вы используете git init чтобы поставить этот каталог под контроль версий. Это создает новый репозиторий для этого текущего местоположения. Вы вносите изменения в свои файлы, а затем используете git add to stage files в области подготовки. Вы будете использовать git status и git diff чтобы увидеть, что вы изменили, а затем, наконец, git commit для фактической записи снимка навсегда в ваш локальный репозиторий. Если вы хотите загрузить свои изменения в удаленный репозиторий, вы будете использовать git push . Если вы хотите загрузить изменения из удаленного репозитория в локальный репозиторий, вы будете использовать git fetch и git merge .

Давайте пройдемся по этому шаг за шагом.

Чтобы создать хранилище из существующего каталога файлов, вы можете просто запустить git init в этом каталоге. Перейдите в тот каталог, который вы хотите получить под контролем версий:

1
git init

Все новые и измененные файлы должны быть добавлены в промежуточную область перед фиксацией в хранилище. Чтобы добавить все файлы в текущем каталоге в область подготовки:

1
git add --all

Чтобы зафиксировать файлы и изменения в хранилище:

1
git commit -am "Initial commit"

Обратите внимание, что я использовал опцию -am которая неявно add -all . Эта команда эквивалентна «commit» в стиле SVN или CVS. Опять же: если вы хотите обновить свой локальный репозиторий Git, всегда есть операция добавления, за которой следует операция фиксации со всеми новыми и измененными файлами.

Затем вы создаете хранилище на Github.com . Допустим, вы назвали это git_example.

Затем вы добавляете адрес удаленного хранилища в вашу локальную конфигурацию GIT:

1
git remote add EXAMPLE https://nschlimm@github.com/nschlimm/git_example.git

Обратите внимание, что в примере это мое имя пользователя на Github.com. Вам нужно будет использовать свой очевидно. Я назвал удаленный репозиторий «ПРИМЕР». Вы можете ссылаться на псевдоним вместо использования удаленного URL-адреса все время. Вы готовы общаться с удаленным хранилищем сейчас.

Если вы находитесь за брандмауэром, вы настраиваете прокси:

1
git config --global http.proxy http://username:[email protected]:80

Затем вы отправляете свои файлы в удаленный репозиторий:

1
git push EXAMPLE master

Тогда представьте, что кто-то изменил удаленные файлы. Вы должны получить их:

1
git fetch EXAMPLE

Вам необходимо объединить эти изменения с удаленного мастера в локальную ветвь мастера (простым языком: вы копируете изменения из локального репозитория в рабочий каталог). Предположим, что ваш текущий контекст является основной веткой, и вы хотите объединить EXAMPLE ветку с главной, вы напишите:

1
git merge EXAMPLE

Чтобы сравнить область подготовки с вашим рабочим каталогом:

1
git status -s

В примере показан статус после того, как я изменил файл README.txt (но еще не добавил и не зафиксировал).

Без каких-либо дополнительных аргументов простой git diff покажет, какой контент вы изменили в своем проекте с момента последнего коммита, который еще не подготовлен для следующего снимка коммита.

1
git diff

В примере показан вывод diff после того, как я отредактировал файл README.txt (но еще не добавил и не зафиксировал). Когда я добавляю все изменения в промежуточную git diff , git diff не будет отображать изменения, потому что в вашей рабочей директории нет ничего, что не было подготовлено.

С git status по-другому. Он показывает разницу между вашим последним коммитом и промежуточной / рабочей областью:

Вкратце: git status показывает различия между вашим локальным хранилищем и вашим рабочим каталогом / промежуточной областью. В то время как git diff (как использовано выше) показывает различия между вашей областью подготовки и вашим рабочим каталогом.

Вот и все. Это самые важные команды Git, которые новичок должен знать, чтобы начать. См. Ссылку на gitref.org для получения дополнительной информации об использовании Git.

Загрузка удаленного репозитория

Если вы хотите скопировать репозиторий с Github.com (или любого другого удаленного адреса) на локальный компьютер:

1
git clone https://nschlimm@github.com/nschlimm/spring-decorator.git

Теперь вы можете работать с кодом и отправить изменения обратно в этот удаленный репозиторий, если хотите.

Работа с ветками — изменение текущего контекста

Ветвь в Git — это не что иное, как «текущий контекст», в котором вы работаете. Обычно вы начинаете работать в «основной» ветке. Допустим, вы хотите попробовать что-то, и вы не уверены, что то, что вы делаете, является хорошей идеей (что на самом деле случается очень часто :-)). В этом случае вы можете создать новую ветку и поэкспериментировать с вашей идеей:

1
git branch [branch_name]

Когда вы просто войдете в git branch он выведет список ваших новых веток.

Если вы хотите работать с новой веткой, вы можете написать:

1
git checkout [branch_name]

Обратите внимание на один важный факт: если вы переключаетесь между ветками, это не меняет состояние ваших измененных файлов. Скажем, у вас есть измененный файл foo.java . Вы переключаетесь с master ветки на новую ветку some_crazy_idea . После переключения foo.java все еще будет в измененном состоянии. Вы можете some_crazy_idea его в ветку some_crazy_idea . Если вы переключитесь на master ветку, однако этот коммит не будет виден, потому что вы не зафиксировали в контексте master ветки. Если бы файл был новым, вы бы даже не увидели его в рабочем дереве.

Если вы хотите, чтобы другие узнали о вашей новой идее, вы отправляете ветку в удаленный репозиторий:

1
git push [remote_repository_name] [branch_name]

Вы бы использовали fetch вместо push чтобы снова внести изменения в удаленную ветку в ваш локальный репозиторий.

Вот как вы снова удаляете ветку, если она вам больше не нужна:

1
git branch -d [branch_name]

Удаление файлов

Если вы случайно зафиксировали что-то в ветке, вы можете легко удалить файл снова. Например, чтобы удалить файл readme.txt текущей ветки:

1
git rm --cached readme.txt

Опция --cached удаляет только файл из индекса. Ваш рабочий каталог остается без изменений.

Вы также можете удалить папку. .settings папка .settings для проекта eclipse — это то, что вы не должны делить с другими:

1
git rm --cached -r some_eclipse_project/.settings

После rm команды rm файл все еще находится в индексе (история контроля версий Git). Вы можете навсегда удалить всю историю с помощью этой команды:

Примечание: будьте очень осторожны с такими командами и попробуйте их в копии своего репозитория, прежде чем применять их в своем производительном репозитории. Всегда создавайте копию полного хранилища, прежде чем запускать такие команды.

1
git filter-branch --index-filter 'git rm --cached --ignore-unmatch [your_file_name]' HEAD

Игнорирование файлов: вы не хотите контролировать версию определенного файла или каталога

Чтобы игнорировать файлы, вы просто добавляете имя файла в файл .gitignore в каталоге, которому принадлежит файл. Таким образом, он больше не будет добавлен в систему контроля версий. Вот мой .gitignore для корневого каталога проекта Eclipse:

1
2
3
4
/target
/.settings
.project
.classpath

Он игнорирует target и папку .settings а также .project и файл .classpath .

Иногда полезно настроить глобальные правила игнорирования, которые применяются ко всему хранилищу:

1
git config --global core.excludesfile ~/.gitignore_global

Это добавило следующую запись в мой .gitconfig глобальных параметров .gitconfig который находится в корневом каталоге git.
excludesfile = d:/dev_home/repositories/git/.gitignore_global
Это мои текущие глобальные правила исключения в моем файле .gitignore_global :
# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so
# Logs and databases #
######################
*.log

Примечание: эти правила доступны другим пользователям. Локальные правила репо могут быть добавлены в файл .git / info / exclude в вашем репо. Эти правила не привязаны к репо, поэтому они не передаются другим.

Восстановление файлов — поставь часы обратно

Иногда вы вносите изменения в свои файлы и через некоторое время понимаете, что то, что вы сделали, было плохой идеей. Вы хотите вернуться к своему последнему состоянию фиксации. Если вы внесли изменения в свой рабочий каталог и хотите восстановить последний коммит HEAD в своем рабочем каталоге, введите:

1
git reset --hard HEAD

Эта команда устанавливает для текущего --hard ветви последний коммит (HEAD) и перезаписывает ваш локальный рабочий каталог этим последним состоянием фиксации (опция --hard ). Таким образом, он будет перезаписывать ваши измененные файлы.

Вместо HEAD (который является вашим последним коммитом) вы можете назвать ветку или тэг как ‘v0.6’. Вы также можете сбросить до предыдущего коммита: HEAD ~ 2 — коммит до вашего последнего коммита.

Может быть, вы хотите восстановить файл, который вы удалили в вашем рабочем каталоге. Вот что я ввел для восстановления java-файла, который я случайно удалил:

1
git checkout HEAD sources/spring-decorator/src/test/java/com/schlimm/decorator/simple/SetupSession.java

Опять же: вместо HEAD вы можете назвать ветку или тег, например, «v0.6». Вы можете извлечь файл из предыдущего коммита: HEAD ~ 2 — коммит до вашего последнего коммита.

Работа с тегами — создание закладок для вашего исходного кода

Иногда вы хотите сделать версию вашего исходного кода. Таким образом, вы можете обратиться к нему позже. Чтобы применить тег версии v1.0.0 к вашим файлам, вы должны написать:

1
git tag -a v1.0.0 -m "Creating the first official version"

Вы можете поделиться своими тегами с другими в удаленном хранилище:

1
git push [remote_repository_name] --tags

Где remote_repository_name — это псевдоним вашего удаленного репозитория. Вы пишете fetch вместо push чтобы получить теги, которые другие отправили в удаленный репозиторий, в ваш локальный репозиторий.

Если вы просто введете git tag он выдаст вам список известных тегов. Чтобы получить информацию о теге v1.0.0, вы должны написать:

1
git show v1.0.0 -s

Если вы хотите продолжить работу с тегом, например, в производственной ветке с версией v5.0.1, введите:

1
git checkout v5.0.1 -b [your_production_branch]

Обратите внимание, что эта команда также создает новую ветвь для тега, таким образом, вы можете делать коммиты и все остальное, что хотите записать обратно в репозиторий.

Справка: «Лучшие 10 команд для новичка Git» от нашего партнера JCG Никласа.