Difference between revisions of "FPC git/ru"

From Free Pascal wiki
Jump to navigationJump to search
(Created page with "{{FPC git}} == Git setup == === Git repository location === The Git repositories are hosted on Gitlab: FPC compiler, RTL, packages and utils are located here: : [https://g...")
 
 
(40 intermediate revisions by one other user not shown)
Line 1: Line 1:
 
{{FPC git}}
 
{{FPC git}}
  
== Git setup ==
+
== Настройка Git ==
  
=== Git repository location ===
+
=== Расположение репозитория Git ===
  
The Git repositories are hosted on Gitlab:
+
Репозитории Git размещены на Gitlab:
  
FPC compiler, RTL, packages and utils are located here:
+
Компилятор FPC, RTL, пакеты и утилиты находятся здесь:
 
: [https://gitlab.com/freepascal.org/fpc/source https://gitlab.com/freepascal.org/fpc/source]
 
: [https://gitlab.com/freepascal.org/fpc/source https://gitlab.com/freepascal.org/fpc/source]
The URL to clone the repository is:
+
URL-адрес для клонирования репозитория:
 
: [https://gitlab.com/freepascal.org/fpc/source.git https://gitlab.com/freepascal.org/fpc/source.git]
 
: [https://gitlab.com/freepascal.org/fpc/source.git https://gitlab.com/freepascal.org/fpc/source.git]
 
<pre>
 
<pre>
 
git clone https://gitlab.com/freepascal.org/fpc/source.git
 
git clone https://gitlab.com/freepascal.org/fpc/source.git
 
</pre>
 
</pre>
The Documentation Git repository is here:
+
Репозиторий документации Git находится здесь:
 
: [https://gitlab.com/freepascal.org/fpc/documentation https://gitlab.com/freepascal.org/fpc/documentation]
 
: [https://gitlab.com/freepascal.org/fpc/documentation https://gitlab.com/freepascal.org/fpc/documentation]
The URL to clone the documentation repository is:
+
URL-адрес для клонирования репозитория документации:
 
: [https://gitlab.com/freepascal.org/fpc/documentation.git https://gitlab.com/freepascal.org/fpc/documentation.git]
 
: [https://gitlab.com/freepascal.org/fpc/documentation.git https://gitlab.com/freepascal.org/fpc/documentation.git]
 
<pre>
 
<pre>
Line 22: Line 22:
 
</pre>
 
</pre>
  
The website Git repository is here:
+
Репозиторий Git веб-сайта находится здесь:
 
: [https://gitlab.com/freepascal.org/fpc/website https://gitlab.com/freepascal.org/fpc/website]
 
: [https://gitlab.com/freepascal.org/fpc/website https://gitlab.com/freepascal.org/fpc/website]
The URL to clone the website repository is:
+
URL-адрес для клонирования репозитория веб-сайта:
 
: [https://gitlab.com/freepascal.org/fpc/website.git https://gitlab.com/freepascal.org/fpc/website.git]
 
: [https://gitlab.com/freepascal.org/fpc/website.git https://gitlab.com/freepascal.org/fpc/website.git]
 
<pre>
 
<pre>
Line 30: Line 30:
 
</pre>
 
</pre>
  
=== Your identity in git ===
+
=== Ваша идентификация в git ===
  
In order for your commits to be recognized, please configure your local (or better yet, global) git  
+
Чтобы ваши коммиты были распознаны, настройте локальный (а еще лучше глобальный) git
installation to use the address linked to your gitlab acccount.
+
Установка, чтобы использовать адрес, связанный с вашей учетной записью gitlab.
 
<pre>
 
<pre>
 
git config --global user.email your.email.user@youremail.host
 
git config --global user.email your.email.user@youremail.host
 
</pre>
 
</pre>
This will set your email address for all git repositories you use, and
+
Это установит ваш адрес электронной почты для всех репозиториев git, которые вы используете, и позволит интерфейсу gitlab правильно связывать коммиты с пользователями в своем HTML-интерфейсе.
will allow the gitlab interface to correctly link commits to users in its HTML interface.
 
  
If you have multiple gitlab (or even github) accounts, you may prefer to set this email only locally:
+
Если у вас несколько учетных записей gitlab (или даже github), вы можете предпочесть установить этот адрес электронной почты только локально:
 
<pre>
 
<pre>
 
git config --local user.email your.email.user@youremail.host
 
git config --local user.email your.email.user@youremail.host
 
</pre>
 
</pre>
this command must be execute in a particular repository, and sets the email address for only that repository.
+
эта команда должна выполняться в определенном репозитории и устанавливает адрес электронной почты только для этого репозитория.
  
=== HTTP access and credentials ===
+
=== HTTP-доступ и учетные данные ===
  
If you access the repository using HTTPS, by default, git will ask for the username/password.
+
Если вы получаете доступ к репозиторию с помощью HTTPS, по умолчанию git запрашивает имя пользователя и пароль.
you can tell git to store them permanently, issue the following command:
+
Вы можете указать git хранить их постоянно, введите следующую команду:
 
<pre>
 
<pre>
 
git config --global credential.helper store
 
git config --global credential.helper store
 
</pre>
 
</pre>
There are other possibilities for storing this info. More info can be found on
+
Есть и другие возможности для хранения этой информации. Более подробную информацию можно найти на
 
: [https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage]
 
: [https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage]
  
=== Using access tokens ===
+
=== Использование токенов доступа ===
  
You may want to use an access token and HTTPS access, it has some advantages.
+
Вы можете использовать токен доступа и доступ по протоколу HTTPS, это имеет некоторые преимущества.
This is supported by most modern git clients:
+
Это поддерживается большинством современных клиентов git:
 
: [https://knasmueller.net/gitlab-authenticate-using-access-token https://knasmueller.net/gitlab-authenticate-using-access-token]
 
: [https://knasmueller.net/gitlab-authenticate-using-access-token https://knasmueller.net/gitlab-authenticate-using-access-token]
and here you can see how to do this on gitlab:  
+
и здесь вы можете увидеть, как это сделать на gitlab:  
 
: [https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]
 
: [https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]
  
The advantage of using an access token is that it can be given limited rights on gitlab, for example only accessing a repository.
+
Преимущество использования токена доступа заключается в том, что ему могут быть предоставлены ограниченные права на gitlab, например, только доступ к репозиторию.
This also means you can easily enable 2FA for your gitlab account.
+
Это также означает, что вы можете легко включить 2FA (двухфакторная аутентификация) для своей учетной записи gitlab.
  
== Branching model ==
+
== Модель ветвления ==
In a first stage, the branching model as used in Subversion will be used: fixes done in trunk, and later merged to the fixes branch.
+
На первом этапе будет использоваться модель ветвления, используемая в Subversion: исправления вносятся в основной ветке, а затем объединяются в ветку исправлений.
  
At a later stage, the branching model may be changed into one of the many git branching schemes.
+
На более позднем этапе модель ветвления может быть изменена на одну из многих схем ветвления git.
  
== Windows Git clients ==
+
== Git-клиенты Windows==
  
On macOS, Linux & BSD, the git command is installed with the system package manager (you must install XCode command line tools on macOS).
+
В macOS, Linux и BSD команда git устанавливается вместе с системным диспетчером пакетов (в macOS необходимо установить инструменты командной строки XCode).
On Windows, a separate git client must be installed. There are many available, but the following are popular ones:
+
В Windows необходимо установить отдельный клиент git. Их много, но наиболее популярными являются следующие:
  
* Git for windows: a command-line client with a bash shell, so you can copy & paste commands you find on internet:  
+
* Git для Windows: клиент командной строки с оболочкой bash, поэтому вы можете копировать и вставлять команды, которые вы найдете в Интернете:  
 
: [https://gitforwindows.org/ https://gitforwindows.org/]
 
: [https://gitforwindows.org/ https://gitforwindows.org/]
* TortoiseGit integrates with the Windows explorer, much like TortoiseSVN does:
+
* TortoiseGit интегрируется с проводником Windows, как и TortoiseSVN:
 
: [https://tortoisegit.org/ https://tortoisegit.org/]
 
: [https://tortoisegit.org/ https://tortoisegit.org/]
: if you already have TortoisSVN installed, both can work side-by-side.
+
: если у вас уже установлен TortoisSVN, оба могут работать бок о бок.
* Sourcetree is a free client for Windows and macOS:
+
* Sourcetree - бесплатный клиент для Windows и macOS:
 
: [https://www.sourcetreeapp.com/ https://www.sourcetreeapp.com/]
 
: [https://www.sourcetreeapp.com/ https://www.sourcetreeapp.com/]
: It is made by the people from bitbucket.  
+
: сделано людьми из bitbucket.
* Smartgit runs on Windows, Linux and macOS:
+
* Smartgit работает в Windows, Linux и macOS:
 
: [https://www.syntevo.com/smartgit/ https://www.syntevo.com/smartgit/]
 
: [https://www.syntevo.com/smartgit/ https://www.syntevo.com/smartgit/]
* The VSCode and Atom editors have git support built in.
+
* Редакторы VSCode и Atom имеют встроенную поддержку git.
  
== Concepts and SVN to GIT differences ==
+
== Понятия и различия между SVN и GIT ==
  
A few "good to know" differences: [[FPC_git_concepts]]
+
Несколько "полезных" отличий: [[FPC_git_concepts]]
  
== Common SVN operations in Git ==
+
== Общие операции SVN в Git ==
  
 
=== Check out ===
 
=== Check out ===
To check out a new copy of a repository is called 'cloning' in git.
+
Получение новой копии репозитория в git называется «клонированием».
 
<pre>
 
<pre>
 
git clone https://gitlab.com/freepascal.org/testconversion
 
git clone https://gitlab.com/freepascal.org/testconversion
 
</pre>
 
</pre>
As in subversion, you can give it another name:
+
Как и в случае с Subversion, вы можете дать ему другое имя:
 
<pre>
 
<pre>
 
git clone https://gitlab.com/freepascal.org/testconversion myconversion
 
git clone https://gitlab.com/freepascal.org/testconversion myconversion
 
</pre>
 
</pre>
This operation can take a while, the FPC source base is large.
+
Эта операция может занять некоторое время, исходная база FPC большая.
  
 
=== Update ===
 
=== Update ===
To update your source code with the changes in the remote repository, is called 'pulling' in git:
+
Обновление исходного кода с учетом изменений в отдаленном репозитории в git называется 'pulling'(вытягивание, извлечение):
 
<pre>
 
<pre>
 
git pull
 
git pull
 
</pre>
 
</pre>
Note that in difference with subversion, git always updates the whole repository.
+
Обратите внимание, что в отличие от subversion, git всегда обновляет весь репозиторий.
{{Note|While git will fetch and apply changes to all ''remote'' branches with this command, of all ''local'' branches it will only update the one that's currently checked out (see [[FPC_git#ls_.28listing_branches.29|ls (listing branches)]] for more information about remote/local branches). To update other local branches, you have to [[FPC_git#switch_.28checking_out_a_branch.29|switch]] to them and either execute <tt>git pull</tt> again, or rebase/merge (will be documented once we decide which strategy to use).}}
+
{{Note|В то время как git будет извлекать и применять изменения ко всем ''отдаленным'' веткам с помощью этой команды, из всех ''локальных'' веток он обновит только ту, которая в настоящее время проверяется (для получения дополнительной информации об отдаленных/локальных ответвлениях см. [[FPC_git#ls_.28listing_branches.29|ls (listing branches)]]). Чтобы обновить другие локальные ветки, вам нужно [[FPC_git#switch_.28checking_out_a_branch.29|switch]](переключиться) на них и либо снова выполнить <tt>git pull</tt>, либо выполнить <tt>rebase/merge</tt> (будет задокументировано, как только мы решим, какую стратегию использовать).}}
  
To keep a commit history which is as linear as possible and avoids merge commits, it is recommended to do a rebase when you pull.  
+
Чтобы история коммитов была как можно более линейной и избегала коммитов слиянием (merge commits), рекомендуется выполнять rebase (перебазирование) при извлечении.
 
<pre>
 
<pre>
 
git pull --rebase
 
git pull --rebase
 
</pre>
 
</pre>
You can make the use of rebase for every pull the default by executing:
+
Вы можете использовать перебазирование для каждого извлечения по умолчанию, выполнив:
 
<pre>
 
<pre>
 
git config pull.rebase true
 
git config pull.rebase true
Line 124: Line 123:
  
 
=== Resolve ===
 
=== Resolve ===
If you have conflicts in svn after updating or merging, you fix the conflicts and then tell svn everything is fine with the ''resolved'' command.
+
Если у вас есть конфликты в svn после обновления или слияния, вы исправляете конфликты, а затем сообщаете svn, что все в порядке, с помощью команды ''resolved''(урегулировано, разрешено).
  
In git, conflicts generally occur when [[FPC_git#merge_.28merging_the_changes_in_2_branches.29|merging]] or when applying [[FPC_git#shelve_.28temporarily_undo_changes.29|shelved/stashed]] changes.
+
В git конфликты обычно возникают при [[FPC_git/ru#merge_.28.D0.BE.D0.B1.D1.8A.D0.B5.D0.B4.D0.B8.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5_.D0.B8.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5.D0.BD.D0.B8.D0.B9_.D0.B2_2-.D1.85_.D0.B2.D0.B5.D1.82.D0.BA.D0.B0.D1.85.29|merging]] (слиянии) или при применении [[FPC_git/ru#shelve_.28.D0.B2.D1.80.D0.B5.D0.BC.D0.B5.D0.BD.D0.BD.D0.B0.D1.8F_.D0.BE.D1.82.D0.BC.D0.B5.D0.BD.D0.B0_.D0.B8.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5.D0.BD.D0.B8.D0.B9.29|shelved/stashed]] (временно отложенные/запланированные) изменений.
  
When conflicts occur, then
+
Когда возникают конфликты, то
# Changes to files that are not in conflict, will be [[FPC_git#commit|staged]]
 
# Changes to files that do conflict will be applied without staging to the working copy (so that a plain [[FPC_git#diff_.28show_changes_to_working_copy.29|diff]] will only show conflicting changes)
 
  
To resolve conflicts,
+
# Изменения в файлах, которые не конфликтуют, будут [[FPC_git/ru#commit|staged]] (запланированными).
# If you want to commit the resolved version of the file, mark it as resolved by [[FPC_git#commit|staging/adding]] it as well
+
# Изменения в файлах, которые конфликтуют, будут применены без промежуточной обработки к рабочей копии (так что простой [[FPC_git/ru#diff_.28.D0.BF.D0.BE.D0.BA.D0.B0.D0.B7.D0.B0.D1.82.D1.8C_.D0.B8.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5.D0.BD.D0.B8.D1.8F_.D0.B2_.D1.80.D0.B0.D0.B1.D0.BE.D1.87.D0.B5.D0.B9_.D0.BA.D0.BE.D0.BF.D0.B8.D0.B8.29|diff]] будет показывать только конфликтующие изменения)
# If you want to just get rid of the "both modified" status (= conflicted) without adding the file, use <tt>git reset file</tt>
 
  
Once all files have been staged or marked as not conflicted, you can commit (only staged files will be committed).
+
Чтобы разрешить конфликты,
  
=== add (adding new files) ===
+
# Если вы хотите зафиксировать урегулированную версию файла, отметьте ее как resolved (улаженную), также сделав ее [[FPC_git/ru#commit|staging/adding]].
Subversion uses the ''add'' command to add a file to the versioning system. This is no different in git:
+
# Если вы хотите просто избавиться от статуса "оба изменены" (= конфликтуют) без добавления файла, используйте <tt>git reset file</tt>
If you want to add a file, you must add it first, like this:
+
 
 +
После того, как все файлы были поставлены или помечены как не конфликтующие, вы можете сделать commit (зафиксировать) (будут зафиксированы только промежуточные файлы).
 +
 
 +
=== add (добавление новых файлов) ===
 +
Subversion использует команду ''add'' для добавления файла в систему управления версиями. В git это не исключение:
 +
Если вы хотите добавить файл, вы должны сначала добавить его, например:
 
<pre>
 
<pre>
 
git add newfile.pas
 
git add newfile.pas
 
</pre>
 
</pre>
You must then (just as in subversion) still commit this newly added file.  
+
Затем вы должны (как и в Subversion) сделать commit (зафиксировать) этот только что добавленный файл.
  
=== rm (removing files) ===
+
=== rm (Удаление файлов) ===
Subversion uses the ''rm'' command to remove a file from the versioning system. This is no different in git:
+
Subversion использует команду ''rm'' для удаления файла из системы управления версиями. В git это не исключение:
 
<pre>
 
<pre>
 
git rm nolongerneededfile.pas
 
git rm nolongerneededfile.pas
 
</pre>
 
</pre>
You must then (just as in subversion) still commit this removed file.
+
Затем вы должны (как и в Subversion) сделать commit (зафиксировать) этот удаленный файл.
  
=== mv (renaming files) ===
+
=== mv (переименование файлов) ===
Subversion uses the ''rm'' command to rename a file in the versioning system. This is no different in git:
+
Subversion использует команду ''rm'' для переименования файла в системе управления версиями. В git это не исключение:
 
<pre>
 
<pre>
 
git mv oldfile.pas newfile.pas
 
git mv oldfile.pas newfile.pas
 
</pre>
 
</pre>
You must then (just as in subversion) still commit this change.
+
После этого вы должны (как и в Subversion) сделать commit (зафиксировать) это изменение.
  
As in subversion, you can move one or more files to another directory:
+
Как и в Subversion, вы можете переместить один или несколько файлов в другой каталог:
 
<pre>
 
<pre>
 
git mv file1.pas file2.pas somesubdir
 
git mv file1.pas file2.pas somesubdir
Line 166: Line 167:
  
 
=== commit ===
 
=== commit ===
If you have made some changes locally and wish to commit them, this is a 2-step process:
+
Если вы внесли некоторые изменения локально и хотите их зафиксировать, это двухэтапный процесс:
 
<pre>
 
<pre>
 
git add myfile.pas
 
git add myfile.pas
 
</pre>
 
</pre>
This schedules the file to be committed (called ''staging'' in git, so the changes are now ''staged''). You can add as many files as you want like this.
+
Это планирует фиксацию файла (в git это называется ''staging''(запланированные изменения) - [[user:zoltanleo|прим.перев]]: '''git staging''' - область, отслеживаемая git, в которой находятся файлы еще не попавшие в commit, поэтому изменения теперь становятся «совершаемые поэтапно»). Вы можете добавить столько файлов, сколько захотите, вот так.
{{Note|An easy way to remember this is that svn requires the same for newly added files. Git extends this to all changes, because that way you not only can selectively schedule individual new files for the next commit, but also changes to existing files. The opposite of <tt>git add</tt> is <tt>git reset</tt> ('''without''' the <tt>--hard</tt> parameter!)}}
+
{{Note|Легко помнить, что svn требует того же для вновь добавленных файлов. Git распространяет это на все изменения, потому что таким образом вы можете не только выборочно планировать отдельные новые файлы для следующего коммита, но и вносить изменения в существующие файлы. Противоположность <tt>git add</tt> - это <tt>git reset</tt> ('''без''' параметра <tt>--hard</tt>!)}}
  
{{Note|To see the changes that have been staged/scheduled for commit, use <tt>git diff --cached</tt>. Plain <tt>git diff</tt> will show local changes that are not (yet) staged.}}
+
{{Note|Чтобы увидеть изменения, которые были staged/scheduled (поставлены/запланированы) для фиксации, используйте <tt>git diff --cached</tt>. Обычный <tt>git diff</tt> покажет локальные изменения, которые (пока) не поставлены.}}
  
When you are ready to commit what you have staged, you can commit:
+
Когда вы будете готовы  зафиксировать то, что запланировали, вы можете сделать commit:
 
<pre>
 
<pre>
 
git commit -m '* Some nice comment telling what you did'
 
git commit -m '* Some nice comment telling what you did'
 
</pre>
 
</pre>
  
In fact, if you're in a hurry and know you want to commit a file, you can combine the 2 commands;
+
Фактически, если вы торопитесь и знаете, что хотите зафиксировать файл, вы можете объединить две команды:
 
<pre>
 
<pre>
 
git commit -m '* Some nice comment telling what you did' myfile.pas
 
git commit -m '* Some nice comment telling what you did' myfile.pas
 
</pre>
 
</pre>
If you are really in a hurry, you can commit all changed files in one fell swoop:
+
Если вы очень торопитесь, вы можете зафиксировать все измененные файлы одним махом:
 
<pre>
 
<pre>
 
git commit -m '* Some nice comment telling what you did' -a
 
git commit -m '* Some nice comment telling what you did' -a
 
</pre>
 
</pre>
But it is not really recommended to use this, as it will commit ''all'' changes in your local copy, not just the ones in the current working directory.
 
  
At this point, your changes have been saved locally, but have not yet been sent to the remote repository.
+
Но на самом деле не рекомендуется использовать этот способ, так как он зафиксирует ''все'' изменения в вашей локальной копии, а не только в текущем рабочем каталоге.
To do that, you must additionally send the changes to the remote repository. This is called pushing:
+
 
 +
На этом этапе ваши изменения были сохранены локально, но еще не отправлены в отдаленный репозиторий.
 +
Для этого необходимо дополнительно отправить изменения в отдаленный репозиторий. Это называется <tt>pushing</tt> (публикацией):
 
<pre>
 
<pre>
 
git push
 
git push
 
</pre>
 
</pre>
That will send all locally committed changes to the server. Obviously only changes that have not yet been sent previously are sent.
+
Это отправит все локально зафиксированные изменения на сервер. Очевидно, отправляются только те изменения, которые еще не были отправлены ранее.
  
=== diff (show changes to working copy) ===
+
=== diff (показать изменения в рабочей копии) ===
In svn, you can see the changes that have been made but have not yet been committed with ''diff''. This is also correct in git:
+
В svn вы можете увидеть изменения, которые были сделаны, но еще не зафиксированы с помощью ''diff''. Это также верно в git:
 
<pre>
 
<pre>
 
git diff
 
git diff
 
</pre>
 
</pre>
This will show all changes in your working copy '''''that are not yet staged''''' (scheduled for committing).
+
Это покажет все изменения в вашей рабочей копии, '''''которые еще не поставлены''''' (не запланированы для фиксации).
  
You can view this for a single file as well:
+
Вы также можете просмотреть изменения для одного файла:
 
<pre>
 
<pre>
 
git diff myfile.pas
 
git diff myfile.pas
 
</pre>
 
</pre>
This will show unstaged changes made to your working copy of '''myfile.pas'''.
+
Это покажет неустановленные изменения, внесенные в вашу рабочую копию '''myfile.pas'''.
 +
 
 +
Если вы уже запланировали для фиксации один или несколько файлов (т.е. отмечены для включения в следующий коммит), приведенное выше не будет отображать их в сгенерированном файле diff. Если вы хотите видеть запланированные изменения (и ''только'' запланированные изменения), используйте параметр командной строки ''--cached'':
  
If you have already staged one or more files (i.e. marked for inclusion in the next commit),
 
the above will not show them in the generated diff. If you wish to see the staged changes
 
(and ''only'' the staged changed), use the ''--cached'' command-line option:
 
 
<pre>
 
<pre>
 
git diff --cached
 
git diff --cached
 
</pre>
 
</pre>
  
=== diff (show changes performed in a commit) ===
+
=== diff (показать изменения, выполненные при коммите) ===
In svn, you can see the changes that a commit did through <tt>svn diff -c <revision></tt>. In git, you use the ''show'' command instead:
+
В svn вы можете увидеть изменения, внесенные коммитом, с помощью <tt>svn diff -c <revision></tt>. В git вместо этого вы используете команду ''show'':
 
<pre>
 
<pre>
 
git show -p <commit_hash_or_branch_or_tag>
 
git show -p <commit_hash_or_branch_or_tag>
 
</pre>
 
</pre>
If you omit the commit hash, the last commit to the current branch will be shown instead.
+
Если вы опустите хеш фиксации, вместо этого будет отображаться последняя фиксация в текущей ветке.
  
=== log (show commits in a branch) ===
+
=== log (показать коммиты в ветке) ===
In svn, you can see the commits in a branch with <tt>svn log</tt>. The same works in git:
+
В svn вы можете увидеть коммиты в ветке с помощью <tt>svn log</tt>. То же самое работает в git:
 
<pre>
 
<pre>
 
git log
 
git log
 
</pre>
 
</pre>
This will list the commit hashes (the string that git uses to identify commits, similar to revision numbers in svn) followed by the log messages. If you also want to see which files were changed, use
+
Здесь будут перечислены хэши коммитов (строка, которую git использует для идентификации коммитов, аналогично номерам ревизий в svn), за которыми следуют сообщения журнала. Если вы также хотите увидеть, какие файлы были изменены, используйте
 
<pre>
 
<pre>
 
git log --stat
 
git log --stat
 
</pre>
 
</pre>
  
=== ls (listing branches) ===
+
=== ls (список веток) ===
To get a list of branches in Subversion, you use the 'ls' command with a server URL. By convention, all directories under '/branches' are the names of branches. Branches always exist both on the client(s) and server.
+
Чтобы получить список веток в Subversion, вы используете команду 'ls' с URL-адресом сервера. По соглашению, все каталоги в разделе '/branches' являются именами ветвей. Ветки всегда существуют как на клиенте(ах), так и на сервере.
  
In git, branches are formalised as part of the version control system: commands deal specifically with branches rather than with paths that are treated as branches. Additionally, git differentiates between '''remote branches''' (branches that exist in the repository that you cloned, i.e., in this case on the gitlab server), and '''local branches''' (branches that you created on your machine after cloning). The repository that you cloned is referenced using the alias "origin" by default, and the names of remote branches are prepended by this alias.
+
В git ветки формализованы как часть системы управления версиями: команды имеют дело конкретно с ветвями, а не с путями, которые рассматриваются как ветки. Кроме того, git различает '''remote branches''' (отдаленные ветки) (ветки, которые существуют в репозитории, который вы клонировали, то есть в данном случае на сервере gitlab), и '''local branches''' (локальные ветки) (ветки, которые вы создали на ваша машине после клонирования). Репозиторий, который вы клонировали, по умолчанию упоминается с использованием псевдонима "origin", а имена удаленных ветвей добавляются к этому псевдониму.
  
The list of local branches can be obtained using:
+
Список локальных веток можно получить, используя:
 
<pre>
 
<pre>
 
git branch  
 
git branch  
 
</pre>
 
</pre>
By default, the only local branch you will have is <tt>main</tt>, which corresponds to svn trunk. This local branch is automatically created when performing the initial clone operation.
+
По умолчанию единственная локальная ветка, которая у вас будет  - это <tt>main</tt>, что соответствует svn trunk. Эта локальная ветвь создается автоматически при выполнении начальной операции клонирования.
  
The list of remote branches can be obtained using:
+
Список отдаленных веток можно получить, используя:
 
<pre>
 
<pre>
 
git branch -r
 
git branch -r
 
</pre>
 
</pre>
By default, the remote branches are the branches that exist in the repository on the gitlab server, whose alias is "origin". The local <tt>main</tt> branch automatically ''tracks'' (~ is linked to) the remote <tt>origin/main</tt> branch. Because of this tracking, executing <tt>git pull</tt> resp. <tt>git push</tt> commands while you have your local <tt>main</tt> branch checked out will synchronise the two from resp. to gitlab. See [[FPC_git#switch_.28checking_out_a_branch.29|switch]] on how to create more local branches and how to link them to remote branches.
+
По умолчанию отдаленные ветки - это ветки, существующие в репозитории на сервере gitlab, чей псевдоним - "origin". Локальная <tt>main</tt> ветвь автоматически ''отслеживает'' (привязана к) отдаленную <tt>origin/main</tt> ветвь. Из-за этого отслеживания выполнение <tt>git pull</tt> отвечает за команду <tt>git push</tt>, имеющаяся у вас полученная ваша локальная ветка <tt>main</tt> будет синхронизироваться до gitlab. Посмотрите, как создать больше локальных веток и как связать их с удаленными ветвями. Смотрите [[FPC_git#switch_.28checking_out_a_branch.29|switch]], как создать больше локальных веток и как связать их с удаленными ветвями.
  
{{Note|While git always downloads all branches and their commits by default when cloning or pulling and while you can use their content without a network connection, you cannot directly work on remote branches (since they're remote and not local). Instead, you have to create a local branch that "tracks" this remote branch.}}
+
{{Note|Хотя git всегда загружает все ветки и их коммиты по умолчанию при клонировании или извлечении, и хотя вы можете использовать их контент без сетевого подключения, вы не можете напрямую работать с отдаленными ветвями (поскольку они отдаленные, а не локальные). Вместо этого вы должны создать локальную ветку, которая «отслеживает» эту отдаленную ветку.}}
{{Note|Do not directly checkout a remote branch. That will put you in a so-called "detached HEAD" state: your working copy will contain the contents from that branch, but you can't commit anything as you can only commit to local branches. You can get out of a "detached HEAD" state by simply checking out another branch.}}
+
{{Note|Не проверяйте напрямую отдаленную ветку. Это переведет вас в так называемое состояние «отключенной HEAD»: ваша рабочая копия будет содержать содержимое из этой ветки, но вы не можете ничего зафиксировать, поскольку вы можете фиксировать только локальные ветки. Вы можете выйти из состояния «отключенной HEAD», просто проверив другую ветку.}}
  
=== copy (creating a branch) ===
+
=== copy (создание ветки) ===
To create a branch from the current working directory situation, you can create a branch like this:
+
Чтобы создать ветку из текущей ситуации с рабочим каталогом, вы можете создать такую ​​ветку:
 
<pre>
 
<pre>
 
git branch mybugfix
 
git branch mybugfix
 
</pre>
 
</pre>
this will create a branch mybugfix from the currently checked out branch at the current commit. But it does not yet make this the active branch.
+
Это создаст ветку mybugfix из текущей извлеченной ветки при текущей фиксации. Но это еще не делает эту ветку активной.
  
You need to check out the newly made branch first:
+
Сначала вам нужно проверить только что созданную ветку:
 
<pre>
 
<pre>
 
git checkout mybugfix
 
git checkout mybugfix
 
</pre>
 
</pre>
  
The two operations can also be combined with one command:
+
Две операции также можно комбинировать с помощью одной команды:
 
<pre>
 
<pre>
 
git checkout -b mybugfix
 
git checkout -b mybugfix
 
</pre>
 
</pre>
  
=== switch (checking out a branch) ===
+
=== switch (проверка ветки) ===
To switch to an existing ''local'' branch '''mybugfix''', you can use the checkout command:
+
Чтобы переключиться на существующую ''локальную'' ветку '''mybugfix''', вы можете использовать команду checkout:
 
<pre>
 
<pre>
 
git checkout mybugfix
 
git checkout mybugfix
 
</pre>
 
</pre>
this will check out branch mybugfix. If there are any uncommitted changes which would cause a conflict, git will refuse the checkout.
+
Это проверит ветку mybugfix. Если есть какие-либо незафиксированные изменения, которые могут вызвать конфликт, git откажется от проверки.
  
 
+
Чтобы переключиться на ''отдаленную'' ветку `mybugfix2`, которая еще не существует локально, вы также можете использовать команду checkout:
 
 
To switch to a ''remote'' branch `mybugfix2`, which does not exist yet locally, you can also use the checkout command:
 
 
<pre>
 
<pre>
 
git checkout mybugfix2
 
git checkout mybugfix2
 
</pre>
 
</pre>
this will check out branch mybugfix2 and automatically set it up to track the remote branch.
+
Это проверит ветку mybugfix2 и автоматически настроит ее для отслеживания удаленной ветки.
Here again, if there are any uncommitted changes which would cause a conflict, git will refuse the checkout.
+
Здесь то же: если есть какие-либо незафиксированные изменения, которые могут вызвать конфликт, git откажется от проверки.
  
Note that if the branch does not exist remotely, this will simply create a new branch locally. It is better to be explicit:
+
Обратите внимание, что если ветка не существует удаленно, это просто создаст новую ветку локально. Лучше быть явным:
 
<pre>
 
<pre>
 
git checkout -b mybugfix2 --track origin/mybugfix2
 
git checkout -b mybugfix2 --track origin/mybugfix2
 
</pre>
 
</pre>
  
If you created a branch locally which does not yet exist on the server, made some modifications, and you wish to push this branch to the server, you must tell this to git when pushing:
+
Если вы создали ветку локально, которая еще не существует на сервере, внесли некоторые изменения и хотите отправить эту ветку на сервер, вы должны сообщить об этом git при нажатии:
 
<pre>
 
<pre>
 
git push -u origin/mybugfix mybugfix
 
git push -u origin/mybugfix mybugfix
 
</pre>
 
</pre>
the '''-u origin/mybugfix''' tells git all it needs to know to connect the local with the remote branch.
+
'''-u origin/mybugfix''' сообщает git все, что ему нужно знать, чтобы соединить локальную ветку с удаленной веткой.
  
 
=== revert ===
 
=== revert ===
==== Revert the entire working tree ====
+
==== Возврат всего рабочего дерева ====
If you have made some changes locally and wish to undo them, you can do a ''hard reset'' in git:
+
'''Если вы внесли некоторые изменения локально и хотите отменить их, вы можете выполнить ''hard reset'' в git:'''
 
<pre>
 
<pre>
 
git reset --hard
 
git reset --hard
 
</pre>
 
</pre>
This will undo any changes you made in the entire checkout, including any [[FPC_git#commit|staged changes]].
+
Это отменит любые изменения, внесенные вами во время полного клонирования, включая любые [[FPC_git/ru#commit|staged changes]].
  
==== Revert changes to specific files/directories ====
+
==== Отменить изменения в определенных файлах/каталогах ====
You cannot undo changes to individual files with <tt>git reset --hard</tt>. Instead, use
+
Вы не можете отменить изменения в отдельных файлах с помощью <tt>git reset --hard</tt>. Вместо этого используйте
 
<pre>
 
<pre>
 
git checkout <pathspec>
 
git checkout <pathspec>
 
</pre>
 
</pre>
<tt>pathspec</tt> can be any combination of files and directories. Note that if the files had [[FPC_git#commit|staged changes]], this command will restore the staged version rather than the last committed version.
+
<tt>pathspec</tt> может быть любой комбинацией файлов и каталогов. Обратите внимание, что если файлы были [[FPC_git/ru#commit|staged changes]], эта команда восстановит запланированные изменения, а не последнюю зафиксированную версию.
  
{{Note|At first sight, the git <tt>checkout</tt> command replaces an arbitrary collection of svn commands. The reason is that its operation is defined as "update the files in my working tree to match the specified staged/committed version of the files". So switching to a branch corresponds to getting the version of the files from that branch, while reverting corresponds to the latest version of the files from the current branch.}}
+
{{Note|На первый взгляд, команда git checkout заменяет произвольный набор команд svn. Причина в том, что его операция определяется как «обновить файлы в моем рабочем дереве, чтобы они соответствовали указанной запланированной/зафиксированной версии файлов». Таким образом, переключение на ветку соответствует получению версии файлов из этой ветки, а возврат соответствует последней версии файлов из текущей ветки.}}
  
=== merge (merging the changes in 2 branches) ===
+
=== merge (объединение изменений в 2-х ветках) ===
To merge changes in 2 branches, you use the ''merge'' command. If we want to merge the changes in ''mybugfix'' to ''fixes'' then we do:
+
Чтобы объединить изменения в 2 ветках, вы используете команду ''merge''(объединить). Если мы хотим объединить изменения в ''mybugfix'' с  ''fixes'', мы делаем:
 
<pre>
 
<pre>
 
git checkout fixes
 
git checkout fixes
Line 322: Line 321:
 
</pre>
 
</pre>
  
=== blame (check who made modifications) ===
+
=== blame (проверка, кто внес изменения) ===
To see who changes what line (and in what commit) svn offers you the 'blame' command. The same command exists in git.
+
Чтобы увидеть, кто в какой строке (и в каком коммите) что-то поменял, svn предлагает вам команду 'blame'(обвинение :). Такая же команда существует в git.
 
<pre>
 
<pre>
 
git blame yourfile.pas
 
git blame yourfile.pas
 
</pre>
 
</pre>
  
=== status (check status of files) ===
+
=== status (проверка статуса файлов) ===
To see whether there are any changed files in your working repository, svn offers the 'status' command. The same command exists in git.
+
Чтобы увидеть, есть ли какие-либо измененные файлы в вашем рабочем репозитории, svn предлагает команду 'status'. Такая же команда существует в git.
 
<pre>
 
<pre>
 
git status  
 
git status  
 
</pre>
 
</pre>
will present you with all changed, staged and new files in the repository.
+
представит вам все измененные, запланированные к изменению и новые файлы в репозитории.
  
If you want only the status of files below a certain directory, you can specify the name of the directory. So to get the changes in the current working directory (or below) that would be:
+
Если вам нужен только статус файлов в определенном каталоге, вы можете указать имя каталога. Итак, чтобы получить изменения в текущем рабочем каталоге (или ниже), это будет:
 
<pre>
 
<pre>
 
git status .
 
git status .
 
</pre>
 
</pre>
will present you with all changed, staged and new files in the current directory. This is the default behaviour of svn.
+
представит вам все измененные, запланированные к изменению и новые файлы в текущем каталоге. Это поведение svn по умолчанию.
  
=== shelve (temporarily undo changes) ===
+
=== shelve (временная отмена изменений) ===
Subversion has an (experimental) feature that allows to temporarily set aside changes to your working copy : shelve. This feature exists since a long time in git and is called stash:
+
В Subversion есть (экспериментальная) функция, которая позволяет временно откладывать изменения в вашей рабочей копии: shelve. Эта функция существует в git давно и называется stash:
 
<pre>
 
<pre>
 
git stash  
 
git stash  
 
</pre>
 
</pre>
will set aside any changes to the working copy, and restore the working copy to the state it would be in if you did a 'git pull' (or svn update).
+
отменит любые изменения в рабочей копии и восстановит рабочую копию до состояния, в котором она была бы, если бы вы выполнили 'git pull' (или svn update).
  
To reapply the changes you set aside to the working copy, and to remove them from the list of stashes at the same time, you can execute the following command:
+
Чтобы повторно применить внесенные вами изменения к рабочей копии и одновременно удалить их из списка временно отмененных, вы можете выполнить следующую команду:
 
<pre>
 
<pre>
 
git stash pop
 
git stash pop
 
</pre>
 
</pre>
  
If any conflicts occur, you can
+
Если возникнут какие-либо конфликты, вы можете
* [[#FPC_Git#Resolve|resolve]] them, or
+
 
* use [[FPC_git#revert|git reset --hard]] to revert all files again
+
* [[FPC_git/ru#Resolve|resolve]] (уладить) их, или
In either case, the stash will not be touched when conflicts occurred while applying it. If you still with to remove it, you can do so with
+
* Используя [[FPC_git/ru#revert|git reset --hard]], чтобы снова вернуть все файлы
 +
В любом случае временная отмена изменений не будет затронута, если при его применении возникнут конфликты. Если вам все еще нужно удалить ее, вы можете сделать это с помощью
 
<pre>
 
<pre>
 
git stash drop
 
git stash drop
 
</pre>
 
</pre>
  
=== info (get working dir and server info) ===
+
=== info (получение информации о рабочем каталоге и сервере) ===
In subversion, you can get information about the current working directory and remote server configuration using ''svn info''.
+
В Subversion вы можете получить информацию о текущем рабочем каталоге и конфигурации удаленного сервера, используя ''svn info''.
Since git is a distributed system, no direct equivalent of the info command exists: there is no single server, and the revision number as known in subversion does not exist.
+
Поскольку git - это распределенная система, прямого эквивалента команды info не существует: нет единого сервера, и номер версии, известный в Subversion, не существует.
  
The following script attempts to display similar information as the ''svn info'' command:
+
Следующий скрипт пытается отобразить информацию, аналогичную команде ''svn info'':
 
<pre>
 
<pre>
 
#!/bin/bash
 
#!/bin/bash
Line 409: Line 409:
 
</pre>
 
</pre>
  
Note that this script will also work in the Windows environment if you have the windows git client installed, because it comes with a minimal unix environment.
+
Обратите внимание, что этот сценарий также будет работать в среде Windows, если у вас установлен клиент git для Windows, поскольку он поставляется с минимальной окружением unix.
  
=== file properties (EOL handling etc.) ===
+
=== Свойства файла (обработка EOL и т. д.) ===
Subversion allows you to set some properties on files. There are 'reserved' properties that svn itself uses, for example to handle EOL handling and file type.
+
Subversion позволяет вам задавать некоторые свойства файлов. Существуют 'reserved' (зарезервированные) свойства, которые использует сама svn, например, для управления обработки EOL и типа файла.
Because git operates on diffs and not on files, no similar concept exists.
+
Поскольку git работает с diff'ами, а не с файлами, подобной концепции не существует.
  
However, git does allow you to set global or local attributes for classes of files. These are in the ''.gitattributes'' file. That file should be located in the root of your repository,
+
Однако git позволяет вам устанавливать глобальные или локальные атрибуты для классов файлов. Они находятся в файле ''.gitattributes''. Этот файл должен находиться в корне вашего репозитория,
and can contain some attributes. For example:
+
и может содержать некоторые атрибуты. Например
 
<pre>
 
<pre>
 
*              text=auto
 
*              text=auto
Line 424: Line 424:
 
*.jpg -text
 
*.jpg -text
 
</pre>
 
</pre>
This is a regular file which you can (and must) add with ''git add'' so it is saved for all users.
+
Это обычный файл, который вы можете (и должны) добавить с помощью''git add'', чтобы он сохранялся для всех пользователей.
  
 
[[Category: Version Control]]
 
[[Category: Version Control]]

Latest revision as of 20:09, 9 August 2021

English (en) русский (ru)

Настройка Git

Расположение репозитория Git

Репозитории Git размещены на Gitlab:

Компилятор FPC, RTL, пакеты и утилиты находятся здесь:

https://gitlab.com/freepascal.org/fpc/source

URL-адрес для клонирования репозитория:

https://gitlab.com/freepascal.org/fpc/source.git
git clone https://gitlab.com/freepascal.org/fpc/source.git

Репозиторий документации Git находится здесь:

https://gitlab.com/freepascal.org/fpc/documentation

URL-адрес для клонирования репозитория документации:

https://gitlab.com/freepascal.org/fpc/documentation.git
git clone https://gitlab.com/freepascal.org/fpc/documentation.git

Репозиторий Git веб-сайта находится здесь:

https://gitlab.com/freepascal.org/fpc/website

URL-адрес для клонирования репозитория веб-сайта:

https://gitlab.com/freepascal.org/fpc/website.git
git clone https://gitlab.com/freepascal.org/fpc/website.git

Ваша идентификация в git

Чтобы ваши коммиты были распознаны, настройте локальный (а еще лучше глобальный) git Установка, чтобы использовать адрес, связанный с вашей учетной записью gitlab.

git config --global user.email your.email.user@youremail.host

Это установит ваш адрес электронной почты для всех репозиториев git, которые вы используете, и позволит интерфейсу gitlab правильно связывать коммиты с пользователями в своем HTML-интерфейсе.

Если у вас несколько учетных записей gitlab (или даже github), вы можете предпочесть установить этот адрес электронной почты только локально:

git config --local user.email your.email.user@youremail.host

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

HTTP-доступ и учетные данные

Если вы получаете доступ к репозиторию с помощью HTTPS, по умолчанию git запрашивает имя пользователя и пароль. Вы можете указать git хранить их постоянно, введите следующую команду:

git config --global credential.helper store

Есть и другие возможности для хранения этой информации. Более подробную информацию можно найти на

https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage

Использование токенов доступа

Вы можете использовать токен доступа и доступ по протоколу HTTPS, это имеет некоторые преимущества. Это поддерживается большинством современных клиентов git:

https://knasmueller.net/gitlab-authenticate-using-access-token

и здесь вы можете увидеть, как это сделать на gitlab:

https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html

Преимущество использования токена доступа заключается в том, что ему могут быть предоставлены ограниченные права на gitlab, например, только доступ к репозиторию. Это также означает, что вы можете легко включить 2FA (двухфакторная аутентификация) для своей учетной записи gitlab.

Модель ветвления

На первом этапе будет использоваться модель ветвления, используемая в Subversion: исправления вносятся в основной ветке, а затем объединяются в ветку исправлений.

На более позднем этапе модель ветвления может быть изменена на одну из многих схем ветвления git.

Git-клиенты Windows

В macOS, Linux и BSD команда git устанавливается вместе с системным диспетчером пакетов (в macOS необходимо установить инструменты командной строки XCode). В Windows необходимо установить отдельный клиент git. Их много, но наиболее популярными являются следующие:

  • Git для Windows: клиент командной строки с оболочкой bash, поэтому вы можете копировать и вставлять команды, которые вы найдете в Интернете:
https://gitforwindows.org/
  • TortoiseGit интегрируется с проводником Windows, как и TortoiseSVN:
https://tortoisegit.org/
если у вас уже установлен TortoisSVN, оба могут работать бок о бок.
  • Sourcetree - бесплатный клиент для Windows и macOS:
https://www.sourcetreeapp.com/
сделано людьми из bitbucket.
  • Smartgit работает в Windows, Linux и macOS:
https://www.syntevo.com/smartgit/
  • Редакторы VSCode и Atom имеют встроенную поддержку git.

Понятия и различия между SVN и GIT

Несколько "полезных" отличий: FPC_git_concepts

Общие операции SVN в Git

Check out

Получение новой копии репозитория в git называется «клонированием».

git clone https://gitlab.com/freepascal.org/testconversion

Как и в случае с Subversion, вы можете дать ему другое имя:

git clone https://gitlab.com/freepascal.org/testconversion myconversion

Эта операция может занять некоторое время, исходная база FPC большая.

Update

Обновление исходного кода с учетом изменений в отдаленном репозитории в git называется 'pulling'(вытягивание, извлечение):

git pull

Обратите внимание, что в отличие от subversion, git всегда обновляет весь репозиторий.

Light bulb  Примечание: В то время как git будет извлекать и применять изменения ко всем отдаленным веткам с помощью этой команды, из всех локальных веток он обновит только ту, которая в настоящее время проверяется (для получения дополнительной информации об отдаленных/локальных ответвлениях см. ls (listing branches)). Чтобы обновить другие локальные ветки, вам нужно switch(переключиться) на них и либо снова выполнить git pull, либо выполнить rebase/merge (будет задокументировано, как только мы решим, какую стратегию использовать).

Чтобы история коммитов была как можно более линейной и избегала коммитов слиянием (merge commits), рекомендуется выполнять rebase (перебазирование) при извлечении.

git pull --rebase

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

git config pull.rebase true

Resolve

Если у вас есть конфликты в svn после обновления или слияния, вы исправляете конфликты, а затем сообщаете svn, что все в порядке, с помощью команды resolved(урегулировано, разрешено).

В git конфликты обычно возникают при merging (слиянии) или при применении shelved/stashed (временно отложенные/запланированные) изменений.

Когда возникают конфликты, то

  1. Изменения в файлах, которые не конфликтуют, будут staged (запланированными).
  2. Изменения в файлах, которые конфликтуют, будут применены без промежуточной обработки к рабочей копии (так что простой diff будет показывать только конфликтующие изменения)

Чтобы разрешить конфликты,

  1. Если вы хотите зафиксировать урегулированную версию файла, отметьте ее как resolved (улаженную), также сделав ее staging/adding.
  2. Если вы хотите просто избавиться от статуса "оба изменены" (= конфликтуют) без добавления файла, используйте git reset file

После того, как все файлы были поставлены или помечены как не конфликтующие, вы можете сделать commit (зафиксировать) (будут зафиксированы только промежуточные файлы).

add (добавление новых файлов)

Subversion использует команду add для добавления файла в систему управления версиями. В git это не исключение: Если вы хотите добавить файл, вы должны сначала добавить его, например:

git add newfile.pas

Затем вы должны (как и в Subversion) сделать commit (зафиксировать) этот только что добавленный файл.

rm (Удаление файлов)

Subversion использует команду rm для удаления файла из системы управления версиями. В git это не исключение:

git rm nolongerneededfile.pas

Затем вы должны (как и в Subversion) сделать commit (зафиксировать) этот удаленный файл.

mv (переименование файлов)

Subversion использует команду rm для переименования файла в системе управления версиями. В git это не исключение:

git mv oldfile.pas newfile.pas

После этого вы должны (как и в Subversion) сделать commit (зафиксировать) это изменение.

Как и в Subversion, вы можете переместить один или несколько файлов в другой каталог:

git mv file1.pas file2.pas somesubdir

commit

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

git add myfile.pas

Это планирует фиксацию файла (в git это называется staging(запланированные изменения) - прим.перев: git staging - область, отслеживаемая git, в которой находятся файлы еще не попавшие в commit, поэтому изменения теперь становятся «совершаемые поэтапно»). Вы можете добавить столько файлов, сколько захотите, вот так.

Light bulb  Примечание: Легко помнить, что svn требует того же для вновь добавленных файлов. Git распространяет это на все изменения, потому что таким образом вы можете не только выборочно планировать отдельные новые файлы для следующего коммита, но и вносить изменения в существующие файлы. Противоположность git add - это git reset (без параметра --hard!)
Light bulb  Примечание: Чтобы увидеть изменения, которые были staged/scheduled (поставлены/запланированы) для фиксации, используйте git diff --cached. Обычный git diff покажет локальные изменения, которые (пока) не поставлены.

Когда вы будете готовы зафиксировать то, что запланировали, вы можете сделать commit:

git commit -m '* Some nice comment telling what you did'

Фактически, если вы торопитесь и знаете, что хотите зафиксировать файл, вы можете объединить две команды:

git commit -m '* Some nice comment telling what you did' myfile.pas

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

git commit -m '* Some nice comment telling what you did' -a

Но на самом деле не рекомендуется использовать этот способ, так как он зафиксирует все изменения в вашей локальной копии, а не только в текущем рабочем каталоге.

На этом этапе ваши изменения были сохранены локально, но еще не отправлены в отдаленный репозиторий. Для этого необходимо дополнительно отправить изменения в отдаленный репозиторий. Это называется pushing (публикацией):

git push

Это отправит все локально зафиксированные изменения на сервер. Очевидно, отправляются только те изменения, которые еще не были отправлены ранее.

diff (показать изменения в рабочей копии)

В svn вы можете увидеть изменения, которые были сделаны, но еще не зафиксированы с помощью diff. Это также верно в git:

git diff

Это покажет все изменения в вашей рабочей копии, которые еще не поставлены (не запланированы для фиксации).

Вы также можете просмотреть изменения для одного файла:

git diff myfile.pas

Это покажет неустановленные изменения, внесенные в вашу рабочую копию myfile.pas.

Если вы уже запланировали для фиксации один или несколько файлов (т.е. отмечены для включения в следующий коммит), приведенное выше не будет отображать их в сгенерированном файле diff. Если вы хотите видеть запланированные изменения (и только запланированные изменения), используйте параметр командной строки --cached:

git diff --cached

diff (показать изменения, выполненные при коммите)

В svn вы можете увидеть изменения, внесенные коммитом, с помощью svn diff -c <revision>. В git вместо этого вы используете команду show:

git show -p <commit_hash_or_branch_or_tag>

Если вы опустите хеш фиксации, вместо этого будет отображаться последняя фиксация в текущей ветке.

log (показать коммиты в ветке)

В svn вы можете увидеть коммиты в ветке с помощью svn log. То же самое работает в git:

git log

Здесь будут перечислены хэши коммитов (строка, которую git использует для идентификации коммитов, аналогично номерам ревизий в svn), за которыми следуют сообщения журнала. Если вы также хотите увидеть, какие файлы были изменены, используйте

git log --stat

ls (список веток)

Чтобы получить список веток в Subversion, вы используете команду 'ls' с URL-адресом сервера. По соглашению, все каталоги в разделе '/branches' являются именами ветвей. Ветки всегда существуют как на клиенте(ах), так и на сервере.

В git ветки формализованы как часть системы управления версиями: команды имеют дело конкретно с ветвями, а не с путями, которые рассматриваются как ветки. Кроме того, git различает remote branches (отдаленные ветки) (ветки, которые существуют в репозитории, который вы клонировали, то есть в данном случае на сервере gitlab), и local branches (локальные ветки) (ветки, которые вы создали на ваша машине после клонирования). Репозиторий, который вы клонировали, по умолчанию упоминается с использованием псевдонима "origin", а имена удаленных ветвей добавляются к этому псевдониму.

Список локальных веток можно получить, используя:

git branch 

По умолчанию единственная локальная ветка, которая у вас будет - это main, что соответствует svn trunk. Эта локальная ветвь создается автоматически при выполнении начальной операции клонирования.

Список отдаленных веток можно получить, используя:

git branch -r

По умолчанию отдаленные ветки - это ветки, существующие в репозитории на сервере gitlab, чей псевдоним - "origin". Локальная main ветвь автоматически отслеживает (привязана к) отдаленную origin/main ветвь. Из-за этого отслеживания выполнение git pull отвечает за команду git push, имеющаяся у вас полученная ваша локальная ветка main будет синхронизироваться до gitlab. Посмотрите, как создать больше локальных веток и как связать их с удаленными ветвями. Смотрите switch, как создать больше локальных веток и как связать их с удаленными ветвями.

Light bulb  Примечание: Хотя git всегда загружает все ветки и их коммиты по умолчанию при клонировании или извлечении, и хотя вы можете использовать их контент без сетевого подключения, вы не можете напрямую работать с отдаленными ветвями (поскольку они отдаленные, а не локальные). Вместо этого вы должны создать локальную ветку, которая «отслеживает» эту отдаленную ветку.
Light bulb  Примечание: Не проверяйте напрямую отдаленную ветку. Это переведет вас в так называемое состояние «отключенной HEAD»: ваша рабочая копия будет содержать содержимое из этой ветки, но вы не можете ничего зафиксировать, поскольку вы можете фиксировать только локальные ветки. Вы можете выйти из состояния «отключенной HEAD», просто проверив другую ветку.

copy (создание ветки)

Чтобы создать ветку из текущей ситуации с рабочим каталогом, вы можете создать такую ​​ветку:

git branch mybugfix

Это создаст ветку mybugfix из текущей извлеченной ветки при текущей фиксации. Но это еще не делает эту ветку активной.

Сначала вам нужно проверить только что созданную ветку:

git checkout mybugfix

Две операции также можно комбинировать с помощью одной команды:

git checkout -b mybugfix

switch (проверка ветки)

Чтобы переключиться на существующую локальную ветку mybugfix, вы можете использовать команду checkout:

git checkout mybugfix

Это проверит ветку mybugfix. Если есть какие-либо незафиксированные изменения, которые могут вызвать конфликт, git откажется от проверки.

Чтобы переключиться на отдаленную ветку `mybugfix2`, которая еще не существует локально, вы также можете использовать команду checkout:

git checkout mybugfix2

Это проверит ветку mybugfix2 и автоматически настроит ее для отслеживания удаленной ветки. Здесь то же: если есть какие-либо незафиксированные изменения, которые могут вызвать конфликт, git откажется от проверки.

Обратите внимание, что если ветка не существует удаленно, это просто создаст новую ветку локально. Лучше быть явным:

git checkout -b mybugfix2 --track origin/mybugfix2

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

git push -u origin/mybugfix mybugfix

-u origin/mybugfix сообщает git все, что ему нужно знать, чтобы соединить локальную ветку с удаленной веткой.

revert

Возврат всего рабочего дерева

Если вы внесли некоторые изменения локально и хотите отменить их, вы можете выполнить hard reset в git:

git reset --hard

Это отменит любые изменения, внесенные вами во время полного клонирования, включая любые staged changes.

Отменить изменения в определенных файлах/каталогах

Вы не можете отменить изменения в отдельных файлах с помощью git reset --hard. Вместо этого используйте

git checkout <pathspec>

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

Light bulb  Примечание: На первый взгляд, команда git checkout заменяет произвольный набор команд svn. Причина в том, что его операция определяется как «обновить файлы в моем рабочем дереве, чтобы они соответствовали указанной запланированной/зафиксированной версии файлов». Таким образом, переключение на ветку соответствует получению версии файлов из этой ветки, а возврат соответствует последней версии файлов из текущей ветки.

merge (объединение изменений в 2-х ветках)

Чтобы объединить изменения в 2 ветках, вы используете команду merge(объединить). Если мы хотим объединить изменения в mybugfix с fixes, мы делаем:

git checkout fixes
git merge mybugfix

blame (проверка, кто внес изменения)

Чтобы увидеть, кто в какой строке (и в каком коммите) что-то поменял, svn предлагает вам команду 'blame'(обвинение :). Такая же команда существует в git.

git blame yourfile.pas

status (проверка статуса файлов)

Чтобы увидеть, есть ли какие-либо измененные файлы в вашем рабочем репозитории, svn предлагает команду 'status'. Такая же команда существует в git.

git status 

представит вам все измененные, запланированные к изменению и новые файлы в репозитории.

Если вам нужен только статус файлов в определенном каталоге, вы можете указать имя каталога. Итак, чтобы получить изменения в текущем рабочем каталоге (или ниже), это будет:

git status .

представит вам все измененные, запланированные к изменению и новые файлы в текущем каталоге. Это поведение svn по умолчанию.

shelve (временная отмена изменений)

В Subversion есть (экспериментальная) функция, которая позволяет временно откладывать изменения в вашей рабочей копии: shelve. Эта функция существует в git давно и называется stash:

git stash 

отменит любые изменения в рабочей копии и восстановит рабочую копию до состояния, в котором она была бы, если бы вы выполнили 'git pull' (или svn update).

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

git stash pop

Если возникнут какие-либо конфликты, вы можете

  • resolve (уладить) их, или
  • Используя git reset --hard, чтобы снова вернуть все файлы

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

git stash drop

info (получение информации о рабочем каталоге и сервере)

В Subversion вы можете получить информацию о текущем рабочем каталоге и конфигурации удаленного сервера, используя svn info. Поскольку git - это распределенная система, прямого эквивалента команды info не существует: нет единого сервера, и номер версии, известный в Subversion, не существует.

Следующий скрипт пытается отобразить информацию, аналогичную команде svn info:

#!/bin/bash

# author: Duane Johnson
# email: duane.johnson@gmail.com
# date: 2008 Jun 12
# license: MIT
# 
# Based on discussion at http://kerneltrap.org/mailarchive/git/2007/11/12/406496

pushd . >/dev/null

# Find base of git directory
while [ ! -d .git ] && [ ! `pwd` = "/" ]; do cd ..; done

# Show various information about this git directory
if [ -d .git ]; then
  echo "== Remote URL: `git remote -v`"

  echo "== Remote Branches: "
  git branch -r
  echo

  echo "== Local Branches:"
  git branch
  echo

  echo "== Configuration (.git/config)"
  cat .git/config
  echo

  echo "== Most Recent Commit"
  git --no-pager log  -n1
  echo

  echo "Type 'git log' for more commits, or 'git show' for full commit details."
else
  echo "Not a git repository."
fi

popd >/dev/null

Обратите внимание, что этот сценарий также будет работать в среде Windows, если у вас установлен клиент git для Windows, поскольку он поставляется с минимальной окружением unix.

Свойства файла (обработка EOL и т. д.)

Subversion позволяет вам задавать некоторые свойства файлов. Существуют 'reserved' (зарезервированные) свойства, которые использует сама svn, например, для управления обработки EOL и типа файла. Поскольку git работает с diff'ами, а не с файлами, подобной концепции не существует.

Однако git позволяет вам устанавливать глобальные или локальные атрибуты для классов файлов. Они находятся в файле .gitattributes. Этот файл должен находиться в корне вашего репозитория, и может содержать некоторые атрибуты. Например

*               text=auto
*.txt		text
*.vcproj	text eol=crlf
*.sh		text eol=lf
*.jpg		-text

Это обычный файл, который вы можете (и должны) добавить с помощьюgit add, чтобы он сохранялся для всех пользователей.