-
1. ŠŠ¾ŃŠµŃŠ¾Šŗ
-
2. ŠŃŠ½Š¾Š²ŠøŃŠµ на Git
- 2.1 ŠŠ¾Š±ŠøŠ²Š°Ńе ŃŠŗŠ»Š°Š“ŠøŃŃŠµ за Git
- 2.2 Š”Š½ŠøŠ¼Š°ŃŠµ на ŠæŃомени во ŃŠŗŠ»Š°Š“ŠøŃŃŠµŃо
- 2.3 ŠŃŠøŠŗŠ°Š¶ŃŠ²Š°Ńе на ŠøŃŃŠ¾ŃŠøŃŠ°Ńа на извŃŃŃŠ²Š°Ńе
- 2.4 ŠŠ¾Š½ŠøŃŃŃŠ²Š°Ńе на неŃŃŠ°Ńа
- 2.5 Working with Remotes
- 2.6 Tagging
- 2.7 Git ŠŠ»ŠøŃŠ°ŃŠø
- 2.8 ŠŠ°ŠŗŠ»ŃŃŠ¾Šŗ
-
3. ŠŃŠ°Š½ŠµŃŠµ во Git
-
4. Git на Š”ŠµŃŠ²ŠµŃ
- 4.1 ŠŃŠ¾ŃŠ¾ŠŗŠ¾Š»ŠøŃе
- 4.2 ŠŠ¾Š±ŠøŠ²Š°Ńе на Git на ŃŠµŃвеŃ
- 4.3 ŠŠµŠ½ŠµŃŠøŃŠ°Ńе на Š²Š°ŃŠøŠ¾Ń SSH ŃŠ°Š²ŠµŠ½ ŠŗŠ»ŃŃ
- 4.4 ŠŠ¾ŃŃŠ°Š²ŃŠ²Š°ŃŠµ на ŃŠµŃŠ²ŠµŃŠ¾Ń
- 4.5 ŠŠøŃ Гемон
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 ŠŠæŃŠøŠø за Š“Š¾Š¼Š°ŃŠøŠ½Šø на ŃŃŠµŃŠø Š»ŠøŃŠ°
- 4.10 ŠŠ°ŠŗŠ»ŃŃŠ¾Šŗ
-
5. ŠŠøŃŃŃŠøŠ±ŃŠøŃŠ°Š½ Git
-
6. GitHub
- 6.1 ŠŠ¾ŃŃŠ°Š²ŃŠ²Š°ŃŠµ ŃŠ¼ŠµŃка Šø ŠŗŠ¾Š½ŃŠøŠ³ŃŃŠ°ŃŠøŃŠ°
- 6.2 ŠŃŠøŠ“Š¾Š½ŠµŃ ŠŗŠ¾Š½ ŠæŃŠ¾ŠµŠŗŃ
- 6.3 ŠŠ“ŃŠ¶ŃŠ²Š°ŃŠµ на ŠæŃоекŃ
- 6.4 Š”ŠæŠµŃŠøŃални Š“Š°ŃŠ¾Ńеки
- 6.5 Š£ŠæŃŠ°Š²ŃŠ²Š°ŃŠµ ŃŠ¾ Š¾ŃŠ³Š°Š½ŠøŠ·Š°ŃŠøŃŠ°
- 6.6 Š”ŠŗŃŠøŠæŃŠøŃŠ°Ńе на GitHub
- 6.7 ŠŠ°ŠŗŠ»ŃŃŠ¾Šŗ
-
7. Git ŠŠ»Š°ŃŠŗŠø
- 7.1 Revision Selection
- 7.2 ŠŠ½ŃŠµŃŠ°ŠŗŃивно ŃŃŠ°Š¶ŠøŃŠ°ŃŠµ
- 7.3 Stashing and Cleaning
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Rewriting History
- 7.7 Reset Demystified
- 7.8 ŠŠ°ŠæŃеГно ŃŠæŠ¾ŃŃŠ²Š°Ńе
- 7.9 Rerere
- 7.10 ŠŠµŠ±Š°Š³ŠøŃŠ°ŃŠµ ŃŠ¾ Git
- 7.11 Submodules
- 7.12 ŠŠ±ŠøŠ²Š°Ńе
- 7.13 ŠŠ°Š¼ŠµŠ½ŃŠ²Š°ŃŠµ
- 7.14 Š”ŠŗŠ»Š°Š“ŠøŃŠ°Ńе на ŠøŠ½Š³ŠµŃŠµŠ½ŃŠøŠø
- 7.15 ŠŠ°ŠŗŠ»ŃŃŠ¾Šŗ
-
8. ŠŠµŃŃŠ¾Š½Š°Š»ŠøŠ·Š°ŃŠøŃŠ° на Git
- 8.1 Git Configuration
- 8.2 Git ŠŃŃŠøŠ±ŃŃŠø
- 8.3 Git Hooks
- 8.4 An Example Git-Enforced Policy
- 8.5 ŠŠ°ŠŗŠ»ŃŃŠ¾Šŗ
-
9. Git Šø Š“ŃŃŠ³Šø ŃŠøŃŃŠµŠ¼Šø
-
10. ŠŠ½Š°ŃŃŠµŃноŃŃŠ° на Git
- 10.1 Plumbing and Porcelain
- 10.2 Git Objects
- 10.3 Git References
- 10.4 Packfiles
- 10.5 The Refspec
- 10.6 Transfer Protocols
- 10.7 Maintenance and Data Recovery
- 10.8 Environment Variables
- 10.9 ŠŠ°ŠŗŠ»ŃŃŠ¾Šŗ
-
A1. Appendix A: Git во Š“ŃŃŠ³Šø околини
- A1.1 Graphical Interfaces
- A1.2 Git in Visual Studio
- A1.3 Git in Eclipse
- A1.4 Git in Bash
- A1.5 Git in Zsh
- A1.6 Git in Powershell
- A1.7 ŠŠ°ŠŗŠ»ŃŃŠ¾Šŗ
-
A2. Appendix B: ŠŠ¼ŠµŃŠ½ŃŠ²Š°Ńе на Git во Š²Š°ŃŠøŃе Š°ŠæŠ»ŠøŠŗŠ°ŃŠøŠø
- A2.1 Command-line Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
-
A3. Appendix C: Git команГи
- A3.1 Setup and Config
- A3.2 Getting and Creating Projects
- A3.3 Basic Snapshotting
- A3.4 Branching and Merging
- A3.5 Sharing and Updating Projects
- A3.6 Inspection and Comparison
- A3.7 Debugging
- A3.8 Patching
- A3.9 Email
- A3.10 External Systems
- A3.11 Administration
- A3.12 Plumbing Commands
10.3 ŠŠ½Š°ŃŃŠµŃноŃŃŠ° на Git - Git References
Git References
If you were interested in seeing the history of your repository reachable from commit, say, 1a410e
, you could run something like git log 1a410e
to display that history, but you would still have to remember that 1a410e
is the commit you want to use as the starting point for that history.
Instead, it would be easier if you had a file in which you could store that SHA-1 value under a simple name so you could use that simple name rather than the raw SHA-1 value.
In Git, these simple names are called āreferencesā or ārefsā; you can find the files that contain those SHA-1 values in the .git/refs
directory.
In the current project, this directory contains no files, but it does contain a simple structure:
$ find .git/refs
.git/refs
.git/refs/heads
.git/refs/tags
$ find .git/refs -type f
To create a new reference that will help you remember where your latest commit is, you can technically do something as simple as this:
$ echo 1a410efbd13591db07496601ebc7a059dd55cfe9 > .git/refs/heads/master
Now, you can use the head reference you just created instead of the SHA-1 value in your Git commands:
$ git log --pretty=oneline master
1a410efbd13591db07496601ebc7a059dd55cfe9 third commit
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit
You arenāt encouraged to directly edit the reference files; instead, Git provides the safer command git update-ref
to do this if you want to update a reference:
$ git update-ref refs/heads/master 1a410efbd13591db07496601ebc7a059dd55cfe9
Thatās basically what a branch in Git is: a simple pointer or reference to the head of a line of work. To create a branch back at the second commit, you can do this:
$ git update-ref refs/heads/test cac0ca
Your branch will contain only work from that commit down:
$ git log --pretty=oneline test
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit
Now, your Git database conceptually looks something like this:

When you run commands like git branch <branch>
, Git basically runs that update-ref
command to add the SHA-1 of the last commit of the branch youāre on into whatever new reference you want to create.
The HEAD
The question now is, when you run git branch <branch>
, how does Git know the SHA-1 of the last commit?
The answer is the HEAD file.
The HEAD file is a symbolic reference to the branch youāre currently on. By symbolic reference, we mean that unlike a normal reference, it doesnāt generally contain a SHA-1 value but rather a pointer to another reference. If you look at the file, youāll normally see something like this:
$ cat .git/HEAD
ref: refs/heads/master
If you run git checkout test
, Git updates the file to look like this:
$ cat .git/HEAD
ref: refs/heads/test
When you run git commit
, it creates the commit object, specifying the parent of that commit object to be whatever SHA-1 value the reference in HEAD points to.
You can also manually edit this file, but again a safer command exists to do so: git symbolic-ref
.
You can read the value of your HEAD via this command:
$ git symbolic-ref HEAD
refs/heads/master
You can also set the value of HEAD using the same command:
$ git symbolic-ref HEAD refs/heads/test
$ cat .git/HEAD
ref: refs/heads/test
You canāt set a symbolic reference outside of the refs style:
$ git symbolic-ref HEAD test
fatal: Refusing to point HEAD outside of refs/
Tags
We just finished discussing Gitās three main object types (blobs, trees and commits), but there is a fourth. The tag object is very much like a commit objectāāāit contains a tagger, a date, a message, and a pointer. The main difference is that a tag object generally points to a commit rather than a tree. Itās like a branch reference, but it never movesāāāit always points to the same commit but gives it a friendlier name.
As discussed in ŠŃŠ½Š¾Š²ŠøŃŠµ на Git, there are two types of tags: annotated and lightweight. You can make a lightweight tag by running something like this:
$ git update-ref refs/tags/v1.0 cac0cab538b970a37ea1e769cbbde608743bc96d
That is all a lightweight tag isāāāa reference that never moves.
An annotated tag is more complex, however.
If you create an annotated tag, Git creates a tag object and then writes a reference to point to it rather than directly to the commit.
You can see this by creating an annotated tag (using the -a
option):
$ git tag -a v1.1 1a410efbd13591db07496601ebc7a059dd55cfe9 -m 'test tag'
Hereās the object SHA-1 value it created:
$ cat .git/refs/tags/v1.1
9585191f37f7b0fb9444f35a9bf50de191beadc2
Now, run git cat-file -p
on that SHA-1 value:
$ git cat-file -p 9585191f37f7b0fb9444f35a9bf50de191beadc2
object 1a410efbd13591db07496601ebc7a059dd55cfe9
type commit
tag v1.1
tagger Scott Chacon <schacon@gmail.com> Sat May 23 16:48:58 2009 -0700
test tag
Notice that the object entry points to the commit SHA-1 value that you tagged. Also notice that it doesnāt need to point to a commit; you can tag any Git object. In the Git source code, for example, the maintainer has added their GPG public key as a blob object and then tagged it. You can view the public key by running this in a clone of the Git repository:
$ git cat-file blob junio-gpg-pub
The Linux kernel repository also has a non-commit-pointing tag objectāāāthe first tag created points to the initial tree of the import of the source code.
Remotes
The third type of reference that youāll see is a remote reference.
If you add a remote and push to it, Git stores the value you last pushed to that remote for each branch in the refs/remotes
directory.
For instance, you can add a remote called origin
and push your master
branch to it:
$ git remote add origin git@github.com:schacon/simplegit-progit.git
$ git push origin master
Counting objects: 11, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 716 bytes, done.
Total 7 (delta 2), reused 4 (delta 1)
To git@github.com:schacon/simplegit-progit.git
a11bef0..ca82a6d master -> master
Then, you can see what the master
branch on the origin
remote was the last time you communicated with the server, by checking the refs/remotes/origin/master
file:
$ cat .git/refs/remotes/origin/master
ca82a6dff817ec66f44342007202690a93763949
Remote references differ from branches (refs/heads
references) mainly in that theyāre considered read-only.
You can git checkout
to one, but Git wonāt point HEAD at one, so youāll never update it with a commit
command.
Git manages them as bookmarks to the last known state of where those branches were on those servers.