Permalink
Browse files

Initial revision of "git", the information manager from hell

  • Loading branch information...
Linus Torvalds
Linus Torvalds committed Apr 7, 2005
0 parents commit e83c5163316f89bfbde7d9ab23ca2e25604af290
Showing with 1,244 additions and 0 deletions.
  1. +40 −0 Makefile
  2. +168 −0 README
  3. +93 −0 cache.h
  4. +23 −0 cat-file.c
  5. +172 −0 commit-tree.c
  6. +51 −0 init-db.c
  7. +259 −0 read-cache.c
  8. +43 −0 read-tree.c
  9. +81 −0 show-diff.c
  10. +248 −0 update-cache.c
  11. +66 −0 write-tree.c
@@ -0,0 +1,40 @@
CFLAGS=-g

This comment has been minimized.

Show comment
Hide comment
@ganoch

ganoch Sep 1, 2017

^-- was here

@ganoch

ganoch Sep 1, 2017

^-- was here

This comment has been minimized.

Show comment
Hide comment

This comment has been minimized.

Show comment
Hide comment
@gramonov

gramonov Sep 27, 2017

you're not alone

@gramonov

gramonov Sep 27, 2017

you're not alone

This comment has been minimized.

Show comment
Hide comment
@Technochips

Technochips Jan 7, 2018

what's this

This comment has been minimized.

Show comment
Hide comment
@takpare

takpare Jan 7, 2018

@takpare

takpare via email Jan 7, 2018

This comment has been minimized.

Show comment
Hide comment
@CosmoJG

CosmoJG Jan 12, 2018

What a magical place to be!

@CosmoJG

CosmoJG Jan 12, 2018

What a magical place to be!

This comment has been minimized.

Show comment
Hide comment

This comment has been minimized.

Show comment
Hide comment

This comment has been minimized.

Show comment
Hide comment

This comment has been minimized.

Show comment
Hide comment
@chhh

chhh Mar 26, 2018

a dive in the past

@chhh

chhh Mar 26, 2018

a dive in the past

This comment has been minimized.

Show comment
Hide comment
@joeshub

joeshub Mar 30, 2018

Yes. I'm George. George McFly. I'm your density. I mean, your destiny.

@joeshub

joeshub Mar 30, 2018

Yes. I'm George. George McFly. I'm your density. I mean, your destiny.

This comment has been minimized.

Show comment
Hide comment
@psanatov

psanatov May 2, 2018

хуй

This comment has been minimized.

Show comment
Hide comment

This comment has been minimized.

Show comment
Hide comment

This comment has been minimized.

Show comment
Hide comment
@TxusBlack

TxusBlack Jun 26, 2018

Hi son! :v

This comment has been minimized.

Show comment
Hide comment
@stringparser

stringparser Jul 11, 2018

I love this world we are building

@stringparser

stringparser Jul 11, 2018

I love this world we are building

This comment has been minimized.

Show comment
Hide comment
@andrew-secret

andrew-secret Jul 12, 2018

I saw the future..

@andrew-secret

andrew-secret Jul 12, 2018

I saw the future..

This comment has been minimized.

Show comment
Hide comment
@masonkoh

masonkoh Jul 24, 2018

Hello world!

This comment has been minimized.

Show comment
Hide comment
@andersonaddo

andersonaddo Jul 24, 2018

Where it all started!

@andersonaddo

andersonaddo Jul 24, 2018

Where it all started!

CC=gcc
PROG=update-cache show-diff init-db write-tree read-tree commit-tree cat-file
all: $(PROG)
install: $(PROG)
install $(PROG) $(HOME)/bin/
LIBS= -lssl
init-db: init-db.o
update-cache: update-cache.o read-cache.o
$(CC) $(CFLAGS) -o update-cache update-cache.o read-cache.o $(LIBS)
show-diff: show-diff.o read-cache.o
$(CC) $(CFLAGS) -o show-diff show-diff.o read-cache.o $(LIBS)
write-tree: write-tree.o read-cache.o
$(CC) $(CFLAGS) -o write-tree write-tree.o read-cache.o $(LIBS)
read-tree: read-tree.o read-cache.o
$(CC) $(CFLAGS) -o read-tree read-tree.o read-cache.o $(LIBS)
commit-tree: commit-tree.o read-cache.o
$(CC) $(CFLAGS) -o commit-tree commit-tree.o read-cache.o $(LIBS)
cat-file: cat-file.o read-cache.o
$(CC) $(CFLAGS) -o cat-file cat-file.o read-cache.o $(LIBS)
read-cache.o: cache.h
show-diff.o: cache.h
clean:
rm -f *.o $(PROG) temp_git_file_*
backup: clean
cd .. ; tar czvf dircache.tar.gz dir-cache
168 README
@@ -0,0 +1,168 @@
GIT - the stupid content tracker
"git" can mean anything, depending on your mood.
- random three-letter combination that is pronounceable, and not
actually used by any common UNIX command. The fact that it is a
mispronounciation of "get" may or may not be relevant.
- stupid. contemptible and despicable. simple. Take your pick from the
dictionary of slang.
- "global information tracker": you're in a good mood, and it actually
works for you. Angels sing, and a light suddenly fills the room.
- "goddamn idiotic truckload of sh*t": when it breaks
This is a stupid (but extremely fast) directory content manager. It
doesn't do a whole lot, but what it _does_ do is track directory
contents efficiently.
There are two object abstractions: the "object database", and the
"current directory cache".
The Object Database (SHA1_FILE_DIRECTORY)
The object database is literally just a content-addressable collection
of objects. All objects are named by their content, which is
approximated by the SHA1 hash of the object itself. Objects may refer
to other objects (by referencing their SHA1 hash), and so you can build
up a hierarchy of objects.
There are several kinds of objects in the content-addressable collection
database. They are all in deflated with zlib, and start off with a tag
of their type, and size information about the data. The SHA1 hash is
always the hash of the _compressed_ object, not the original one.
In particular, the consistency of an object can always be tested
independently of the contents or the type of the object: all objects can
be validated by verifying that (a) their hashes match the content of the
file and (b) the object successfully inflates to a stream of bytes that
forms a sequence of <ascii tag without space> + <space> + <ascii decimal
size> + <byte\0> + <binary object data>.
BLOB: A "blob" object is nothing but a binary blob of data, and doesn't
refer to anything else. There is no signature or any other verification
of the data, so while the object is consistent (it _is_ indexed by its
sha1 hash, so the data itself is certainly correct), it has absolutely
no other attributes. No name associations, no permissions. It is
purely a blob of data (ie normally "file contents").
TREE: The next hierarchical object type is the "tree" object. A tree
object is a list of permission/name/blob data, sorted by name. In other
words the tree object is uniquely determined by the set contents, and so
two separate but identical trees will always share the exact same
object.
Again, a "tree" object is just a pure data abstraction: it has no
history, no signatures, no verification of validity, except that the
contents are again protected by the hash itself. So you can trust the
contents of a tree, the same way you can trust the contents of a blob,
but you don't know where those contents _came_ from.
Side note on trees: since a "tree" object is a sorted list of
"filename+content", you can create a diff between two trees without
actually having to unpack two trees. Just ignore all common parts, and
your diff will look right. In other words, you can effectively (and
efficiently) tell the difference between any two random trees by O(n)
where "n" is the size of the difference, rather than the size of the
tree.
Side note 2 on trees: since the name of a "blob" depends entirely and
exclusively on its contents (ie there are no names or permissions
involved), you can see trivial renames or permission changes by noticing
that the blob stayed the same. However, renames with data changes need
a smarter "diff" implementation.
CHANGESET: The "changeset" object is an object that introduces the
notion of history into the picture. In contrast to the other objects,
it doesn't just describe the physical state of a tree, it describes how
we got there, and why.
A "changeset" is defined by the tree-object that it results in, the
parent changesets (zero, one or more) that led up to that point, and a
comment on what happened. Again, a changeset is not trusted per se:
the contents are well-defined and "safe" due to the cryptographically
strong signatures at all levels, but there is no reason to believe that
the tree is "good" or that the merge information makes sense. The
parents do not have to actually have any relationship with the result,
for example.
Note on changesets: unlike real SCM's, changesets do not contain rename
information or file mode chane information. All of that is implicit in
the trees involved (the result tree, and the result trees of the
parents), and describing that makes no sense in this idiotic file
manager.
TRUST: The notion of "trust" is really outside the scope of "git", but
it's worth noting a few things. First off, since everything is hashed
with SHA1, you _can_ trust that an object is intact and has not been
messed with by external sources. So the name of an object uniquely
identifies a known state - just not a state that you may want to trust.
Furthermore, since the SHA1 signature of a changeset refers to the
SHA1 signatures of the tree it is associated with and the signatures
of the parent, a single named changeset specifies uniquely a whole
set of history, with full contents. You can't later fake any step of
the way once you have the name of a changeset.
So to introduce some real trust in the system, the only thing you need
to do is to digitally sign just _one_ special note, which includes the
name of a top-level changeset. Your digital signature shows others that
you trust that changeset, and the immutability of the history of
changesets tells others that they can trust the whole history.
In other words, you can easily validate a whole archive by just sending
out a single email that tells the people the name (SHA1 hash) of the top
changeset, and digitally sign that email using something like GPG/PGP.
In particular, you can also have a separate archive of "trust points" or
tags, which document your (and other peoples) trust. You may, of
course, archive these "certificates of trust" using "git" itself, but
it's not something "git" does for you.
Another way of saying the same thing: "git" itself only handles content
integrity, the trust has to come from outside.
Current Directory Cache (".dircache/index")
The "current directory cache" is a simple binary file, which contains an
efficient representation of a virtual directory content at some random
time. It does so by a simple array that associates a set of names,
dates, permissions and content (aka "blob") objects together. The cache
is always kept ordered by name, and names are unique at any point in
time, but the cache has no long-term meaning, and can be partially
updated at any time.
In particular, the "current directory cache" certainly does not need to
be consistent with the current directory contents, but it has two very
important attributes:
(a) it can re-generate the full state it caches (not just the directory
structure: through the "blob" object it can regenerate the data too)
As a special case, there is a clear and unambiguous one-way mapping
from a current directory cache to a "tree object", which can be
efficiently created from just the current directory cache without
actually looking at any other data. So a directory cache at any
one time uniquely specifies one and only one "tree" object (but
has additional data to make it easy to match up that tree object
with what has happened in the directory)
and
(b) it has efficient methods for finding inconsistencies between that
cached state ("tree object waiting to be instantiated") and the
current state.
Those are the two ONLY things that the directory cache does. It's a
cache, and the normal operation is to re-generate it completely from a
known tree object, or update/compare it with a live tree that is being
developed. If you blow the directory cache away entirely, you haven't
lost any information as long as you have the name of the tree that it
described.
(But directory caches can also have real information in them: in
particular, they can have the representation of an intermediate tree
that has not yet been instantiated. So they do have meaning and usage
outside of caching - in one sense you can think of the current directory
cache as being the "work in progress" towards a tree commit).
93 cache.h
@@ -0,0 +1,93 @@
#ifndef CACHE_H
#define CACHE_H
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <sys/mman.h>
#include <openssl/sha.h>
#include <zlib.h>
/*
* Basic data structures for the directory cache
*
* NOTE NOTE NOTE! This is all in the native CPU byte format. It's
* not even trying to be portable. It's trying to be efficient. It's
* just a cache, after all.
*/
#define CACHE_SIGNATURE 0x44495243 /* "DIRC" */

This comment has been minimized.

Show comment
Hide comment
@ganoch

ganoch Sep 1, 2017

^- was here also

@ganoch

ganoch Sep 1, 2017

^- was here also

struct cache_header {
unsigned int signature;
unsigned int version;
unsigned int entries;
unsigned char sha1[20];
};
/*
* The "cache_time" is just the low 32 bits of the
* time. It doesn't matter if it overflows - we only
* check it for equality in the 32 bits we save.
*/
struct cache_time {
unsigned int sec;
unsigned int nsec;
};
/*
* dev/ino/uid/gid/size are also just tracked to the low 32 bits
* Again - this is just a (very strong in practice) heuristic that
* the inode hasn't changed.
*/
struct cache_entry {
struct cache_time ctime;
struct cache_time mtime;
unsigned int st_dev;
unsigned int st_ino;
unsigned int st_mode;
unsigned int st_uid;
unsigned int st_gid;
unsigned int st_size;
unsigned char sha1[20];
unsigned short namelen;
unsigned char name[0];
};
const char *sha1_file_directory;
struct cache_entry **active_cache;
unsigned int active_nr, active_alloc;
#define DB_ENVIRONMENT "SHA1_FILE_DIRECTORY"
#define DEFAULT_DB_ENVIRONMENT ".dircache/objects"
#define cache_entry_size(len) ((offsetof(struct cache_entry,name) + (len) + 8) & ~7)
#define ce_size(ce) cache_entry_size((ce)->namelen)
#define alloc_nr(x) (((x)+16)*3/2)
/* Initialize the cache information */
extern int read_cache(void);
/* Return a statically allocated filename matching the sha1 signature */
extern char *sha1_file_name(unsigned char *sha1);
/* Write a memory buffer out to the sha file */
extern int write_sha1_buffer(unsigned char *sha1, void *buf, unsigned int size);
/* Read and unpack a sha1 file into memory, write memory to a sha1 file */
extern void * read_sha1_file(unsigned char *sha1, char *type, unsigned long *size);
extern int write_sha1_file(char *buf, unsigned len);
/* Convert to/from hex/sha1 representation */
extern int get_sha1_hex(char *hex, unsigned char *sha1);
extern char *sha1_to_hex(unsigned char *sha1); /* static buffer! */
/* General helper functions */
extern void usage(const char *err);
#endif /* CACHE_H */
@@ -0,0 +1,23 @@
#include "cache.h"
int main(int argc, char **argv)
{
unsigned char sha1[20];
char type[20];
void *buf;
unsigned long size;
char template[] = "temp_git_file_XXXXXX";
int fd;
if (argc != 2 || get_sha1_hex(argv[1], sha1))
usage("cat-file: cat-file <sha1>");
buf = read_sha1_file(sha1, type, &size);
if (!buf)
exit(1);
fd = mkstemp(template);
if (fd < 0)
usage("unable to create tempfile");
if (write(fd, buf, size) != size)
strcpy(type, "bad");
printf("%s: %s\n", template, type);
}
Oops, something went wrong.

175 comments on commit e83c516

@marcioAlmada

This comment has been minimized.

Show comment
Hide comment
@marcioAlmada

marcioAlmada Nov 26, 2014

Contributor

@chhantyal that's probably why the first commit is so big

Contributor

marcioAlmada replied Nov 26, 2014

@chhantyal that's probably why the first commit is so big

@hsgui

This comment has been minimized.

Show comment
Hide comment
@hsgui

hsgui Nov 26, 2014

@tadas-s, thanks for your help! I also got some warning. Maybe it's caused by some compile option.

@tadas-s, thanks for your help! I also got some warning. Maybe it's caused by some compile option.

@umayr

This comment has been minimized.

Show comment
Hide comment
@umayr

umayr Nov 26, 2014

@chhantyal Gitception. u__u

@chhantyal Gitception. u__u

@z510727296

This comment has been minimized.

Show comment
Hide comment

nice

@yangbin01

This comment has been minimized.

Show comment
Hide comment

给跪

@guilipan

This comment has been minimized.

Show comment
Hide comment
@guilipan

guilipan Dec 1, 2014

亮瞎了都

亮瞎了都

@lc-soft

This comment has been minimized.

Show comment
Hide comment
@lc-soft

lc-soft Dec 1, 2014

留名。

留名。

@hinewday

This comment has been minimized.

Show comment
Hide comment

amazing!

@peerless2012

This comment has been minimized.

Show comment
Hide comment

Mark

@jarry

This comment has been minimized.

Show comment
Hide comment
@jarry

jarry Dec 1, 2014

wow..commit many code in a single.

jarry replied Dec 1, 2014

wow..commit many code in a single.

@RogerGold

This comment has been minimized.

Show comment
Hide comment
@RogerGold

RogerGold Dec 1, 2014

open source is a great behavior

open source is a great behavior

@jacarrichan

This comment has been minimized.

Show comment
Hide comment
@jacarrichan

jacarrichan Dec 1, 2014

public class Linux {
    public static void main(String[] args) {
        System.out.println("火钳刘明");
    }
}
public class Linux {
    public static void main(String[] args) {
        System.out.println("火钳刘明");
    }
}
@CoderYCG

This comment has been minimized.

Show comment
Hide comment

100块

@80520997

This comment has been minimized.

Show comment
Hide comment
@80520997

80520997 Dec 2, 2014

撸过...

撸过...

@umcsdon

This comment has been minimized.

Show comment
Hide comment
@luxe

This comment has been minimized.

Show comment
Hide comment
@luxe

luxe Dec 4, 2014

void *new; /* only in c */

luxe replied Dec 4, 2014

void *new; /* only in c */
@devlysh

This comment has been minimized.

Show comment
Hide comment
@devlysh

devlysh Jan 22, 2015

initial commit
indeed

initial commit
indeed

@micromaomao

This comment has been minimized.

Show comment
Hide comment
@micromaomao

micromaomao Feb 14, 2015

留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名

留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名留名

@rands0n

This comment has been minimized.

Show comment
Hide comment
@rands0n

rands0n Mar 2, 2015

initial commit
indeed

initial commit
indeed

@note89

This comment has been minimized.

Show comment
Hide comment

<3

@nwalter08

This comment has been minimized.

Show comment
Hide comment

BRUH

@kaspermarstal

This comment has been minimized.

Show comment
Hide comment
@kaspermarstal

kaspermarstal Apr 6, 2015

Well done Linus

Well done Linus

@joekim

This comment has been minimized.

Show comment
Hide comment
@joekim

joekim Apr 7, 2015

Wow! Great read.

Wow! Great read.

@guilhermepontes

This comment has been minimized.

Show comment
Hide comment
@guilhermepontes

guilhermepontes Apr 7, 2015

10 years! 🍰 🎉 🎈 👏 👏

10 years! 🍰 🎉 🎈 👏 👏

@arno01

This comment has been minimized.

Show comment
Hide comment
@arno01

arno01 Apr 7, 2015

Happy Birthday, the information manager from hell ! 🎂

Happy Birthday, the information manager from hell ! 🎂

@louy2

This comment has been minimized.

Show comment
Hide comment
@louy2

louy2 Apr 8, 2015

Git is 10 years old! Happy birthday! 🎂

louy2 replied Apr 8, 2015

Git is 10 years old! Happy birthday! 🎂

@Igor1201

This comment has been minimized.

Show comment
Hide comment
@Igor1201

Igor1201 Apr 8, 2015

10 years of awesomeness!

10 years of awesomeness!

@chakming

This comment has been minimized.

Show comment
Hide comment
@chakming

chakming Apr 8, 2015

🎂🎂🎂

🎂🎂🎂

@zzjin

This comment has been minimized.

Show comment
Hide comment
@zzjin

zzjin Apr 8, 2015

Git is 10 years old! WHAT!
Happy birthday! 🎂

zzjin replied Apr 8, 2015

Git is 10 years old! WHAT!
Happy birthday! 🎂

@realyze

This comment has been minimized.

Show comment
Hide comment
@OE8CLR

This comment has been minimized.

Show comment
Hide comment
@OE8CLR

OE8CLR Apr 8, 2015

Happy Brithday =)

Happy Brithday =)

@giulioprinaricotti

This comment has been minimized.

Show comment
Hide comment
@giulioprinaricotti

giulioprinaricotti Apr 9, 2015

Happy 10th anniversary!

Happy 10th anniversary!

@yvt

This comment has been minimized.

Show comment
Hide comment

yvt replied Apr 9, 2015

+1

@vassilevsky

This comment has been minimized.

Show comment
Hide comment
@vassilevsky

vassilevsky Apr 9, 2015

Спасибо, Линус!

Спасибо, Линус!

@RishYang

This comment has been minimized.

Show comment
Hide comment

+1

@ychang-brightcove

This comment has been minimized.

Show comment
Hide comment
@shadow-bone-dark

This comment has been minimized.

Show comment
Hide comment
@SeregaAltmer

This comment has been minimized.

Show comment
Hide comment
@ebrian

This comment has been minimized.

Show comment
Hide comment
@ebrian

ebrian Apr 16, 2015

K, throwing my hat in the ring.

K, throwing my hat in the ring.

@Aorjoa

This comment has been minimized.

Show comment
Hide comment

+1024

@ozbillwang

This comment has been minimized.

Show comment
Hide comment
@ozbillwang

ozbillwang May 1, 2015

IT World was changing from here.

IT World was changing from here.

@fcladera

This comment has been minimized.

Show comment
Hide comment
@fcladera

fcladera May 11, 2015

Just amazing!

Just amazing!

@sdaitzman

This comment has been minimized.

Show comment
Hide comment

yay

@Stargator

This comment has been minimized.

Show comment
Hide comment

👏

@vijairaj

This comment has been minimized.

Show comment
Hide comment
@vijairaj

vijairaj Aug 4, 2015

It's impressive to see how this seed has germinated to a great ecosystem now.
Please see the snapshot of this commit with additional annotation and a quick demo of how this can be used as an SCM.

It's impressive to see how this seed has germinated to a great ecosystem now.
Please see the snapshot of this commit with additional annotation and a quick demo of how this can be used as an SCM.

@horrorho

This comment has been minimized.

Show comment
Hide comment

+1

@heger31

This comment has been minimized.

Show comment
Hide comment

H

@voku

This comment has been minimized.

Show comment
Hide comment
@voku

voku Aug 21, 2015

git init --template=❤️

voku replied Aug 21, 2015

git init --template=❤️

@yaszim23

This comment has been minimized.

Show comment
Hide comment
@yaszim23

yaszim23 Aug 25, 2015

@Wingie

This comment has been minimized.

Show comment
Hide comment
@Wingie

Wingie Sep 9, 2015

e83c516 the sha that began it all...

e83c516 the sha that began it all...

@donhui

This comment has been minimized.

Show comment
Hide comment

mark

@wtser

This comment has been minimized.

Show comment
Hide comment

厉害

@hoangddt

This comment has been minimized.

Show comment
Hide comment
@hoangddt

hoangddt Nov 28, 2015

Hello first git commit

Hello first git commit

@gregstula

This comment has been minimized.

Show comment
Hide comment

😍

@Ephemera

This comment has been minimized.

Show comment
Hide comment
@Ephemera

Ephemera Jan 14, 2016

Contributor

Thanks

Contributor

Ephemera replied Jan 14, 2016

Thanks

@Git008

This comment has been minimized.

Show comment
Hide comment
@Git008

Git008 Jan 21, 2016

过来看看。

过来看看。

@ninneko

This comment has been minimized.

Show comment
Hide comment

Thanks

@edpenano

This comment has been minimized.

Show comment
Hide comment

YAASSS!

@JefMari

This comment has been minimized.

Show comment
Hide comment
@JefMari

JefMari Feb 16, 2016

The Readme is amazing! 😮

The Readme is amazing! 😮

@NuLL3rr0r

This comment has been minimized.

Show comment
Hide comment
@NuLL3rr0r

NuLL3rr0r May 26, 2016

Epic! The README is hilarious. I'm not a fan of Linux kernel (YES I'm on BSD camp), nonetheless Git is a solid peace of software.

Epic! The README is hilarious. I'm not a fan of Linux kernel (YES I'm on BSD camp), nonetheless Git is a solid peace of software.

@sulphur

This comment has been minimized.

Show comment
Hide comment

👍

@Overtonesinger

This comment has been minimized.

Show comment
Hide comment
@Overtonesinger

Overtonesinger Jun 30, 2016

Wow! Epic indeed!

Wow! Epic indeed!

@bugaevc

This comment has been minimized.

Show comment
Hide comment
@bugaevc

bugaevc Jul 16, 2016

I've made it to here! And this is awesome!

I've made it to here! And this is awesome!

@lwm

This comment has been minimized.

Show comment
Hide comment
@lwm

lwm Jul 21, 2016

Max stoke.

lwm replied Jul 21, 2016

Max stoke.

@James328

This comment has been minimized.

Show comment
Hide comment

+1

@jiangpengnju

This comment has been minimized.

Show comment
Hide comment
@jiangpengnju

jiangpengnju Jul 27, 2016

Another masterpiece!

Another masterpiece!

@ruoli

This comment has been minimized.

Show comment
Hide comment
@ruoli

ruoli Aug 9, 2016

华丽。。。亮瞎了狗眼。。。
magenificent!!

ruoli replied Aug 9, 2016

华丽。。。亮瞎了狗眼。。。
magenificent!!

@nickfrostatx

This comment has been minimized.

Show comment
Hide comment

🍻

@archit47

This comment has been minimized.

Show comment
Hide comment
@archit47

archit47 Aug 22, 2016

Simply amazing. I loved it. ❤️ ❤️
Linus a genius programmer with a great sense of humor. 👍

Simply amazing. I loved it. ❤️ ❤️
Linus a genius programmer with a great sense of humor. 👍

@linsoong

This comment has been minimized.

Show comment
Hide comment

Mark

@mokoaki

This comment has been minimized.

Show comment
Hide comment

mokoaki replied Sep 6, 2016

Rilakkuma

@kenta-s

This comment has been minimized.

Show comment
Hide comment
@kenta-s

kenta-s Sep 6, 2016

🎉 🎉 🎉

🎉 🎉 🎉

@mikejbrown

This comment has been minimized.

Show comment
Hide comment
@mikejbrown

mikejbrown Sep 7, 2016

😮 👏 🎉

😮 👏 🎉

@nifengcn

This comment has been minimized.

Show comment
Hide comment
@nifengcn

nifengcn Sep 12, 2016

mark is a must

mark is a must

@xiocode

This comment has been minimized.

Show comment
Hide comment

git init

@hoanghuynh

This comment has been minimized.

Show comment
Hide comment
@hoanghuynh

hoanghuynh Dec 23, 2016

mind = blown

mind = blown

@pedrofracassi

This comment has been minimized.

Show comment
Hide comment
@pedrofracassi

pedrofracassi Jan 18, 2017

So it all started here, eh?

So it all started here, eh?

@SeanHub

This comment has been minimized.

Show comment
Hide comment
@SeanHub

SeanHub Mar 24, 2017

I wonder how many times Linus initially committed before being happy with this first genuine commit.

I wonder how many times Linus initially committed before being happy with this first genuine commit.

@IsaacVazquez

This comment has been minimized.

Show comment
Hide comment
@IsaacVazquez

IsaacVazquez Mar 28, 2017

I read everything.

I read everything.

@kevinzurek

This comment has been minimized.

Show comment
Hide comment
@kevinzurek

kevinzurek Apr 4, 2017

Great work, Linus

Great work, Linus

@abarrak

This comment has been minimized.

Show comment
Hide comment
@abarrak

abarrak Apr 12, 2017

First commit in Git history ..

First commit in Git history ..

@gagustavo

This comment has been minimized.

Show comment
Hide comment
@gagustavo

gagustavo Apr 18, 2017

Acertô, mizerávi!

Acertô, mizerávi!

@captainpete

This comment has been minimized.

Show comment
Hide comment

Nice!

@xiaxiaoyu1988

This comment has been minimized.

Show comment
Hide comment

git init

@BasixKOR

This comment has been minimized.

Show comment
Hide comment
@BasixKOR

BasixKOR Jul 4, 2017

Thank you so much 😃

Thank you so much 😃

@ahrinosry

This comment has been minimized.

Show comment
Hide comment
@ahrinosry

ahrinosry Jul 4, 2017

@yiminyuan

This comment has been minimized.

Show comment
Hide comment

git init

@xv

This comment has been minimized.

Show comment
Hide comment
@xv

xv Nov 14, 2017

presses F to pay respects

xv replied Nov 14, 2017

presses F to pay respects

@adelarsq

This comment has been minimized.

Show comment
Hide comment
@adelarsq

adelarsq Nov 23, 2017

thank you Linus!

thank you Linus!

@IsaacVazquez

This comment has been minimized.

Show comment
Hide comment
@CosmoJG

This comment has been minimized.

Show comment
Hide comment
@CosmoJG

CosmoJG Jan 12, 2018

THE FIRST FIRST COMMIT.

THE FIRST FIRST COMMIT.

@pakls

This comment has been minimized.

Show comment
Hide comment
@pakls

pakls Jan 27, 2018

Was here!

Was here!

@SyedAman

This comment has been minimized.

Show comment
Hide comment
@SyedAman

SyedAman Mar 31, 2018

please review pull request

please review pull request

@x4m3

This comment has been minimized.

Show comment
Hide comment

x4m3 replied Apr 22, 2018

wassup

@mrvicadai

This comment has been minimized.

Show comment
Hide comment

+1

@huangzonghao

This comment has been minimized.

Show comment
Hide comment
@huangzonghao

huangzonghao May 25, 2018

git init commit

Thank you Linus!

Great to witness the history!

git init commit

Thank you Linus!

Great to witness the history!

@ForYaSee

This comment has been minimized.

Show comment
Hide comment
@ForYaSee

ForYaSee Jul 19, 2018

Hello World!

Hello World!

@masonkoh

This comment has been minimized.

Show comment
Hide comment
@masonkoh

masonkoh Jul 24, 2018

Hello, World! from 2018

Hello, World! from 2018

@wavezhang

This comment has been minimized.

Show comment
Hide comment

@wavezhang 到此一游

@quilSalazar

This comment has been minimized.

Show comment
Hide comment
@quilSalazar

quilSalazar Aug 5, 2018

A lovely little piece of history.

A lovely little piece of history.

Please sign in to comment.