1 <?xml version=
"1.0" encoding=
"UTF-8"?>
2 <!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.1//EN"
3 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
4 <html xmlns=
"http://www.w3.org/1999/xhtml" xml:
lang=
"en">
6 <meta http-equiv=
"Content-Type" content=
"application/xhtml+xml; charset=UTF-8" />
7 <meta name=
"generator" content=
"AsciiDoc 10.2.0" />
8 <title>gittutorial(
7)
</title>
9 <style type=
"text/css">
10 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
14 font-family: Georgia,serif;
18 h1, h2, h3, h4, h5, h6,
19 div.title, caption.title,
20 thead, p.table.header,
22 #author, #revnumber, #revdate, #revremark,
24 font-family: Arial,Helvetica,sans-serif;
28 margin:
1em
5%
1em
5%;
33 text-decoration: underline;
49 h1, h2, h3, h4, h5, h6 {
57 border-bottom:
2px solid silver;
77 border:
1px solid silver;
88 ul
> li { color: #aaa; }
89 ul
> li
> * { color: black; }
91 .monospaced, code, pre {
92 font-family:
"Courier New", Courier, monospace;
99 white-space: pre-wrap;
109 #revnumber, #revdate, #revremark {
114 border-top:
2px solid silver;
120 padding-bottom:
0.5em;
124 padding-bottom:
0.5em;
129 margin-bottom:
1.5em;
131 div.imageblock, div.exampleblock, div.verseblock,
132 div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
133 div.admonitionblock {
135 margin-bottom:
1.5em;
137 div.admonitionblock {
139 margin-bottom:
2.0em;
144 div.content { /* Block element content. */
148 /* Block element titles. */
149 div.title, caption.title {
154 margin-bottom:
0.5em;
160 td div.title:first-child {
163 div.content div.title:first-child {
166 div.content + div.title {
170 div.sidebarblock
> div.content {
172 border:
1px solid #dddddd;
173 border-left:
4px solid #f0f0f0;
177 div.listingblock
> div.content {
178 border:
1px solid #dddddd;
179 border-left:
5px solid #f0f0f0;
184 div.quoteblock, div.verseblock {
188 border-left:
5px solid #f0f0f0;
192 div.quoteblock
> div.attribution {
197 div.verseblock
> pre.content {
198 font-family: inherit;
201 div.verseblock
> div.attribution {
205 /* DEPRECATED: Pre version
8.2.7 verse style literal block. */
206 div.verseblock + div.attribution {
210 div.admonitionblock .icon {
214 text-decoration: underline;
216 padding-right:
0.5em;
218 div.admonitionblock td.content {
220 border-left:
3px solid #dddddd;
223 div.exampleblock
> div.content {
224 border-left:
3px solid #dddddd;
228 div.imageblock div.content { padding-left:
0; }
229 span.image img { border-style: none; vertical-align: text-bottom; }
230 a.image:visited { color: white; }
234 margin-bottom:
0.8em;
247 list-style-position: outside;
250 list-style-type: decimal;
253 list-style-type: lower-alpha;
256 list-style-type: upper-alpha;
259 list-style-type: lower-roman;
262 list-style-type: upper-roman;
265 div.compact ul, div.compact ol,
266 div.compact p, div.compact p,
267 div.compact div, div.compact div {
269 margin-bottom:
0.1em;
281 margin-bottom:
0.8em;
284 padding-bottom:
15px;
286 dt.hdlist1.strong, td.hdlist1.strong {
292 padding-right:
0.8em;
298 div.hdlist.compact tr {
307 .footnote, .footnoteref {
311 span.footnote, span.footnoteref {
312 vertical-align: super;
316 margin:
20px
0 20px
0;
320 #footnotes div.footnote {
326 border-top:
1px solid silver;
335 padding-right:
0.5em;
336 padding-bottom:
0.3em;
344 #footer-badges { display: none; }
348 margin-bottom:
2.5em;
356 margin-bottom:
0.1em;
359 div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
376 span.aqua { color: aqua; }
377 span.black { color: black; }
378 span.blue { color: blue; }
379 span.fuchsia { color: fuchsia; }
380 span.gray { color: gray; }
381 span.green { color: green; }
382 span.lime { color: lime; }
383 span.maroon { color: maroon; }
384 span.navy { color: navy; }
385 span.olive { color: olive; }
386 span.purple { color: purple; }
387 span.red { color: red; }
388 span.silver { color: silver; }
389 span.teal { color: teal; }
390 span.white { color: white; }
391 span.yellow { color: yellow; }
393 span.aqua-background { background: aqua; }
394 span.black-background { background: black; }
395 span.blue-background { background: blue; }
396 span.fuchsia-background { background: fuchsia; }
397 span.gray-background { background: gray; }
398 span.green-background { background: green; }
399 span.lime-background { background: lime; }
400 span.maroon-background { background: maroon; }
401 span.navy-background { background: navy; }
402 span.olive-background { background: olive; }
403 span.purple-background { background: purple; }
404 span.red-background { background: red; }
405 span.silver-background { background: silver; }
406 span.teal-background { background: teal; }
407 span.white-background { background: white; }
408 span.yellow-background { background: yellow; }
410 span.big { font-size:
2em; }
411 span.small { font-size:
0.6em; }
413 span.underline { text-decoration: underline; }
414 span.overline { text-decoration: overline; }
415 span.line-through { text-decoration: line-through; }
417 div.unbreakable { page-break-inside: avoid; }
427 margin-bottom:
1.5em;
429 div.tableblock
> table {
430 border:
3px solid #
527bbd;
432 thead, p.table.header {
439 /* Because the table frame attribute is overridden by CSS in most browsers. */
440 div.tableblock
> table[
frame=
"void"] {
443 div.tableblock
> table[
frame=
"hsides"] {
444 border-left-style: none;
445 border-right-style: none;
447 div.tableblock
> table[
frame=
"vsides"] {
448 border-top-style: none;
449 border-bottom-style: none;
460 margin-bottom:
1.5em;
462 thead, p.tableblock.header {
473 border-color: #
527bbd;
474 border-collapse: collapse;
476 th.tableblock, td.tableblock {
480 border-color: #
527bbd;
483 table.tableblock.frame-topbot {
484 border-left-style: hidden;
485 border-right-style: hidden;
487 table.tableblock.frame-sides {
488 border-top-style: hidden;
489 border-bottom-style: hidden;
491 table.tableblock.frame-none {
492 border-style: hidden;
495 th.tableblock.halign-left, td.tableblock.halign-left {
498 th.tableblock.halign-center, td.tableblock.halign-center {
501 th.tableblock.halign-right, td.tableblock.halign-right {
505 th.tableblock.valign-top, td.tableblock.valign-top {
508 th.tableblock.valign-middle, td.tableblock.valign-middle {
509 vertical-align: middle;
511 th.tableblock.valign-bottom, td.tableblock.valign-bottom {
512 vertical-align: bottom;
523 padding-bottom:
0.5em;
524 border-top:
2px solid silver;
525 border-bottom:
2px solid silver;
530 body.manpage div.sectionbody {
535 body.manpage div#toc { display: none; }
540 <script type=
"text/javascript">
542 var asciidoc = { // Namespace.
544 /////////////////////////////////////////////////////////////////////
545 // Table Of Contents generator
546 /////////////////////////////////////////////////////////////////////
548 /* Author: Mihai Bazon, September
2002
549 * http://students.infoiasi.ro/~mishoo
551 * Table Of Content generator
554 * Feel free to use this script under the terms of the GNU General Public
555 * License, as long as you do not remove or alter this notice.
558 /* modified by Troy D. Hanson, September
2006. License: GPL */
559 /* modified by Stuart Rackham,
2006,
2009. License: GPL */
562 toc: function (toclevels) {
564 function getText(el) {
566 for (var i = el.firstChild; i != null; i = i.nextSibling) {
567 if (i.nodeType ==
3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
569 else if (i.firstChild != null)
575 function TocEntry(el, text, toclevel) {
578 this.toclevel = toclevel;
581 function tocEntries(el, toclevels) {
582 var result = new Array;
583 var re = new RegExp('[hH]([
1-'+(toclevels+
1)+'])');
584 // Function that scans the DOM tree for header elements (the DOM2
585 // nodeIterator API would be a better technique but not supported by all
587 var iterate = function (el) {
588 for (var i = el.firstChild; i != null; i = i.nextSibling) {
589 if (i.nodeType ==
1 /* Node.ELEMENT_NODE */) {
590 var mo = re.exec(i.tagName);
591 if (mo && (i.getAttribute(
"class") || i.getAttribute(
"className")) !=
"float") {
592 result[result.length] = new TocEntry(i, getText(i), mo[
1]-
1);
602 var toc = document.getElementById(
"toc");
607 // Delete existing TOC entries in case we're reloading the TOC.
608 var tocEntriesToRemove = [];
610 for (i =
0; i < toc.childNodes.length; i++) {
611 var entry = toc.childNodes[i];
612 if (entry.nodeName.toLowerCase() == 'div'
613 && entry.getAttribute(
"class")
614 && entry.getAttribute(
"class").match(/^toclevel/))
615 tocEntriesToRemove.push(entry);
617 for (i =
0; i < tocEntriesToRemove.length; i++) {
618 toc.removeChild(tocEntriesToRemove[i]);
621 // Rebuild TOC entries.
622 var entries = tocEntries(document.getElementById(
"content"), toclevels);
623 for (var i =
0; i < entries.length; ++i) {
624 var entry = entries[i];
625 if (entry.element.id ==
"")
626 entry.element.id =
"_toc_" + i;
627 var a = document.createElement(
"a");
628 a.href =
"#" + entry.element.id;
629 a.appendChild(document.createTextNode(entry.text));
630 var div = document.createElement(
"div");
632 div.className =
"toclevel" + entry.toclevel;
633 toc.appendChild(div);
635 if (entries.length ==
0)
636 toc.parentNode.removeChild(toc);
640 /////////////////////////////////////////////////////////////////////
641 // Footnotes generator
642 /////////////////////////////////////////////////////////////////////
644 /* Based on footnote generation code from:
645 * http://www.brandspankingnew.net/archive/
2005/
07/format_footnote.html
648 footnotes: function () {
649 // Delete existing footnote entries in case we're reloading the footnodes.
651 var noteholder = document.getElementById(
"footnotes");
655 var entriesToRemove = [];
656 for (i =
0; i < noteholder.childNodes.length; i++) {
657 var entry = noteholder.childNodes[i];
658 if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute(
"class") ==
"footnote")
659 entriesToRemove.push(entry);
661 for (i =
0; i < entriesToRemove.length; i++) {
662 noteholder.removeChild(entriesToRemove[i]);
665 // Rebuild footnote entries.
666 var cont = document.getElementById(
"content");
667 var spans = cont.getElementsByTagName(
"span");
670 for (i=
0; i
<spans.length; i++) {
671 if (spans[i].className ==
"footnote") {
673 var note = spans[i].getAttribute(
"data-note");
675 // Use [\s\S] in place of . so multi-line matches work.
676 // Because JavaScript has no s (dotall) regex flag.
677 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[
1];
679 "[<a id='_footnoteref_" + n +
"' href='#_footnote_" + n +
680 "' title='View footnote' class='footnote'>" + n +
"</a>]";
681 spans[i].setAttribute(
"data-note", note);
683 noteholder.innerHTML +=
684 "<div class='footnote' id='_footnote_" + n +
"'>" +
685 "<a href='#_footnoteref_" + n +
"' title='Return to text'>" +
686 n +
"</a>. " + note +
"</div>";
687 var id =spans[i].getAttribute(
"id");
688 if (id != null) refs[
"#"+id] = n;
692 noteholder.parentNode.removeChild(noteholder);
694 // Process footnoterefs.
695 for (i=
0; i
<spans.length; i++) {
696 if (spans[i].className ==
"footnoteref") {
697 var href = spans[i].getElementsByTagName(
"a")[
0].getAttribute(
"href");
698 href = href.match(/#.*/)[
0]; // Because IE return full URL.
701 "[<a href='#_footnote_" + n +
702 "' title='View footnote' class='footnote'>" + n +
"</a>]";
708 install: function(toclevels) {
711 function reinstall() {
712 asciidoc.footnotes();
714 asciidoc.toc(toclevels);
718 function reinstallAndRemoveTimer() {
719 clearInterval(timerId);
723 timerId = setInterval(reinstall,
500);
724 if (document.addEventListener)
725 document.addEventListener(
"DOMContentLoaded", reinstallAndRemoveTimer, false);
727 window.onload = reinstallAndRemoveTimer;
735 <body class=
"manpage">
738 gittutorial(
7) Manual Page
741 <div class=
"sectionbody">
743 A tutorial introduction to Git
749 <h2 id=
"_synopsis">SYNOPSIS
</h2>
750 <div class=
"sectionbody">
751 <div class=
"verseblock">
752 <pre class=
"content">git *
</pre>
753 <div class=
"attribution">
758 <h2 id=
"_description">DESCRIPTION
</h2>
759 <div class=
"sectionbody">
760 <div class=
"paragraph"><p>This tutorial explains how to import a new project into Git, make
761 changes to it, and share changes with other developers.
</p></div>
762 <div class=
"paragraph"><p>If you are instead primarily interested in using Git to fetch a project,
763 for example, to test the latest version, you may prefer to start with
764 the first two chapters of
<a href=
"user-manual.html">The Git User
’s Manual
</a>.
</p></div>
765 <div class=
"paragraph"><p>First, note that you can get documentation for a command such as
766 <code>git log --graph
</code> with:
</p></div>
767 <div class=
"listingblock">
768 <div class=
"content">
769 <pre><code>$ man git-log
</code></pre>
771 <div class=
"paragraph"><p>or:
</p></div>
772 <div class=
"listingblock">
773 <div class=
"content">
774 <pre><code>$ git help log
</code></pre>
776 <div class=
"paragraph"><p>With the latter, you can use the manual viewer of your choice; see
777 <a href=
"git-help.html">git-help(
1)
</a> for more information.
</p></div>
778 <div class=
"paragraph"><p>It is a good idea to introduce yourself to Git with your name and
779 public email address before doing any operation. The easiest
780 way to do so is:
</p></div>
781 <div class=
"listingblock">
782 <div class=
"content">
783 <pre><code>$ git config --global user.name
"Your Name Comes Here"
784 $ git config --global user.email you@yourdomain.example.com
</code></pre>
789 <h2 id=
"_importing_a_new_project">Importing a new project
</h2>
790 <div class=
"sectionbody">
791 <div class=
"paragraph"><p>Assume you have a tarball project.tar.gz with your initial work. You
792 can place it under Git revision control as follows.
</p></div>
793 <div class=
"listingblock">
794 <div class=
"content">
795 <pre><code>$ tar xzf project.tar.gz
797 $ git init
</code></pre>
799 <div class=
"paragraph"><p>Git will reply
</p></div>
800 <div class=
"listingblock">
801 <div class=
"content">
802 <pre><code>Initialized empty Git repository in .git/
</code></pre>
804 <div class=
"paragraph"><p>You
’ve now initialized the working directory
—you may notice a new
805 directory created, named
".git".
</p></div>
806 <div class=
"paragraph"><p>Next, tell Git to take a snapshot of the contents of all files under the
807 current directory (note the
<em>.
</em>), with
<em>git add
</em>:
</p></div>
808 <div class=
"listingblock">
809 <div class=
"content">
810 <pre><code>$ git add .
</code></pre>
812 <div class=
"paragraph"><p>This snapshot is now stored in a temporary staging area which Git calls
813 the
"index". You can permanently store the contents of the index in the
814 repository with
<em>git commit
</em>:
</p></div>
815 <div class=
"listingblock">
816 <div class=
"content">
817 <pre><code>$ git commit
</code></pre>
819 <div class=
"paragraph"><p>This will prompt you for a commit message. You
’ve now stored the first
820 version of your project in Git.
</p></div>
824 <h2 id=
"_making_changes">Making changes
</h2>
825 <div class=
"sectionbody">
826 <div class=
"paragraph"><p>Modify some files, then add their updated contents to the index:
</p></div>
827 <div class=
"listingblock">
828 <div class=
"content">
829 <pre><code>$ git add file1 file2 file3
</code></pre>
831 <div class=
"paragraph"><p>You are now ready to commit. You can see what is about to be committed
832 using
<em>git diff
</em> with the --cached option:
</p></div>
833 <div class=
"listingblock">
834 <div class=
"content">
835 <pre><code>$ git diff --cached
</code></pre>
837 <div class=
"paragraph"><p>(Without --cached,
<em>git diff
</em> will show you any changes that
838 you
’ve made but not yet added to the index.) You can also get a brief
839 summary of the situation with
<em>git status
</em>:
</p></div>
840 <div class=
"listingblock">
841 <div class=
"content">
842 <pre><code>$ git status
844 Changes to be committed:
845 Your branch is up to date with 'origin/master'.
846 (use
"git restore --staged <file>..." to unstage)
850 modified: file3
</code></pre>
852 <div class=
"paragraph"><p>If you need to make any further adjustments, do so now, and then add any
853 newly modified content to the index. Finally, commit your changes with:
</p></div>
854 <div class=
"listingblock">
855 <div class=
"content">
856 <pre><code>$ git commit
</code></pre>
858 <div class=
"paragraph"><p>This will again prompt you for a message describing the change, and then
859 record a new version of the project.
</p></div>
860 <div class=
"paragraph"><p>Alternatively, instead of running
<em>git add
</em> beforehand, you can use
</p></div>
861 <div class=
"listingblock">
862 <div class=
"content">
863 <pre><code>$ git commit -a
</code></pre>
865 <div class=
"paragraph"><p>which will automatically notice any modified (but not new) files, add
866 them to the index, and commit, all in one step.
</p></div>
867 <div class=
"paragraph"><p>A note on commit messages: Though not required, it
’s a good idea to
868 begin the commit message with a single short (less than
50 character)
869 line summarizing the change, followed by a blank line and then a more
870 thorough description. The text up to the first blank line in a commit
871 message is treated as the commit title, and that title is used
872 throughout Git. For example,
<a href=
"git-format-patch.html">git-format-patch(
1)
</a> turns a
873 commit into email, and it uses the title on the Subject line and the
874 rest of the commit in the body.
</p></div>
878 <h2 id=
"_git_tracks_content_not_files">Git tracks content not files
</h2>
879 <div class=
"sectionbody">
880 <div class=
"paragraph"><p>Many revision control systems provide an
<code>add
</code> command that tells the
881 system to start tracking changes to a new file. Git
’s
<code>add
</code> command
882 does something simpler and more powerful:
<em>git add
</em> is used both for new
883 and newly modified files, and in both cases it takes a snapshot of the
884 given files and stages that content in the index, ready for inclusion in
885 the next commit.
</p></div>
889 <h2 id=
"_viewing_project_history">Viewing project history
</h2>
890 <div class=
"sectionbody">
891 <div class=
"paragraph"><p>At any point you can view the history of your changes using
</p></div>
892 <div class=
"listingblock">
893 <div class=
"content">
894 <pre><code>$ git log
</code></pre>
896 <div class=
"paragraph"><p>If you also want to see complete diffs at each step, use
</p></div>
897 <div class=
"listingblock">
898 <div class=
"content">
899 <pre><code>$ git log -p
</code></pre>
901 <div class=
"paragraph"><p>Often the overview of the change is useful to get a feel of
903 <div class=
"listingblock">
904 <div class=
"content">
905 <pre><code>$ git log --stat --summary
</code></pre>
910 <h2 id=
"_managing_branches">Managing branches
</h2>
911 <div class=
"sectionbody">
912 <div class=
"paragraph"><p>A single Git repository can maintain multiple branches of
913 development. To create a new branch named
"experimental", use
</p></div>
914 <div class=
"listingblock">
915 <div class=
"content">
916 <pre><code>$ git branch experimental
</code></pre>
918 <div class=
"paragraph"><p>If you now run
</p></div>
919 <div class=
"listingblock">
920 <div class=
"content">
921 <pre><code>$ git branch
</code></pre>
923 <div class=
"paragraph"><p>you
’ll get a list of all existing branches:
</p></div>
924 <div class=
"listingblock">
925 <div class=
"content">
926 <pre><code> experimental
927 * master
</code></pre>
929 <div class=
"paragraph"><p>The
"experimental" branch is the one you just created, and the
930 "master" branch is a default branch that was created for you
931 automatically. The asterisk marks the branch you are currently on;
933 <div class=
"listingblock">
934 <div class=
"content">
935 <pre><code>$ git switch experimental
</code></pre>
937 <div class=
"paragraph"><p>to switch to the experimental branch. Now edit a file, commit the
938 change, and switch back to the master branch:
</p></div>
939 <div class=
"listingblock">
940 <div class=
"content">
941 <pre><code>(edit file)
943 $ git switch master
</code></pre>
945 <div class=
"paragraph"><p>Check that the change you made is no longer visible, since it was
946 made on the experimental branch and you
’re back on the master branch.
</p></div>
947 <div class=
"paragraph"><p>You can make a different change on the master branch:
</p></div>
948 <div class=
"listingblock">
949 <div class=
"content">
950 <pre><code>(edit file)
951 $ git commit -a
</code></pre>
953 <div class=
"paragraph"><p>at this point the two branches have diverged, with different changes
954 made in each. To merge the changes made in experimental into master, run
</p></div>
955 <div class=
"listingblock">
956 <div class=
"content">
957 <pre><code>$ git merge experimental
</code></pre>
959 <div class=
"paragraph"><p>If the changes don
’t conflict, you
’re done. If there are conflicts,
960 markers will be left in the problematic files showing the conflict;
</p></div>
961 <div class=
"listingblock">
962 <div class=
"content">
963 <pre><code>$ git diff
</code></pre>
965 <div class=
"paragraph"><p>will show this. Once you
’ve edited the files to resolve the
967 <div class=
"listingblock">
968 <div class=
"content">
969 <pre><code>$ git commit -a
</code></pre>
971 <div class=
"paragraph"><p>will commit the result of the merge. Finally,
</p></div>
972 <div class=
"listingblock">
973 <div class=
"content">
974 <pre><code>$ gitk
</code></pre>
976 <div class=
"paragraph"><p>will show a nice graphical representation of the resulting history.
</p></div>
977 <div class=
"paragraph"><p>At this point you could delete the experimental branch with
</p></div>
978 <div class=
"listingblock">
979 <div class=
"content">
980 <pre><code>$ git branch -d experimental
</code></pre>
982 <div class=
"paragraph"><p>This command ensures that the changes in the experimental branch are
983 already in the current branch.
</p></div>
984 <div class=
"paragraph"><p>If you develop on a branch crazy-idea, then regret it, you can always
985 delete the branch with
</p></div>
986 <div class=
"listingblock">
987 <div class=
"content">
988 <pre><code>$ git branch -D crazy-idea
</code></pre>
990 <div class=
"paragraph"><p>Branches are cheap and easy, so this is a good way to try something
995 <h2 id=
"_using_git_for_collaboration">Using Git for collaboration
</h2>
996 <div class=
"sectionbody">
997 <div class=
"paragraph"><p>Suppose that Alice has started a new project with a Git repository in
998 /home/alice/project, and that Bob, who has a home directory on the
999 same machine, wants to contribute.
</p></div>
1000 <div class=
"paragraph"><p>Bob begins with:
</p></div>
1001 <div class=
"listingblock">
1002 <div class=
"content">
1003 <pre><code>bob$ git clone /home/alice/project myrepo
</code></pre>
1005 <div class=
"paragraph"><p>This creates a new directory
"myrepo" containing a clone of Alice
’s
1006 repository. The clone is on an equal footing with the original
1007 project, possessing its own copy of the original project
’s history.
</p></div>
1008 <div class=
"paragraph"><p>Bob then makes some changes and commits them:
</p></div>
1009 <div class=
"listingblock">
1010 <div class=
"content">
1011 <pre><code>(edit files)
1013 (repeat as necessary)
</code></pre>
1015 <div class=
"paragraph"><p>When he
’s ready, he tells Alice to pull changes from the repository
1016 at /home/bob/myrepo. She does this with:
</p></div>
1017 <div class=
"listingblock">
1018 <div class=
"content">
1019 <pre><code>alice$ cd /home/alice/project
1020 alice$ git pull /home/bob/myrepo master
</code></pre>
1022 <div class=
"paragraph"><p>This merges the changes from Bob
’s
"master" branch into Alice
’s
1023 current branch. If Alice has made her own changes in the meantime,
1024 then she may need to manually fix any conflicts.
</p></div>
1025 <div class=
"paragraph"><p>The
"pull" command thus performs two operations: it fetches changes
1026 from a remote branch, then merges them into the current branch.
</p></div>
1027 <div class=
"paragraph"><p>Note that in general, Alice would want her local changes committed before
1028 initiating this
"pull". If Bob
’s work conflicts with what Alice did since
1029 their histories forked, Alice will use her working tree and the index to
1030 resolve conflicts, and existing local changes will interfere with the
1031 conflict resolution process (Git will still perform the fetch but will
1032 refuse to merge
 — Alice will have to get rid of her local changes in
1033 some way and pull again when this happens).
</p></div>
1034 <div class=
"paragraph"><p>Alice can peek at what Bob did without merging first, using the
"fetch"
1035 command; this allows Alice to inspect what Bob did, using a special
1036 symbol
"FETCH_HEAD", in order to determine if he has anything worth
1037 pulling, like this:
</p></div>
1038 <div class=
"listingblock">
1039 <div class=
"content">
1040 <pre><code>alice$ git fetch /home/bob/myrepo master
1041 alice$ git log -p HEAD..FETCH_HEAD
</code></pre>
1043 <div class=
"paragraph"><p>This operation is safe even if Alice has uncommitted local changes.
1044 The range notation
"HEAD..FETCH_HEAD" means
"show everything that is reachable
1045 from the FETCH_HEAD but exclude anything that is reachable from HEAD".
1046 Alice already knows everything that leads to her current state (HEAD),
1047 and reviews what Bob has in his state (FETCH_HEAD) that she has not
1048 seen with this command.
</p></div>
1049 <div class=
"paragraph"><p>If Alice wants to visualize what Bob did since their histories forked
1050 she can issue the following command:
</p></div>
1051 <div class=
"listingblock">
1052 <div class=
"content">
1053 <pre><code>$ gitk HEAD..FETCH_HEAD
</code></pre>
1055 <div class=
"paragraph"><p>This uses the same two-dot range notation we saw earlier with
<em>git log
</em>.
</p></div>
1056 <div class=
"paragraph"><p>Alice may want to view what both of them did since they forked.
1057 She can use three-dot form instead of the two-dot form:
</p></div>
1058 <div class=
"listingblock">
1059 <div class=
"content">
1060 <pre><code>$ gitk HEAD...FETCH_HEAD
</code></pre>
1062 <div class=
"paragraph"><p>This means
"show everything that is reachable from either one, but
1063 exclude anything that is reachable from both of them".
</p></div>
1064 <div class=
"paragraph"><p>Please note that these range notation can be used with both gitk
1065 and
"git log".
</p></div>
1066 <div class=
"paragraph"><p>After inspecting what Bob did, if there is nothing urgent, Alice may
1067 decide to continue working without pulling from Bob. If Bob
’s history
1068 does have something Alice would immediately need, Alice may choose to
1069 stash her work-in-progress first, do a
"pull", and then finally unstash
1070 her work-in-progress on top of the resulting history.
</p></div>
1071 <div class=
"paragraph"><p>When you are working in a small closely knit group, it is not
1072 unusual to interact with the same repository over and over
1073 again. By defining
<em>remote
</em> repository shorthand, you can make
1074 it easier:
</p></div>
1075 <div class=
"listingblock">
1076 <div class=
"content">
1077 <pre><code>alice$ git remote add bob /home/bob/myrepo
</code></pre>
1079 <div class=
"paragraph"><p>With this, Alice can perform the first part of the
"pull" operation
1080 alone using the
<em>git fetch
</em> command without merging them with her own
1081 branch, using:
</p></div>
1082 <div class=
"listingblock">
1083 <div class=
"content">
1084 <pre><code>alice$ git fetch bob
</code></pre>
1086 <div class=
"paragraph"><p>Unlike the longhand form, when Alice fetches from Bob using a
1087 remote repository shorthand set up with
<em>git remote
</em>, what was
1088 fetched is stored in a remote-tracking branch, in this case
1089 <code>bob/master
</code>. So after this:
</p></div>
1090 <div class=
"listingblock">
1091 <div class=
"content">
1092 <pre><code>alice$ git log -p master..bob/master
</code></pre>
1094 <div class=
"paragraph"><p>shows a list of all the changes that Bob made since he branched from
1095 Alice
’s master branch.
</p></div>
1096 <div class=
"paragraph"><p>After examining those changes, Alice
1097 could merge the changes into her master branch:
</p></div>
1098 <div class=
"listingblock">
1099 <div class=
"content">
1100 <pre><code>alice$ git merge bob/master
</code></pre>
1102 <div class=
"paragraph"><p>This
<code>merge
</code> can also be done by
<em>pulling from her own remote-tracking
1103 branch
</em>, like this:
</p></div>
1104 <div class=
"listingblock">
1105 <div class=
"content">
1106 <pre><code>alice$ git pull . remotes/bob/master
</code></pre>
1108 <div class=
"paragraph"><p>Note that git pull always merges into the current branch,
1109 regardless of what else is given on the command line.
</p></div>
1110 <div class=
"paragraph"><p>Later, Bob can update his repo with Alice
’s latest changes using
</p></div>
1111 <div class=
"listingblock">
1112 <div class=
"content">
1113 <pre><code>bob$ git pull
</code></pre>
1115 <div class=
"paragraph"><p>Note that he doesn
’t need to give the path to Alice
’s repository;
1116 when Bob cloned Alice
’s repository, Git stored the location of her
1117 repository in the repository configuration, and that location is
1118 used for pulls:
</p></div>
1119 <div class=
"listingblock">
1120 <div class=
"content">
1121 <pre><code>bob$ git config --get remote.origin.url
1122 /home/alice/project
</code></pre>
1124 <div class=
"paragraph"><p>(The complete configuration created by
<em>git clone
</em> is visible using
1125 <code>git config -l
</code>, and the
<a href=
"git-config.html">git-config(
1)
</a> man page
1126 explains the meaning of each option.)
</p></div>
1127 <div class=
"paragraph"><p>Git also keeps a pristine copy of Alice
’s master branch under the
1128 name
"origin/master":
</p></div>
1129 <div class=
"listingblock">
1130 <div class=
"content">
1131 <pre><code>bob$ git branch -r
1132 origin/master
</code></pre>
1134 <div class=
"paragraph"><p>If Bob later decides to work from a different host, he can still
1135 perform clones and pulls using the ssh protocol:
</p></div>
1136 <div class=
"listingblock">
1137 <div class=
"content">
1138 <pre><code>bob$ git clone alice.org:/home/alice/project myrepo
</code></pre>
1140 <div class=
"paragraph"><p>Alternatively, Git has a native protocol, or can use http;
1141 see
<a href=
"git-pull.html">git-pull(
1)
</a> for details.
</p></div>
1142 <div class=
"paragraph"><p>Git can also be used in a CVS-like mode, with a central repository
1143 that various users push changes to; see
<a href=
"git-push.html">git-push(
1)
</a> and
1144 <a href=
"gitcvs-migration.html">gitcvs-migration(
7)
</a>.
</p></div>
1148 <h2 id=
"_exploring_history">Exploring history
</h2>
1149 <div class=
"sectionbody">
1150 <div class=
"paragraph"><p>Git history is represented as a series of interrelated commits. We
1151 have already seen that the
<em>git log
</em> command can list those commits.
1152 Note that first line of each git log entry also gives a name for the
1154 <div class=
"listingblock">
1155 <div class=
"content">
1156 <pre><code>$ git log
1157 commit c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
1158 Author: Junio C Hamano
<junkio@cox.net
>
1159 Date: Tue May
16 17:
18:
22 2006 -
0700
1161 merge-base: Clarify the comments on post processing.
</code></pre>
1163 <div class=
"paragraph"><p>We can give this name to
<em>git show
</em> to see the details about this
1165 <div class=
"listingblock">
1166 <div class=
"content">
1167 <pre><code>$ git show c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
</code></pre>
1169 <div class=
"paragraph"><p>But there are other ways to refer to commits. You can use any initial
1170 part of the name that is long enough to uniquely identify the commit:
</p></div>
1171 <div class=
"listingblock">
1172 <div class=
"content">
1173 <pre><code>$ git show c82a22c39c # the first few characters of the name are
1175 $ git show HEAD # the tip of the current branch
1176 $ git show experimental # the tip of the
"experimental" branch
</code></pre>
1178 <div class=
"paragraph"><p>Every commit usually has one
"parent" commit
1179 which points to the previous state of the project:
</p></div>
1180 <div class=
"listingblock">
1181 <div class=
"content">
1182 <pre><code>$ git show HEAD^ # to see the parent of HEAD
1183 $ git show HEAD^^ # to see the grandparent of HEAD
1184 $ git show HEAD~
4 # to see the great-great grandparent of HEAD
</code></pre>
1186 <div class=
"paragraph"><p>Note that merge commits may have more than one parent:
</p></div>
1187 <div class=
"listingblock">
1188 <div class=
"content">
1189 <pre><code>$ git show HEAD^
1 # show the first parent of HEAD (same as HEAD^)
1190 $ git show HEAD^
2 # show the second parent of HEAD
</code></pre>
1192 <div class=
"paragraph"><p>You can also give commits names of your own; after running
</p></div>
1193 <div class=
"listingblock">
1194 <div class=
"content">
1195 <pre><code>$ git tag v2.5
1b2e1d63ff
</code></pre>
1197 <div class=
"paragraph"><p>you can refer to
1b2e1d63ff by the name
"v2.5". If you intend to
1198 share this name with other people (for example, to identify a release
1199 version), you should create a
"tag" object, and perhaps sign it; see
1200 <a href=
"git-tag.html">git-tag(
1)
</a> for details.
</p></div>
1201 <div class=
"paragraph"><p>Any Git command that needs to know a commit can take any of these
1202 names. For example:
</p></div>
1203 <div class=
"listingblock">
1204 <div class=
"content">
1205 <pre><code>$ git diff v2.5 HEAD # compare the current HEAD to v2.5
1206 $ git branch stable v2.5 # start a new branch named
"stable" based
1208 $ git reset --hard HEAD^ # reset your current branch and working
1209 # directory to its state at HEAD^
</code></pre>
1211 <div class=
"paragraph"><p>Be careful with that last command: in addition to losing any changes
1212 in the working directory, it will also remove all later commits from
1213 this branch. If this branch is the only branch containing those
1214 commits, they will be lost. Also, don
’t use
<em>git reset
</em> on a
1215 publicly-visible branch that other developers pull from, as it will
1216 force needless merges on other developers to clean up the history.
1217 If you need to undo changes that you have pushed, use
<em>git revert
</em>
1219 <div class=
"paragraph"><p>The
<em>git grep
</em> command can search for strings in any version of your
1220 project, so
</p></div>
1221 <div class=
"listingblock">
1222 <div class=
"content">
1223 <pre><code>$ git grep
"hello" v2.5
</code></pre>
1225 <div class=
"paragraph"><p>searches for all occurrences of
"hello" in v2.5.
</p></div>
1226 <div class=
"paragraph"><p>If you leave out the commit name,
<em>git grep
</em> will search any of the
1227 files it manages in your current directory. So
</p></div>
1228 <div class=
"listingblock">
1229 <div class=
"content">
1230 <pre><code>$ git grep
"hello"</code></pre>
1232 <div class=
"paragraph"><p>is a quick way to search just the files that are tracked by Git.
</p></div>
1233 <div class=
"paragraph"><p>Many Git commands also take sets of commits, which can be specified
1234 in a number of ways. Here are some examples with
<em>git log
</em>:
</p></div>
1235 <div class=
"listingblock">
1236 <div class=
"content">
1237 <pre><code>$ git log v2.5..v2.6 # commits between v2.5 and v2.6
1238 $ git log v2.5.. # commits since v2.5
1239 $ git log
--since=
"2 weeks ago" # commits from the last
2 weeks
1240 $ git log v2.5.. Makefile # commits since v2.5 which modify
1241 # Makefile
</code></pre>
1243 <div class=
"paragraph"><p>You can also give
<em>git log
</em> a
"range" of commits where the first is not
1244 necessarily an ancestor of the second; for example, if the tips of
1245 the branches
"stable" and
"master" diverged from a common
1246 commit some time ago, then
</p></div>
1247 <div class=
"listingblock">
1248 <div class=
"content">
1249 <pre><code>$ git log stable..master
</code></pre>
1251 <div class=
"paragraph"><p>will list commits made in the master branch but not in the
1252 stable branch, while
</p></div>
1253 <div class=
"listingblock">
1254 <div class=
"content">
1255 <pre><code>$ git log master..stable
</code></pre>
1257 <div class=
"paragraph"><p>will show the list of commits made on the stable branch but not
1258 the master branch.
</p></div>
1259 <div class=
"paragraph"><p>The
<em>git log
</em> command has a weakness: it must present commits in a
1260 list. When the history has lines of development that diverged and
1261 then merged back together, the order in which
<em>git log
</em> presents
1262 those commits is meaningless.
</p></div>
1263 <div class=
"paragraph"><p>Most projects with multiple contributors (such as the Linux kernel,
1264 or Git itself) have frequent merges, and
<em>gitk
</em> does a better job of
1265 visualizing their history. For example,
</p></div>
1266 <div class=
"listingblock">
1267 <div class=
"content">
1268 <pre><code>$ gitk
--since=
"2 weeks ago" drivers/
</code></pre>
1270 <div class=
"paragraph"><p>allows you to browse any commits from the last
2 weeks of commits
1271 that modified files under the
"drivers" directory. (Note: you can
1272 adjust gitk
’s fonts by holding down the control key while pressing
1273 "-" or
"+".)
</p></div>
1274 <div class=
"paragraph"><p>Finally, most commands that take filenames will optionally allow you
1275 to precede any filename by a commit, to specify a particular version
1276 of the file:
</p></div>
1277 <div class=
"listingblock">
1278 <div class=
"content">
1279 <pre><code>$ git diff v2.5:Makefile HEAD:Makefile.in
</code></pre>
1281 <div class=
"paragraph"><p>You can also use
<em>git show
</em> to see any such file:
</p></div>
1282 <div class=
"listingblock">
1283 <div class=
"content">
1284 <pre><code>$ git show v2.5:Makefile
</code></pre>
1289 <h2 id=
"_next_steps">Next Steps
</h2>
1290 <div class=
"sectionbody">
1291 <div class=
"paragraph"><p>This tutorial should be enough to perform basic distributed revision
1292 control for your projects. However, to fully understand the depth
1293 and power of Git you need to understand two simple ideas on which it
1295 <div class=
"ulist"><ul>
1298 The object database is the rather elegant system used to
1299 store the history of your project
—files, directories, and
1305 The index file is a cache of the state of a directory tree,
1306 used to create commits, check out working directories, and
1307 hold the various trees involved in a merge.
1311 <div class=
"paragraph"><p>Part two of this tutorial explains the object
1312 database, the index file, and a few other odds and ends that you
’ll
1313 need to make the most of Git. You can find it at
<a href=
"gittutorial-2.html">gittutorial-
2(
7)
</a>.
</p></div>
1314 <div class=
"paragraph"><p>If you don
’t want to continue with that right away, a few other
1315 digressions that may be interesting at this point are:
</p></div>
1316 <div class=
"ulist"><ul>
1319 <a href=
"git-format-patch.html">git-format-patch(
1)
</a>,
<a href=
"git-am.html">git-am(
1)
</a>: These convert
1320 series of git commits into emailed patches, and vice versa,
1321 useful for projects such as the Linux kernel which rely heavily
1327 <a href=
"git-bisect.html">git-bisect(
1)
</a>: When there is a regression in your
1328 project, one way to track down the bug is by searching through
1329 the history to find the exact commit that
’s to blame. Git bisect
1330 can help you perform a binary search for that commit. It is
1331 smart enough to perform a close-to-optimal search even in the
1332 case of complex non-linear history with lots of merged branches.
1337 <a href=
"gitworkflows.html">gitworkflows(
7)
</a>: Gives an overview of recommended
1343 <a href=
"giteveryday.html">giteveryday(
7)
</a>: Everyday Git with
20 Commands Or So.
1348 <a href=
"gitcvs-migration.html">gitcvs-migration(
7)
</a>: Git for CVS users.
1355 <h2 id=
"_see_also">SEE ALSO
</h2>
1356 <div class=
"sectionbody">
1357 <div class=
"paragraph"><p><a href=
"gittutorial-2.html">gittutorial-
2(
7)
</a>,
1358 <a href=
"gitcvs-migration.html">gitcvs-migration(
7)
</a>,
1359 <a href=
"gitcore-tutorial.html">gitcore-tutorial(
7)
</a>,
1360 <a href=
"gitglossary.html">gitglossary(
7)
</a>,
1361 <a href=
"git-help.html">git-help(
1)
</a>,
1362 <a href=
"gitworkflows.html">gitworkflows(
7)
</a>,
1363 <a href=
"giteveryday.html">giteveryday(
7)
</a>,
1364 <a href=
"user-manual.html">The Git User
’s Manual
</a></p></div>
1368 <h2 id=
"_git">GIT
</h2>
1369 <div class=
"sectionbody">
1370 <div class=
"paragraph"><p>Part of the
<a href=
"git.html">git(
1)
</a> suite
</p></div>
1374 <div id=
"footnotes"><hr /></div>
1376 <div id=
"footer-text">
1378 2021-
08-
06 16:
16:
38 PDT