Skip to content
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 was marked as resolved.

Copy link
@ganoch

ganoch Sep 1, 2017

^-- was here

This comment was marked as resolved.

Copy link
@fabm22

This comment was marked as resolved.

Copy link
@gramonov

gramonov Sep 27, 2017

you're not alone

This comment was marked as resolved.

Copy link
@Technochips

This comment was marked as resolved.

Copy link
@takpare

takpare via email Jan 7, 2018

This comment was marked as off-topic.

Copy link
@cosmojg

cosmojg Jan 12, 2018

What a magical place to be!

This comment was marked as off-topic.

Copy link
@jeevantakhar

This comment was marked as off-topic.

Copy link
@lrepolho

This comment was marked as off-topic.

Copy link
@rissson

This comment was marked as off-topic.

Copy link
@chhh

chhh Mar 26, 2018

a dive in the past

This comment was marked as off-topic.

Copy link
@joeshub

joeshub Mar 30, 2018

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

This comment was marked as resolved.

Copy link
@psanatov

psanatov May 2, 2018

хуй

This comment was marked as resolved.

Copy link
@AGraber

This comment was marked as resolved.

Copy link
@abdyfranco

This comment was marked as resolved.

Copy link
@TxusBlack

This comment was marked as resolved.

Copy link
@stringparser

stringparser Jul 11, 2018

I love this world we are building

This comment was marked as off-topic.

Copy link
@andrew-secret

andrew-secret Jul 12, 2018

I saw the future..

This comment was marked as off-topic.

Copy link
@masonkoh

This comment was marked as off-topic.

Copy link
@andersonaddo

andersonaddo Jul 24, 2018

Where it all started!

This comment was marked as off-topic.

Copy link
@JoveYu

This comment was marked as off-topic.

Copy link
@isipisi281

isipisi281 Jan 30, 2019

This will live forever

This comment was marked as off-topic.

Copy link
@lucas-janon

This comment was marked as off-topic.

Copy link
@SathishKumarD

SathishKumarD Feb 24, 2019

May be I will be in some screenshot?

This comment was marked as off-topic.

Copy link
@PratikDeshpande

PratikDeshpande Feb 24, 2019

LGTM. I can now say that that I am one of the reviewers for Git. Updating my resume...

This comment was marked as off-topic.

Copy link
@ChrisBrownie55

ChrisBrownie55 Feb 24, 2019

🌟 Chris Brown was here

This comment was marked as off-topic.

Copy link
@basilpapadimas

basilpapadimas Feb 24, 2019

Git does not come from hell. It comes from paradise.

This comment was marked as off-topic.

Copy link
@Trung0246

Trung0246 Feb 24, 2019

I guess I was here 🤔

This comment was marked as off-topic.

Copy link
@ahmgeek

ahmgeek Mar 7, 2019

I though I will be the first to be here, always crowded everywhere 😒

This comment was marked as off-topic.

Copy link
@mlboy

mlboy Apr 4, 2019

我是一页一页翻到这里的。

This comment was marked as off-topic.

Copy link
@devlysh

devlysh May 7, 2019

Я тут також був.

This comment was marked as off-topic.

Copy link
@Nursultan91

Nursultan91 May 18, 2019

тут был Нурс)

This comment was marked as off-topic.

Copy link
@miry

miry Aug 6, 2019

I was here

This comment was marked as off-topic.

Copy link
@Airthee

This comment was marked as off-topic.

Copy link
@jakesyl

This comment was marked as off-topic.

Copy link
@jwilljacob

jwilljacob Dec 21, 2019

i'm not alone!!!

This comment was marked as off-topic.

Copy link
@deeprobin

This comment was marked as off-topic.

Copy link
@ToMakeSense

ToMakeSense Apr 23, 2020

Witness the legend👍!

This comment was marked as off-topic.

Copy link
@APACGAMONDE

APACGAMONDE Apr 28, 2020

Thank you for comments

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

This comment was marked as off-topic.

Copy link
@au-phiware

au-phiware Oct 13, 2018

No longer true, git is now a common UNIX command.

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 comment was marked as off-topic.

Copy link
@Dog2puppy

This comment was marked as off-topic.

Copy link
@SRGOM

SRGOM Apr 13, 2019

Initial makefile like this- looks like the guy who wrote it knows some stuff!


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 was marked as off-topic.

Copy link
@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);
}

193 comments on commit e83c516

@rands0n

This comment was marked as off-topic.

Copy link

@rands0n rands0n replied Mar 2, 2015

initial commit
indeed

@note89

This comment was marked as off-topic.

Copy link

@note89 note89 replied Apr 1, 2015

<3

@nwalter08

This comment was marked as off-topic.

Copy link

@nwalter08 nwalter08 replied Apr 6, 2015

BRUH

@kaspermarstal

This comment was marked as off-topic.

Copy link

@kaspermarstal kaspermarstal replied Apr 6, 2015

Well done Linus

@joekim

This comment was marked as off-topic.

Copy link

@joekim joekim replied Apr 7, 2015

Wow! Great read.

@guilhermepontes

This comment was marked as off-topic.

Copy link

@guilhermepontes guilhermepontes replied Apr 7, 2015

10 years! 🍰 🎉 🎈 👏 👏

@arno01

This comment was marked as off-topic.

Copy link

@arno01 arno01 replied Apr 7, 2015

Happy Birthday, the information manager from hell ! 🎂

@louy2

This comment was marked as off-topic.

Copy link

@louy2 louy2 replied Apr 8, 2015

Git is 10 years old! Happy birthday! 🎂

@comigor

This comment was marked as off-topic.

Copy link

@comigor comigor replied Apr 8, 2015

10 years of awesomeness!

@chakming

This comment was marked as off-topic.

Copy link

@chakming chakming replied Apr 8, 2015

🎂🎂🎂

@zzjin

This comment was marked as off-topic.

Copy link

@zzjin zzjin replied Apr 8, 2015

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

@realyze

This comment was marked as off-topic.

Copy link

@realyze realyze replied Apr 8, 2015

@OE8CLR

This comment was marked as off-topic.

Copy link

@OE8CLR OE8CLR replied Apr 8, 2015

Happy Brithday =)

@giulioprinaricotti

This comment was marked as off-topic.

Copy link

@giulioprinaricotti giulioprinaricotti replied Apr 9, 2015

Happy 10th anniversary!

@yvt

This comment was marked as off-topic.

Copy link

@yvt yvt replied Apr 9, 2015

+1

@vassilevsky

This comment was marked as off-topic.

Copy link

@vassilevsky vassilevsky replied Apr 9, 2015

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

@RishYang

This comment was marked as off-topic.

Copy link

@RishYang RishYang replied Apr 10, 2015

+1

@ychang-brightcove

This comment was marked as off-topic.

Copy link

@ychang-brightcove ychang-brightcove replied Apr 10, 2015

+1 🍻

@shadow-bone-dark

This comment was marked as off-topic.

Copy link

@shadow-bone-dark shadow-bone-dark replied Apr 14, 2015

+1

@SergeyBugay

This comment was marked as off-topic.

Copy link

@SergeyBugay SergeyBugay replied Apr 14, 2015

+1

@realtux

This comment was marked as off-topic.

Copy link

@realtux realtux replied Apr 16, 2015

K, throwing my hat in the ring.

@Aorjoa

This comment was marked as off-topic.

Copy link

@Aorjoa Aorjoa replied Apr 20, 2015

+1024

@ozbillwang

This comment was marked as off-topic.

Copy link

@ozbillwang ozbillwang replied May 1, 2015

IT World was changing from here.

@fcladera

This comment was marked as off-topic.

Copy link

@fcladera fcladera replied May 11, 2015

Just amazing!

@sdaitzman

This comment was marked as off-topic.

Copy link

@sdaitzman sdaitzman replied Jun 3, 2015

yay

@Stargator

This comment was marked as off-topic.

Copy link

@Stargator Stargator replied Jul 21, 2015

👏

@vijairaj

This comment was marked as off-topic.

Copy link

@vijairaj vijairaj replied 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.

@horrorho

This comment was marked as off-topic.

Copy link

@horrorho horrorho replied Aug 12, 2015

+1

@heger31

This comment was marked as off-topic.

Copy link

@heger31 heger31 replied Aug 12, 2015

H

@voku

This comment was marked as off-topic.

Copy link

@voku voku replied Aug 21, 2015

git init --template=❤️

@yaszim23

This comment was marked as off-topic.

Copy link

@yaszim23 yaszim23 replied Aug 25, 2015

@Wingie

This comment was marked as off-topic.

Copy link

@Wingie Wingie replied Sep 9, 2015

e83c516 the sha that began it all...

@donhui

This comment was marked as off-topic.

Copy link

@donhui donhui replied Oct 9, 2015

mark

@wtser

This comment was marked as off-topic.

Copy link

@wtser wtser replied Oct 28, 2015

厉害

@hoangddt

This comment was marked as off-topic.

Copy link

@hoangddt hoangddt replied Nov 28, 2015

Hello first git commit

@gregstula

This comment was marked as off-topic.

Copy link

@gregstula gregstula replied Jan 14, 2016

😍

@Ephemera

This comment was marked as off-topic.

Copy link
Contributor

@Ephemera Ephemera replied Jan 14, 2016

Thanks

@Git008

This comment was marked as off-topic.

Copy link

@Git008 Git008 replied Jan 21, 2016

过来看看。

@ninneko

This comment was marked as off-topic.

Copy link

@ninneko ninneko replied Jan 28, 2016

Thanks

@edpenano

This comment was marked as off-topic.

Copy link

@edpenano edpenano replied Feb 15, 2016

YAASSS!

@JefMari

This comment was marked as off-topic.

Copy link

@JefMari JefMari replied Feb 16, 2016

The Readme is amazing! 😮

@NuLL3rr0r

This comment was marked as off-topic.

Copy link

@NuLL3rr0r NuLL3rr0r replied 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.

@sulphur

This comment was marked as off-topic.

Copy link

@sulphur sulphur replied Jun 30, 2016

👍

@Overtonesinger

This comment was marked as off-topic.

Copy link

@Overtonesinger Overtonesinger replied Jun 30, 2016

Wow! Epic indeed!

@bugaevc

This comment was marked as off-topic.

Copy link

@bugaevc bugaevc replied Jul 16, 2016

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

@decentral1se

This comment was marked as off-topic.

Copy link

@decentral1se decentral1se replied Jul 21, 2016

Max stoke.

@James328

This comment was marked as off-topic.

Copy link

@James328 James328 replied Jul 27, 2016

+1

@jiangpengnju

This comment was marked as off-topic.

Copy link

@jiangpengnju jiangpengnju replied Jul 27, 2016

Another masterpiece!

@ruoli

This comment was marked as off-topic.

Copy link

@ruoli ruoli replied Aug 9, 2016

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

@nickfrostatx

This comment was marked as off-topic.

Copy link

@nickfrostatx nickfrostatx replied Aug 14, 2016

🍻

@archit47

This comment was marked as off-topic.

Copy link

@archit47 archit47 replied Aug 22, 2016

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

@linsoong

This comment was marked as off-topic.

Copy link

@linsoong linsoong replied Sep 6, 2016

Mark

@mokoaki

This comment was marked as off-topic.

Copy link

@mokoaki mokoaki replied Sep 6, 2016

Rilakkuma

@kenta-s

This comment was marked as off-topic.

Copy link

@kenta-s kenta-s replied Sep 6, 2016

🎉 🎉 🎉

@mikejbrown

This comment was marked as off-topic.

Copy link

@mikejbrown mikejbrown replied Sep 7, 2016

😮 👏 🎉

@nifengcn

This comment was marked as off-topic.

Copy link

@nifengcn nifengcn replied Sep 12, 2016

mark is a must

@xiocode

This comment was marked as off-topic.

Copy link

@xiocode xiocode replied Sep 19, 2016

git init

@hoanghuynh

This comment was marked as off-topic.

Copy link

@hoanghuynh hoanghuynh replied Dec 23, 2016

mind = blown

@pedrofracassi

This comment was marked as off-topic.

Copy link

@pedrofracassi pedrofracassi replied Jan 18, 2017

So it all started here, eh?

@SeanHub

This comment was marked as off-topic.

Copy link

@SeanHub SeanHub replied Mar 24, 2017

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

@IsaacVazquez

This comment was marked as off-topic.

Copy link

@IsaacVazquez IsaacVazquez replied Mar 28, 2017

I read everything.

@kevinzurek

This comment was marked as off-topic.

Copy link

@kevinzurek kevinzurek replied Apr 4, 2017

Great work, Linus

@abarrak

This comment was marked as off-topic.

Copy link

@abarrak abarrak replied Apr 12, 2017

First commit in Git history ..

@gagustavo

This comment was marked as off-topic.

Copy link

@gagustavo gagustavo replied Apr 18, 2017

Acertô, mizerávi!

@captainpete

This comment was marked as off-topic.

Copy link

@captainpete captainpete replied May 1, 2017

Nice!

@xiaxiaoyu1988

This comment was marked as off-topic.

Copy link

@xiaxiaoyu1988 xiaxiaoyu1988 replied Jun 27, 2017

git init

@BasixKOR

This comment was marked as off-topic.

Copy link

@BasixKOR BasixKOR replied Jul 4, 2017

Thank you so much 😃

@ahrinosry

This comment was marked as off-topic.

Copy link

@ahrinosry ahrinosry replied Jul 4, 2017

@yiminyuan

This comment was marked as outdated.

Copy link

@yiminyuan yiminyuan replied Oct 7, 2017

git init

@xv

This comment was marked as off-topic.

Copy link

@xv xv replied Nov 14, 2017

presses F to pay respects

@adelarsq

This comment was marked as off-topic.

Copy link

@adelarsq adelarsq replied Nov 23, 2017

thank you Linus!

@IsaacVazquez

This comment was marked as off-topic.

Copy link

@IsaacVazquez IsaacVazquez replied Nov 29, 2017

F

@cosmojg

This comment was marked as off-topic.

Copy link

@cosmojg cosmojg replied Jan 12, 2018

THE FIRST FIRST COMMIT.

@pakls

This comment was marked as off-topic.

Copy link

@pakls pakls replied Jan 27, 2018

Was here!

@SyedAman

This comment was marked as off-topic.

Copy link

@SyedAman SyedAman replied Mar 31, 2018

please review pull request

@x4m3

This comment was marked as off-topic.

Copy link

@x4m3 x4m3 replied Apr 22, 2018

wassup

@mrvicadai

This comment was marked as off-topic.

Copy link

@mrvicadai mrvicadai replied Apr 26, 2018

+1

@huangzonghao

This comment was marked as off-topic.

Copy link

@huangzonghao huangzonghao replied May 25, 2018

git init commit

Thank you Linus!

Great to witness the history!

@ForYaSee

This comment was marked as off-topic.

Copy link

@ForYaSee ForYaSee replied Jul 19, 2018

Hello World!

@masonkoh

This comment was marked as off-topic.

Copy link

@masonkoh masonkoh replied Jul 24, 2018

Hello, World! from 2018

@wavezhang

This comment was marked as off-topic.

Copy link

@wavezhang wavezhang replied Jul 30, 2018

@wavezhang 到此一游

@pierre42100

This comment was marked as off-topic.

Copy link

@pierre42100 pierre42100 replied Sep 7, 2018

The first time git commit something, it has to be itself...

@theodesp

This comment was marked as off-topic.

Copy link

@theodesp theodesp replied Nov 21, 2018

Amazing. Respect!

@MatthewRalston

This comment was marked as off-topic.

Copy link

@MatthewRalston MatthewRalston replied Dec 2, 2018

You the real mvp Linus.

@outfrost

This comment was marked as off-topic.

Copy link

@outfrost outfrost replied Dec 3, 2018

Truly a landmark, this is.

@thinkinnight

This comment was marked as off-topic.

Copy link

@thinkinnight thinkinnight replied Jan 17, 2019

the beginning code of git, a remarkable thing.

@nevinm

This comment was marked as off-topic.

Copy link

@nevinm nevinm replied Feb 24, 2019

Marking down my place in history ❣️

@bhlong

This comment was marked as off-topic.

Copy link

@bhlong bhlong replied Feb 24, 2019

Pretty good code overall, lots of magic numbers tho

@parzibyte

This comment was marked as off-topic.

Copy link

@parzibyte parzibyte replied Feb 25, 2019

+1

@isipisi281

This comment was marked as off-topic.

Copy link

@isipisi281 isipisi281 replied Apr 4, 2019

+1

@bingzheyuan

This comment was marked as off-topic.

Copy link

@bingzheyuan bingzheyuan replied Apr 23, 2019

到此一游!

@daemon369

This comment was marked as off-topic.

Copy link

@daemon369 daemon369 replied May 26, 2019

Remarkable

@kfrncs

This comment was marked as off-topic.

Copy link

@kfrncs kfrncs replied Jun 4, 2019

hey thx for this whole thing linus, it's been really helpful

@adamc295

This comment was marked as off-topic.

Copy link

@adamc295 adamc295 replied Jul 10, 2019

the hell why was git so small in the beginning

@xahon

This comment was marked as off-topic.

Copy link

@xahon xahon replied Sep 27, 2019

I just compared count of files in that commit and in current master. Awesome

@psk7142

This comment was marked as off-topic.

Copy link

@psk7142 psk7142 replied Mar 11, 2020

The information manager from hell.

@jakesyl

This comment was marked as off-topic.

Copy link

@jakesyl jakesyl replied Mar 11, 2020

yep

@EnderDev

This comment was marked as off-topic.

Copy link

@EnderDev EnderDev replied Apr 13, 2020

So this is where it all started.

@nhk9680

This comment was marked as off-topic.

Copy link

@nhk9680 nhk9680 replied Apr 19, 2020

Hello, world!

@azabraao

This comment was marked as off-topic.

Copy link

@azabraao azabraao replied Apr 27, 2020

Why C and not C++?

Please sign in to comment.
You can’t perform that action at this time.