|
|
@ -36,14 +36,16 @@ To start up, create a subdirectory for it, change into that |
|
|
|
subdirectory, and initialize the git infrastructure with `git-init-db`: |
|
|
|
subdirectory, and initialize the git infrastructure with `git-init-db`: |
|
|
|
|
|
|
|
|
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
mkdir git-tutorial |
|
|
|
$ mkdir git-tutorial |
|
|
|
cd git-tutorial |
|
|
|
$ cd git-tutorial |
|
|
|
git-init-db |
|
|
|
$ git-init-db |
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
|
|
|
|
|
|
|
|
to which git will reply |
|
|
|
to which git will reply |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---------------- |
|
|
|
defaulting to local storage area |
|
|
|
defaulting to local storage area |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
which is just git's way of saying that you haven't been doing anything |
|
|
|
which is just git's way of saying that you haven't been doing anything |
|
|
|
strange, and that it will have created a local `.git` directory setup for |
|
|
|
strange, and that it will have created a local `.git` directory setup for |
|
|
@ -114,8 +116,8 @@ in your git repository. We'll start off with a few bad examples, just to |
|
|
|
get a feel for how this works: |
|
|
|
get a feel for how this works: |
|
|
|
|
|
|
|
|
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
echo "Hello World" >hello |
|
|
|
$ echo "Hello World" >hello |
|
|
|
echo "Silly example" >example |
|
|
|
$ echo "Silly example" >example |
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
|
|
|
|
|
|
|
|
you have now created two files in your working tree (aka 'working directory'), but to |
|
|
|
you have now created two files in your working tree (aka 'working directory'), but to |
|
|
@ -137,7 +139,7 @@ adding a new entry with the `\--add` flag (or removing an entry with the |
|
|
|
So to populate the index with the two files you just created, you can do |
|
|
|
So to populate the index with the two files you just created, you can do |
|
|
|
|
|
|
|
|
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
git-update-index --add hello example |
|
|
|
$ git-update-index --add hello example |
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
|
|
|
|
|
|
|
|
and you have now told git to track those two files. |
|
|
|
and you have now told git to track those two files. |
|
|
@ -146,12 +148,17 @@ In fact, as you did that, if you now look into your object directory, |
|
|
|
you'll notice that git will have added two new objects to the object |
|
|
|
you'll notice that git will have added two new objects to the object |
|
|
|
database. If you did exactly the steps above, you should now be able to do |
|
|
|
database. If you did exactly the steps above, you should now be able to do |
|
|
|
|
|
|
|
|
|
|
|
ls .git/objects/??/* |
|
|
|
|
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
$ ls .git/objects/??/* |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
and see two files: |
|
|
|
and see two files: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---------------- |
|
|
|
.git/objects/55/7db03de997c86a4a028e1ebd3a1ceb225be238 |
|
|
|
.git/objects/55/7db03de997c86a4a028e1ebd3a1ceb225be238 |
|
|
|
.git/objects/f2/4c74a2e500f5ee1332c86b94199f52b1d1d962 |
|
|
|
.git/objects/f2/4c74a2e500f5ee1332c86b94199f52b1d1d962 |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
which correspond with the objects with names of 557db... and f24c7.. |
|
|
|
which correspond with the objects with names of 557db... and f24c7.. |
|
|
|
respectively. |
|
|
|
respectively. |
|
|
@ -159,13 +166,17 @@ respectively. |
|
|
|
If you want to, you can use `git-cat-file` to look at those objects, but |
|
|
|
If you want to, you can use `git-cat-file` to look at those objects, but |
|
|
|
you'll have to use the object name, not the filename of the object: |
|
|
|
you'll have to use the object name, not the filename of the object: |
|
|
|
|
|
|
|
|
|
|
|
git-cat-file -t 557db03de997c86a4a028e1ebd3a1ceb225be238 |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git-cat-file -t 557db03de997c86a4a028e1ebd3a1ceb225be238 |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
where the `-t` tells `git-cat-file` to tell you what the "type" of the |
|
|
|
where the `-t` tells `git-cat-file` to tell you what the "type" of the |
|
|
|
object is. git will tell you that you have a "blob" object (ie just a |
|
|
|
object is. git will tell you that you have a "blob" object (ie just a |
|
|
|
regular file), and you can see the contents with |
|
|
|
regular file), and you can see the contents with |
|
|
|
|
|
|
|
|
|
|
|
git-cat-file "blob" 557db03 |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git-cat-file "blob" 557db03 |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
which will print out "Hello World". The object 557db03 is nothing |
|
|
|
which will print out "Hello World". The object 557db03 is nothing |
|
|
|
more than the contents of your file `hello`. |
|
|
|
more than the contents of your file `hello`. |
|
|
@ -202,7 +213,7 @@ In particular, let's not even check in the two files into git yet, we'll |
|
|
|
start off by adding another line to `hello` first: |
|
|
|
start off by adding another line to `hello` first: |
|
|
|
|
|
|
|
|
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
echo "It's a new day for git" >>hello |
|
|
|
$ echo "It's a new day for git" >>hello |
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
|
|
|
|
|
|
|
|
and you can now, since you told git about the previous state of `hello`, ask |
|
|
|
and you can now, since you told git about the previous state of `hello`, ask |
|
|
@ -210,7 +221,7 @@ git what has changed in the tree compared to your old index, using the |
|
|
|
`git-diff-files` command: |
|
|
|
`git-diff-files` command: |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git-diff-files |
|
|
|
$ git-diff-files |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
Oops. That wasn't very readable. It just spit out its own internal |
|
|
|
Oops. That wasn't very readable. It just spit out its own internal |
|
|
@ -222,12 +233,7 @@ To make it readable, we can tell git-diff-files to output the |
|
|
|
differences as a patch, using the `-p` flag: |
|
|
|
differences as a patch, using the `-p` flag: |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git-diff-files -p |
|
|
|
$ git-diff-files -p |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
which will spit out |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
|
|
|
|
diff --git a/hello b/hello |
|
|
|
diff --git a/hello b/hello |
|
|
|
index 557db03..263414f 100644 |
|
|
|
index 557db03..263414f 100644 |
|
|
|
--- a/hello |
|
|
|
--- a/hello |
|
|
@ -264,13 +270,15 @@ filenames with their contents (and their permissions), and we're |
|
|
|
creating the equivalent of a git "directory" object: |
|
|
|
creating the equivalent of a git "directory" object: |
|
|
|
|
|
|
|
|
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
git-write-tree |
|
|
|
$ git-write-tree |
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
|
|
|
|
|
|
|
|
and this will just output the name of the resulting tree, in this case |
|
|
|
and this will just output the name of the resulting tree, in this case |
|
|
|
(if you have done exactly as I've described) it should be |
|
|
|
(if you have done exactly as I've described) it should be |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---------------- |
|
|
|
8988da15d077d4829fc51d8544c097def6644dbb |
|
|
|
8988da15d077d4829fc51d8544c097def6644dbb |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
which is another incomprehensible object name. Again, if you want to, |
|
|
|
which is another incomprehensible object name. Again, if you want to, |
|
|
|
you can use `git-cat-file -t 8988d\...` to see that this time the object |
|
|
|
you can use `git-cat-file -t 8988d\...` to see that this time the object |
|
|
@ -299,14 +307,16 @@ that's exactly what `git-commit-tree` spits out, we can do this |
|
|
|
all with a sequence of simple shell commands: |
|
|
|
all with a sequence of simple shell commands: |
|
|
|
|
|
|
|
|
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
tree=$(git-write-tree) |
|
|
|
$ tree=$(git-write-tree) |
|
|
|
commit=$(echo 'Initial commit' | git-commit-tree $tree) |
|
|
|
$ commit=$(echo 'Initial commit' | git-commit-tree $tree) |
|
|
|
git-update-ref HEAD $commit |
|
|
|
$ git-update-ref HEAD $commit |
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
|
|
|
|
|
|
|
|
which will say: |
|
|
|
which will say: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---------------- |
|
|
|
Committing initial tree 8988da15d077d4829fc51d8544c097def6644dbb |
|
|
|
Committing initial tree 8988da15d077d4829fc51d8544c097def6644dbb |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
just to warn you about the fact that it created a totally new commit |
|
|
|
just to warn you about the fact that it created a totally new commit |
|
|
|
that is not related to anything else. Normally you do this only *once* |
|
|
|
that is not related to anything else. Normally you do this only *once* |
|
|
@ -349,7 +359,9 @@ didn't have anything to diff against. |
|
|
|
|
|
|
|
|
|
|
|
But now we can do |
|
|
|
But now we can do |
|
|
|
|
|
|
|
|
|
|
|
git-diff-index -p HEAD |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git-diff-index -p HEAD |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
(where `-p` has the same meaning as it did in `git-diff-files`), and it |
|
|
|
(where `-p` has the same meaning as it did in `git-diff-files`), and it |
|
|
|
will show us the same difference, but for a totally different reason. |
|
|
|
will show us the same difference, but for a totally different reason. |
|
|
@ -360,7 +372,9 @@ are obviously the same, so we get the same result. |
|
|
|
Again, because this is a common operation, you can also just shorthand |
|
|
|
Again, because this is a common operation, you can also just shorthand |
|
|
|
it with |
|
|
|
it with |
|
|
|
|
|
|
|
|
|
|
|
git diff HEAD |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git diff HEAD |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
which ends up doing the above for you. |
|
|
|
which ends up doing the above for you. |
|
|
|
|
|
|
|
|
|
|
@ -396,7 +410,7 @@ work through the index file, so the first thing we need to do is to |
|
|
|
update the index cache: |
|
|
|
update the index cache: |
|
|
|
|
|
|
|
|
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
git-update-index hello |
|
|
|
$ git-update-index hello |
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
|
|
|
|
|
|
|
|
(note how we didn't need the `\--add` flag this time, since git knew |
|
|
|
(note how we didn't need the `\--add` flag this time, since git knew |
|
|
@ -417,7 +431,7 @@ this wasn't an initial commit any more), but you've done that once |
|
|
|
already, so let's just use the helpful script this time: |
|
|
|
already, so let's just use the helpful script this time: |
|
|
|
|
|
|
|
|
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
git commit |
|
|
|
$ git commit |
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
|
|
|
|
|
|
|
|
which starts an editor for you to write the commit message and tells you |
|
|
|
which starts an editor for you to write the commit message and tells you |
|
|
@ -450,7 +464,9 @@ give it just a single commit object, and it will figure out the parent |
|
|
|
of that commit itself, and show the difference directly. Thus, to get |
|
|
|
of that commit itself, and show the difference directly. Thus, to get |
|
|
|
the same diff that we've already seen several times, we can now do |
|
|
|
the same diff that we've already seen several times, we can now do |
|
|
|
|
|
|
|
|
|
|
|
git-diff-tree -p HEAD |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git-diff-tree -p HEAD |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
(again, `-p` means to show the difference as a human-readable patch), |
|
|
|
(again, `-p` means to show the difference as a human-readable patch), |
|
|
|
and it will show what the last commit (in `HEAD`) actually changed. |
|
|
|
and it will show what the last commit (in `HEAD`) actually changed. |
|
|
@ -505,13 +521,17 @@ activities. |
|
|
|
To see the whole history of our pitiful little git-tutorial project, you |
|
|
|
To see the whole history of our pitiful little git-tutorial project, you |
|
|
|
can do |
|
|
|
can do |
|
|
|
|
|
|
|
|
|
|
|
git log |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git log |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
which shows just the log messages, or if we want to see the log together |
|
|
|
which shows just the log messages, or if we want to see the log together |
|
|
|
with the associated patches use the more complex (and much more |
|
|
|
with the associated patches use the more complex (and much more |
|
|
|
powerful) |
|
|
|
powerful) |
|
|
|
|
|
|
|
|
|
|
|
git-whatchanged -p --root |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git-whatchanged -p --root |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
and you will see exactly what has changed in the repository over its |
|
|
|
and you will see exactly what has changed in the repository over its |
|
|
|
short history. |
|
|
|
short history. |
|
|
@ -547,14 +567,16 @@ it in the `.git/refs/tags/` subdirectory instead of calling it a `head`. |
|
|
|
So the simplest form of tag involves nothing more than |
|
|
|
So the simplest form of tag involves nothing more than |
|
|
|
|
|
|
|
|
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
git tag my-first-tag |
|
|
|
$ git tag my-first-tag |
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
|
|
|
|
|
|
|
|
which just writes the current `HEAD` into the `.git/refs/tags/my-first-tag` |
|
|
|
which just writes the current `HEAD` into the `.git/refs/tags/my-first-tag` |
|
|
|
file, after which point you can then use this symbolic name for that |
|
|
|
file, after which point you can then use this symbolic name for that |
|
|
|
particular state. You can, for example, do |
|
|
|
particular state. You can, for example, do |
|
|
|
|
|
|
|
|
|
|
|
git diff my-first-tag |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git diff my-first-tag |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
to diff your current state against that tag (which at this point will |
|
|
|
to diff your current state against that tag (which at this point will |
|
|
|
obviously be an empty diff, but if you continue to develop and commit |
|
|
|
obviously be an empty diff, but if you continue to develop and commit |
|
|
@ -568,7 +590,9 @@ you really did |
|
|
|
that tag. You create these annotated tags with either the `-a` or |
|
|
|
that tag. You create these annotated tags with either the `-a` or |
|
|
|
`-s` flag to `git tag`: |
|
|
|
`-s` flag to `git tag`: |
|
|
|
|
|
|
|
|
|
|
|
git tag -s <tagname> |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git tag -s <tagname> |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
which will sign the current `HEAD` (but you can also give it another |
|
|
|
which will sign the current `HEAD` (but you can also give it another |
|
|
|
argument that specifies the thing to tag, ie you could have tagged the |
|
|
|
argument that specifies the thing to tag, ie you could have tagged the |
|
|
@ -584,8 +608,8 @@ name for the state at that point. |
|
|
|
Copying repositories |
|
|
|
Copying repositories |
|
|
|
-------------------- |
|
|
|
-------------------- |
|
|
|
|
|
|
|
|
|
|
|
git repositories are normally totally self-sufficient, and it's worth noting |
|
|
|
git repositories are normally totally self-sufficient and relocatable |
|
|
|
that unlike CVS, for example, there is no separate notion of |
|
|
|
Unlike CVS, for example, there is no separate notion of |
|
|
|
"repository" and "working tree". A git repository normally *is* the |
|
|
|
"repository" and "working tree". A git repository normally *is* the |
|
|
|
working tree, with the local git information hidden in the `.git` |
|
|
|
working tree, with the local git information hidden in the `.git` |
|
|
|
subdirectory. There is nothing else. What you see is what you got. |
|
|
|
subdirectory. There is nothing else. What you see is what you got. |
|
|
@ -602,8 +626,10 @@ This has two implications: |
|
|
|
|
|
|
|
|
|
|
|
- if you grow bored with the tutorial repository you created (or you've |
|
|
|
- if you grow bored with the tutorial repository you created (or you've |
|
|
|
made a mistake and want to start all over), you can just do simple |
|
|
|
made a mistake and want to start all over), you can just do simple |
|
|
|
|
|
|
|
+ |
|
|
|
rm -rf git-tutorial |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ rm -rf git-tutorial |
|
|
|
|
|
|
|
---------------- |
|
|
|
+ |
|
|
|
+ |
|
|
|
and it will be gone. There's no external repository, and there's no |
|
|
|
and it will be gone. There's no external repository, and there's no |
|
|
|
history outside the project you created. |
|
|
|
history outside the project you created. |
|
|
@ -618,8 +644,10 @@ Note that when you've moved or copied a git repository, your git index |
|
|
|
file (which caches various information, notably some of the "stat" |
|
|
|
file (which caches various information, notably some of the "stat" |
|
|
|
information for the files involved) will likely need to be refreshed. |
|
|
|
information for the files involved) will likely need to be refreshed. |
|
|
|
So after you do a `cp -a` to create a new copy, you'll want to do |
|
|
|
So after you do a `cp -a` to create a new copy, you'll want to do |
|
|
|
|
|
|
|
+ |
|
|
|
git-update-index --refresh |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git-update-index --refresh |
|
|
|
|
|
|
|
---------------- |
|
|
|
+ |
|
|
|
+ |
|
|
|
in the new repository to make sure that the index file is up-to-date. |
|
|
|
in the new repository to make sure that the index file is up-to-date. |
|
|
|
|
|
|
|
|
|
|
@ -633,8 +661,10 @@ repositories you often want to make sure that the index cache is in some |
|
|
|
known state (you don't know *what* they've done and not yet checked in), |
|
|
|
known state (you don't know *what* they've done and not yet checked in), |
|
|
|
so usually you'll precede the `git-update-index` with a |
|
|
|
so usually you'll precede the `git-update-index` with a |
|
|
|
|
|
|
|
|
|
|
|
git-read-tree --reset HEAD |
|
|
|
---------------- |
|
|
|
git-update-index --refresh |
|
|
|
$ git-read-tree --reset HEAD |
|
|
|
|
|
|
|
$ git-update-index --refresh |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
which will force a total index re-build from the tree pointed to by `HEAD`. |
|
|
|
which will force a total index re-build from the tree pointed to by `HEAD`. |
|
|
|
It resets the index contents to `HEAD`, and then the `git-update-index` |
|
|
|
It resets the index contents to `HEAD`, and then the `git-update-index` |
|
|
@ -645,7 +675,9 @@ tells you they need to be updated. |
|
|
|
|
|
|
|
|
|
|
|
The above can also be written as simply |
|
|
|
The above can also be written as simply |
|
|
|
|
|
|
|
|
|
|
|
git reset |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git reset |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
and in fact a lot of the common git command combinations can be scripted |
|
|
|
and in fact a lot of the common git command combinations can be scripted |
|
|
|
with the `git xyz` interfaces. You can learn things by just looking |
|
|
|
with the `git xyz` interfaces. You can learn things by just looking |
|
|
@ -665,20 +697,26 @@ first create your own subdirectory for the project, and then copy the |
|
|
|
raw repository contents into the `.git` directory. For example, to |
|
|
|
raw repository contents into the `.git` directory. For example, to |
|
|
|
create your own copy of the git repository, you'd do the following |
|
|
|
create your own copy of the git repository, you'd do the following |
|
|
|
|
|
|
|
|
|
|
|
mkdir my-git |
|
|
|
---------------- |
|
|
|
cd my-git |
|
|
|
$ mkdir my-git |
|
|
|
rsync -rL rsync://rsync.kernel.org/pub/scm/git/git.git/ .git |
|
|
|
$ cd my-git |
|
|
|
|
|
|
|
$ rsync -rL rsync://rsync.kernel.org/pub/scm/git/git.git/ .git |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
followed by |
|
|
|
followed by |
|
|
|
|
|
|
|
|
|
|
|
git-read-tree HEAD |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git-read-tree HEAD |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
to populate the index. However, now you have populated the index, and |
|
|
|
to populate the index. However, now you have populated the index, and |
|
|
|
you have all the git internal files, but you will notice that you don't |
|
|
|
you have all the git internal files, but you will notice that you don't |
|
|
|
actually have any of the working tree files to work on. To get |
|
|
|
actually have any of the working tree files to work on. To get |
|
|
|
those, you'd check them out with |
|
|
|
those, you'd check them out with |
|
|
|
|
|
|
|
|
|
|
|
git-checkout-index -u -a |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git-checkout-index -u -a |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
where the `-u` flag means that you want the checkout to keep the index |
|
|
|
where the `-u` flag means that you want the checkout to keep the index |
|
|
|
up-to-date (so that you don't have to refresh it afterward), and the |
|
|
|
up-to-date (so that you don't have to refresh it afterward), and the |
|
|
@ -689,9 +727,11 @@ files). |
|
|
|
|
|
|
|
|
|
|
|
Again, this can all be simplified with |
|
|
|
Again, this can all be simplified with |
|
|
|
|
|
|
|
|
|
|
|
git clone rsync://rsync.kernel.org/pub/scm/git/git.git/ my-git |
|
|
|
---------------- |
|
|
|
cd my-git |
|
|
|
$ git clone rsync://rsync.kernel.org/pub/scm/git/git.git/ my-git |
|
|
|
git checkout |
|
|
|
$ cd my-git |
|
|
|
|
|
|
|
$ git checkout |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
which will end up doing all of the above for you. |
|
|
|
which will end up doing all of the above for you. |
|
|
|
|
|
|
|
|
|
|
@ -719,7 +759,7 @@ used earlier, and create a branch in it. You do that by simply just |
|
|
|
saying that you want to check out a new branch: |
|
|
|
saying that you want to check out a new branch: |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git checkout -b mybranch |
|
|
|
$ git checkout -b mybranch |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
will create a new branch based at the current `HEAD` position, and switch |
|
|
|
will create a new branch based at the current `HEAD` position, and switch |
|
|
@ -733,7 +773,7 @@ just telling `git checkout` what the base of the checkout would be. |
|
|
|
In other words, if you have an earlier tag or branch, you'd just do |
|
|
|
In other words, if you have an earlier tag or branch, you'd just do |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git checkout -b mybranch earlier-commit |
|
|
|
$ git checkout -b mybranch earlier-commit |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
and it would create the new branch `mybranch` at the earlier commit, |
|
|
|
and it would create the new branch `mybranch` at the earlier commit, |
|
|
@ -743,27 +783,27 @@ and check out the state at that time. |
|
|
|
You can always just jump back to your original `master` branch by doing |
|
|
|
You can always just jump back to your original `master` branch by doing |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git checkout master |
|
|
|
$ git checkout master |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
(or any other branch-name, for that matter) and if you forget which |
|
|
|
(or any other branch-name, for that matter) and if you forget which |
|
|
|
branch you happen to be on, a simple |
|
|
|
branch you happen to be on, a simple |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
ls -l .git/HEAD |
|
|
|
$ ls -l .git/HEAD |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
will tell you where it's pointing (Note that on platforms with bad or no |
|
|
|
will tell you where it's pointing (Note that on platforms with bad or no |
|
|
|
symlink support, you have to execute |
|
|
|
symlink support, you have to execute |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
cat .git/HEAD |
|
|
|
$ cat .git/HEAD |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
instead). To get the list of branches you have, you can say |
|
|
|
instead). To get the list of branches you have, you can say |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git branch |
|
|
|
$ git branch |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
which is nothing more than a simple script around `ls .git/refs/heads`. |
|
|
|
which is nothing more than a simple script around `ls .git/refs/heads`. |
|
|
@ -773,7 +813,7 @@ Sometimes you may wish to create a new branch _without_ actually |
|
|
|
checking it out and switching to it. If so, just use the command |
|
|
|
checking it out and switching to it. If so, just use the command |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git branch <branchname> [startingpoint] |
|
|
|
$ git branch <branchname> [startingpoint] |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
which will simply _create_ the branch, but will not do anything further. |
|
|
|
which will simply _create_ the branch, but will not do anything further. |
|
|
@ -792,9 +832,9 @@ being the same as the original `master` branch, let's make sure we're in |
|
|
|
that branch, and do some work there. |
|
|
|
that branch, and do some work there. |
|
|
|
|
|
|
|
|
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
git checkout mybranch |
|
|
|
$ git checkout mybranch |
|
|
|
echo "Work, work, work" >>hello |
|
|
|
$ echo "Work, work, work" >>hello |
|
|
|
git commit -m 'Some work.' hello |
|
|
|
$ git commit -m 'Some work.' hello |
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
|
|
|
|
|
|
|
|
Here, we just added another line to `hello`, and we used a shorthand for |
|
|
|
Here, we just added another line to `hello`, and we used a shorthand for |
|
|
@ -807,7 +847,7 @@ does some work in the original branch, and simulate that by going back |
|
|
|
to the master branch, and editing the same file differently there: |
|
|
|
to the master branch, and editing the same file differently there: |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git checkout master |
|
|
|
$ git checkout master |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
Here, take a moment to look at the contents of `hello`, and notice how they |
|
|
|
Here, take a moment to look at the contents of `hello`, and notice how they |
|
|
@ -815,9 +855,9 @@ don't contain the work we just did in `mybranch` -- because that work |
|
|
|
hasn't happened in the `master` branch at all. Then do |
|
|
|
hasn't happened in the `master` branch at all. Then do |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
echo "Play, play, play" >>hello |
|
|
|
$ echo "Play, play, play" >>hello |
|
|
|
echo "Lots of fun" >>example |
|
|
|
$ echo "Lots of fun" >>example |
|
|
|
git commit -m 'Some fun.' hello example |
|
|
|
$ git commit -m 'Some fun.' hello example |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
since the master branch is obviously in a much better mood. |
|
|
|
since the master branch is obviously in a much better mood. |
|
|
@ -826,7 +866,9 @@ Now, you've got two branches, and you decide that you want to merge the |
|
|
|
work done. Before we do that, let's introduce a cool graphical tool that |
|
|
|
work done. Before we do that, let's introduce a cool graphical tool that |
|
|
|
helps you view what's going on: |
|
|
|
helps you view what's going on: |
|
|
|
|
|
|
|
|
|
|
|
gitk --all |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ gitk --all |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
will show you graphically both of your branches (that's what the `\--all` |
|
|
|
will show you graphically both of your branches (that's what the `\--all` |
|
|
|
means: normally it will just show you your current `HEAD`) and their |
|
|
|
means: normally it will just show you your current `HEAD`) and their |
|
|
@ -840,7 +882,7 @@ script called `git merge`, which wants to know which branches you want |
|
|
|
to resolve and what the merge is all about: |
|
|
|
to resolve and what the merge is all about: |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git merge "Merge work in mybranch" HEAD mybranch |
|
|
|
$ git merge "Merge work in mybranch" HEAD mybranch |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
where the first argument is going to be used as the commit message if |
|
|
|
where the first argument is going to be used as the commit message if |
|
|
@ -851,6 +893,7 @@ merge will need to be fixed up by hand, though, so git will do as much |
|
|
|
of it as it can automatically (which in this case is just merge the `example` |
|
|
|
of it as it can automatically (which in this case is just merge the `example` |
|
|
|
file, which had no differences in the `mybranch` branch), and say: |
|
|
|
file, which had no differences in the `mybranch` branch), and say: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---------------- |
|
|
|
Trying really trivial in-index merge... |
|
|
|
Trying really trivial in-index merge... |
|
|
|
fatal: Merge requires file-level merging |
|
|
|
fatal: Merge requires file-level merging |
|
|
|
Nope. |
|
|
|
Nope. |
|
|
@ -859,6 +902,7 @@ file, which had no differences in the `mybranch` branch), and say: |
|
|
|
ERROR: Merge conflict in hello. |
|
|
|
ERROR: Merge conflict in hello. |
|
|
|
fatal: merge program failed |
|
|
|
fatal: merge program failed |
|
|
|
Automatic merge failed/prevented; fix up by hand |
|
|
|
Automatic merge failed/prevented; fix up by hand |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
which is way too verbose, but it basically tells you that it failed the |
|
|
|
which is way too verbose, but it basically tells you that it failed the |
|
|
|
really trivial merge ("Simple merge") and did an "Automatic merge" |
|
|
|
really trivial merge ("Simple merge") and did an "Automatic merge" |
|
|
@ -879,7 +923,7 @@ Work, work, work |
|
|
|
and once you're happy with your manual merge, just do a |
|
|
|
and once you're happy with your manual merge, just do a |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git commit hello |
|
|
|
$ git commit hello |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
which will very loudly warn you that you're now committing a merge |
|
|
|
which will very loudly warn you that you're now committing a merge |
|
|
@ -929,17 +973,19 @@ to the `master` branch. Let's go back to `mybranch`, and run |
|
|
|
resolve to get the "upstream changes" back to your branch. |
|
|
|
resolve to get the "upstream changes" back to your branch. |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git checkout mybranch |
|
|
|
$ git checkout mybranch |
|
|
|
git merge "Merge upstream changes." HEAD master |
|
|
|
$ git merge "Merge upstream changes." HEAD master |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
This outputs something like this (the actual commit object names |
|
|
|
This outputs something like this (the actual commit object names |
|
|
|
would be different) |
|
|
|
would be different) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---------------- |
|
|
|
Updating from ae3a2da... to a80b4aa.... |
|
|
|
Updating from ae3a2da... to a80b4aa.... |
|
|
|
example | 1 + |
|
|
|
example | 1 + |
|
|
|
hello | 1 + |
|
|
|
hello | 1 + |
|
|
|
2 files changed, 2 insertions(+), 0 deletions(-) |
|
|
|
2 files changed, 2 insertions(+), 0 deletions(-) |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
Because your branch did not contain anything more than what are |
|
|
|
Because your branch did not contain anything more than what are |
|
|
|
already merged into the `master` branch, the resolve operation did |
|
|
|
already merged into the `master` branch, the resolve operation did |
|
|
@ -965,14 +1011,16 @@ Merging external work |
|
|
|
It's usually much more common that you merge with somebody else than |
|
|
|
It's usually much more common that you merge with somebody else than |
|
|
|
merging with your own branches, so it's worth pointing out that git |
|
|
|
merging with your own branches, so it's worth pointing out that git |
|
|
|
makes that very easy too, and in fact, it's not that different from |
|
|
|
makes that very easy too, and in fact, it's not that different from |
|
|
|
doing a `git resolve`. In fact, a remote merge ends up being nothing |
|
|
|
doing a `git merge`. In fact, a remote merge ends up being nothing |
|
|
|
more than "fetch the work from a remote repository into a temporary tag" |
|
|
|
more than "fetch the work from a remote repository into a temporary tag" |
|
|
|
followed by a `git resolve`. |
|
|
|
followed by a `git merge`. |
|
|
|
|
|
|
|
|
|
|
|
Fetching from a remote repository is done by, unsurprisingly, |
|
|
|
Fetching from a remote repository is done by, unsurprisingly, |
|
|
|
`git fetch`: |
|
|
|
`git fetch`: |
|
|
|
|
|
|
|
|
|
|
|
git fetch <remote-repository> |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git fetch <remote-repository> |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
One of the following transports can be used to name the |
|
|
|
One of the following transports can be used to name the |
|
|
|
repository to download from: |
|
|
|
repository to download from: |
|
|
@ -1017,7 +1065,7 @@ This transport was designed for anonymous downloading. Like SSH |
|
|
|
transport, it finds out the set of objects the downstream side |
|
|
|
transport, it finds out the set of objects the downstream side |
|
|
|
lacks and transfers (close to) minimum set of objects. |
|
|
|
lacks and transfers (close to) minimum set of objects. |
|
|
|
|
|
|
|
|
|
|
|
HTTP(s):: |
|
|
|
HTTP(S):: |
|
|
|
`http://remote.machine/path/to/repo.git/` |
|
|
|
`http://remote.machine/path/to/repo.git/` |
|
|
|
+ |
|
|
|
+ |
|
|
|
HTTP and HTTPS transport are used only for downloading. They |
|
|
|
HTTP and HTTPS transport are used only for downloading. They |
|
|
@ -1047,7 +1095,9 @@ However -- it's such a common thing to `fetch` and then |
|
|
|
immediately `resolve`, that it's called `git pull`, and you can |
|
|
|
immediately `resolve`, that it's called `git pull`, and you can |
|
|
|
simply do |
|
|
|
simply do |
|
|
|
|
|
|
|
|
|
|
|
git pull <remote-repository> |
|
|
|
---------------- |
|
|
|
|
|
|
|
$ git pull <remote-repository> |
|
|
|
|
|
|
|
---------------- |
|
|
|
|
|
|
|
|
|
|
|
and optionally give a branch-name for the remote end as a second |
|
|
|
and optionally give a branch-name for the remote end as a second |
|
|
|
argument. |
|
|
|
argument. |
|
|
@ -1075,8 +1125,8 @@ the remote repository URL in a file under .git/remotes/ |
|
|
|
directory, like this: |
|
|
|
directory, like this: |
|
|
|
|
|
|
|
|
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
mkdir -p .git/remotes/ |
|
|
|
$ mkdir -p .git/remotes/ |
|
|
|
cat >.git/remotes/linus <<\EOF |
|
|
|
$ cat >.git/remotes/linus <<\EOF |
|
|
|
URL: http://www.kernel.org/pub/scm/git/git.git/ |
|
|
|
URL: http://www.kernel.org/pub/scm/git/git.git/ |
|
|
|
EOF |
|
|
|
EOF |
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
@ -1086,7 +1136,7 @@ The URL specified in such file can even be a prefix |
|
|
|
of a full URL, like this: |
|
|
|
of a full URL, like this: |
|
|
|
|
|
|
|
|
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
|
cat >.git/remotes/jgarzik <<\EOF |
|
|
|
$ cat >.git/remotes/jgarzik <<\EOF |
|
|
|
URL: http://www.kernel.org/pub/scm/linux/git/jgarzik/ |
|
|
|
URL: http://www.kernel.org/pub/scm/linux/git/jgarzik/ |
|
|
|
EOF |
|
|
|
EOF |
|
|
|
------------------------------------------------ |
|
|
|
------------------------------------------------ |
|
|
@ -1206,7 +1256,8 @@ In our example of only two files, we did not have unchanged |
|
|
|
files so only 'example' resulted in collapsing, but in real-life |
|
|
|
files so only 'example' resulted in collapsing, but in real-life |
|
|
|
large projects, only small number of files change in one commit, |
|
|
|
large projects, only small number of files change in one commit, |
|
|
|
and this 'collapsing' tends to trivially merge most of the paths |
|
|
|
and this 'collapsing' tends to trivially merge most of the paths |
|
|
|
fairly quickly, leaving only the real changes in non-zero stages. |
|
|
|
fairly quickly, leaving only a handful the real changes in non-zero |
|
|
|
|
|
|
|
stages. |
|
|
|
|
|
|
|
|
|
|
|
To look at only non-zero stages, use `\--unmerged` flag: |
|
|
|
To look at only non-zero stages, use `\--unmerged` flag: |
|
|
|
|
|
|
|
|
|
|
@ -1299,7 +1350,7 @@ project `my-git`. After logging into the remote machine, create |
|
|
|
an empty directory: |
|
|
|
an empty directory: |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
mkdir my-git.git |
|
|
|
$ mkdir my-git.git |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
Then, make that directory into a git repository by running |
|
|
|
Then, make that directory into a git repository by running |
|
|
@ -1307,7 +1358,7 @@ Then, make that directory into a git repository by running |
|
|
|
`.git`, we do things slightly differently: |
|
|
|
`.git`, we do things slightly differently: |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
GIT_DIR=my-git.git git-init-db |
|
|
|
$ GIT_DIR=my-git.git git-init-db |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
Make sure this directory is available for others you want your |
|
|
|
Make sure this directory is available for others you want your |
|
|
@ -1333,7 +1384,7 @@ Come back to the machine you have your private repository. From |
|
|
|
there, run this command: |
|
|
|
there, run this command: |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git push <public-host>:/path/to/my-git.git master |
|
|
|
$ git push <public-host>:/path/to/my-git.git master |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
This synchronizes your public repository to match the named |
|
|
|
This synchronizes your public repository to match the named |
|
|
@ -1345,7 +1396,7 @@ repository. Kernel.org mirror network takes care of the |
|
|
|
propagation to other publicly visible machines: |
|
|
|
propagation to other publicly visible machines: |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git push master.kernel.org:/pub/scm/git/git.git/ |
|
|
|
$ git push master.kernel.org:/pub/scm/git/git.git/ |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1360,7 +1411,7 @@ immutable once they are created, there is a way to optimize the |
|
|
|
storage by "packing them together". The command |
|
|
|
storage by "packing them together". The command |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git repack |
|
|
|
$ git repack |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
will do it for you. If you followed the tutorial examples, you |
|
|
|
will do it for you. If you followed the tutorial examples, you |
|
|
@ -1386,7 +1437,7 @@ Once you have packed objects, you do not need to leave the |
|
|
|
unpacked objects that are contained in the pack file anymore. |
|
|
|
unpacked objects that are contained in the pack file anymore. |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
git prune-packed |
|
|
|
$ git prune-packed |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
would remove them for you. |
|
|
|
would remove them for you. |
|
|
@ -1615,8 +1666,8 @@ in both of them. You could merge in 'diff-fix' first and then |
|
|
|
'commit-fix' next, like this: |
|
|
|
'commit-fix' next, like this: |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|
$ git resolve master diff-fix 'Merge fix in diff-fix' |
|
|
|
$ git merge 'Merge fix in diff-fix' master diff-fix |
|
|
|
$ git resolve master commit-fix 'Merge fix in commit-fix' |
|
|
|
$ git merge 'Merge fix in commit-fix' master commit-fix |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
Which would result in: |
|
|
|
Which would result in: |
|
|
@ -1649,8 +1700,8 @@ $ git reset --hard master~2 |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
You can make sure 'git show-branch' matches the state before |
|
|
|
You can make sure 'git show-branch' matches the state before |
|
|
|
those two 'git resolve' you just did. Then, instead of running |
|
|
|
those two 'git merge' you just did. Then, instead of running |
|
|
|
two 'git resolve' commands in a row, you would pull these two |
|
|
|
two 'git merge' commands in a row, you would pull these two |
|
|
|
branch heads (this is known as 'making an Octopus'): |
|
|
|
branch heads (this is known as 'making an Octopus'): |
|
|
|
|
|
|
|
|
|
|
|
------------ |
|
|
|
------------ |
|
|
|