Ê×ÏÈ£¬ÕâÆª²»ÊÇÕæÕýÒâÒåÉϵķÒ룬ËùÒÔ´ó¼ÒÔÚ¿´µÄʱºò²»ÒªÕÒ¶ÔÓ¦µÄÓ¢ÎÄÎÄÕ¶ÔÓ¦×Å¿´¡£ÕâÆªÎÄÕÂÖ®ËùÒÔ¹éÀàΪ·Ò룬ÊÇÒòΪ×ʼÓÐһƪӢÎÄÎÄÕÂÈÃÎÒ¶ÔgitÄÚ²¿»úÖÆÓÐÁËÇå³þµÄÈÏʶ£¬Ëü¿ÉÒÔ˵ÊÇÎÒgitµÄÆôÃÉÀÏʦ°É¡£È»ºóºÜ¾Ã¹ýÈ¥ºó£¬×Ô¼ºÒ²ÓÐÁ˺ܶàµÄgitÏîĿʵ¼ù£¬¾õµÃÓбØÒª´Ó×Ô¼ºµÄÀí½â½Ç¶È£¨Î¢ÃüÁîºÍ³£ÓÃÃüÁî¶ÔÓ¦·ÖÎö£©À´ÕûÀíÏÂ×Ô¼ºµÄÀí½â£¬ÓÚÊÇÓÐÁËÕâÆª²©ÎÄ¡£
gitÊÇÒ»ÖÖ¹ÜÀíÊý¾ÝµÄ¹¤¾ß£¬Ò»ÖÖÖ§³Ö¿ìËÙË÷Òý²éÕÒÊý¾Ý²¢¹ÜÀíÊý¾Ý±ä»¯µÄ¹¤¾ß¡£ËüΪÊý¾ÝÌí¼ÓÒ»¸öÍ··âװΪ¶ÔÏó¿é(±¾ÎijÆÎªgit¶ÔÏó)È»ºó±£´æÎªÎļþ£¬²¢¸ù¾ÝÊý¾ÝÉú³ÉÒ»¸öSHAÖµ,È»ºóÒÔ¸ÃÖµ×÷ΪÎļþÃû³ÆµÄÒÀ¾Ý£¬SHAÖµµÄǰ2λÊÇÎļþµÄĿ¼Ãû×Ö£¬ºóÃæµÄֵΪÎļþÃû£¬ÕâÑù¾ÍÄܺÜÈÝÒ׸ù¾ÝSHA²éÕÒµ½Êý¾Ý¡£Í¬Ê±ÓÉÓÚSHAµÄΨһÐÔ£¬Ò»µ©ÎļþÄÚÈݸı䣬Æä¶ÔÓ¦µÄSHA¾Í»á±ä»¯£¬Òò¶øºÜÊʺÏÎļþ±ä»¯¹ÜÀí¡£git×ܹ²ÓÐËÄÀà¶ÔÏó£º
blob¶ÔÏó£º
¸Ã¶ÔÏóÊÇÕæÕýµÄÊý¾Ý¶ÔÏó£¬ËüµÄÄÚÈÝÊǸ÷ÖÖÎļþµÄÊý¾ÝÄÚÈÝ£¬±ÈÈçgitÏîÄ¿ÀïµÄÎļþÊý¾Ý¡£ÐèҪעÒâµÄÊÇblob¶ÔÏóÖ»ÊDZ£´æÊý¾Ý£¬²¢²»±£´æÊý¾ÝµÄ¶îÍâÐÅÏ¢£¬±ÈÈçÎļþÃû£¬Îļþ´óС¡£
tree¶ÔÏó£º
¸Ã¶ÔÏóÊÇÒ»ÖÖ¹ÜÀí¶ÔÏó£¬ËüÊÇÓÃÀ´¹ÜÀí¶ÔÏóµÄ¶ÔÏ󣬯äÄÚÈÝÖ¸³öÁ˸Ãtree°üº¬ÄÄЩ×Ó¶ÔÏó£¬tree¿ÉÒԵݹéµÄ£¬Ò²¾Í˵tree¿ÉÒÔ°üº¬ÆäËûµÄtree¡£Tree¶ÔÏó¾ÍÏñlinuxÎļþϵͳÀïµÄĿ¼һÑù£¬Ä¿Â¼±¾ÉíÊÇÒ»ÖÖÎļþ£¬Ö»²»¹ýĿ¼ÎļþµÄÄÚÈÝÊÇĿ¼ÏµÄÎļþÐÅÏ¢,Ŀ¼Ï»¹ÓÐ×ÓĿ¼¡£
commit¶ÔÏó£º
commit¶ÔÏóÊÇÕæÕýÖ±½Ó³ÊÏÖ¸øgitʹÓÃÕߵģ¬Ëü¾ÍÊÇÎÒÃǾ³£Ëµµ½µÄgitÏîÄ¿ÀúÊ·¼Ç¼£¬ÎÒÃǾ³£ÓõÄgit
show xxx,git log xxx,git check xxxµÈÃüÁîºóÃæ½ÓµÄÊý×Ö¾ÍÊÇcommit¶ÔÏóµÄÃû×Ö£¬Ò²¾ÍÊÇcommit¶ÔÏó¶ÔÓ¦µÄSHAÖµ¡£commit¶ÔÏó±ØÐëÓÐÒ»¸ötree¶ÔÏó£¬Ëü±¾Éí²¢²»ºÍÊý¾ÝÓÐÖ±½ÓÁªÏµ£¬git¹¤¾ßͨ¹ýËüµÄtree¶ÔÏóÕÒµ½¸Ãcommit¶ÔÓ¦µÄÊý¾Ý£¬Í¬Ê±ºÍtree¶ÔÏóÒ»Ñù£¬Ëü¿ÉÒÔÓÐ×Ô¼ºµÄ¸¸Ç×commit£¬ÕâÑù¾ÍÐγÉÁËgitÀúÊ·µ¥ÏòÁ´±í¡£
tag ¶ÔÏó£º
tag¶ÔÏóÆäʵ¾ÍÊÇÉÏÃæÈýÖÖ¶ÔÏóµÄÒ»ÖÖ±ðÃû±í´ï·½Ê½¡£´ÓÉÏÃæµÄÃèÊöÎÒÃÇ¿ÉÖª£¬git¶ÔÏóµÄÃû×ÖÊÇSHAÖµ£¬¾ÍÊÇÒ»¶ÑûÓйæÂɵij¤´®µÄ×Ö·û£¬Óû§×ÔÈ»²»ÈÝÒ×¼ÇÒ²¼Ç²»×¡¡£Òò´ËgitÌá³öÁËtag¶ÔÏóÕâÑùÒ»ÖÖ¶ÔÏó£¬ËüÔÊÐíÓû§ÒÔËûÃÇÈÝÒ×ʶ±ðµÄÃû×ÖÀ´±êʾÉÏÃæµÄÈÎÒ»¶ÔÏó¡£
ÓÐÁËÕâЩ»ù±¾¸ÅÄÎÒÃÇͨ¹ýʹÓÃgit ΢ÃüÁîÀ´ÏêϸµÄÈÏʶÏÂÕâЩ¶ÔÏóµÄÐÎʽ£¬Éú³É¼°Ê¹Óá£git΢ÃüÁîÊÇÏà¶Ô
ÎÒÃÇÆ½Ê±ÓõÄgit commit, git adddµÈÃüÁî¶øÑԵģ¬Î¢ÃüÁî×öµÄÊÂÇéÉÙ£¬¿ÉÒÔºÜÇåÎú¿´µ½Ã¿Ò»¸ö²½Öè¡£
´´½¨ÐµÄgitÏîÄ¿
ÎÒÃÇÖ´ÐÐgit initºó£¬ÏµÍ³»á×Ô¶¯°ïÎÒÃÇ´´½¨Ò»¸öÒþ²ØÄ¿Â¼.git£¬¾ßÌåÄÚÈÝÈçÏ£º
itleaks@Itleaks:/tmp/test$ git init . Initialized empty Git repository in /tmp/test/.git/ itleaks@Itleaks:/tmp/test$ tree . -al . ©¸©¤©¤ .git ©À©¤©¤ branches ©À©¤©¤ config ©À©¤©¤ description ©À©¤©¤ HEAD ©À©¤©¤ hooks ©¦ ©À©¤©¤ applypatch-msg.sample ©¦ ©À©¤©¤ commit-msg.sample ©¦ ©À©¤©¤ post-update.sample ©¦ ©À©¤©¤ pre-applypatch.sample ©¦ ©À©¤©¤ pre-commit.sample ©¦ ©À©¤©¤ prepare-commit-msg.sample ©¦ ©À©¤©¤ pre-push.sample ©¦ ©À©¤©¤ pre-rebase.sample ©¦ ©¸©¤©¤ update.sample ©À©¤©¤ info ©¦ ©¸©¤©¤ exclude ©À©¤©¤ objects ©¦ ©À©¤©¤ info ©¦ ©¸©¤©¤ pack ©¸©¤©¤ refs ©À©¤©¤ heads ©¸©¤©¤ tags
|
ÉÏÃæµÄ.git/objectsÊÇ×îÖØÒªµÄĿ¼£¬Ëü¾ÍÊÇÓÃÀ´±£´æÉÏÃæÌáµ½µÄËÄÖÖ¶ÔÏóÎļþµÄĿ¼¡£
Éú³ÉBlob¶ÔÏó
gitÉú³Éblob¶ÔÏóÊÇʹÓÃgithash-objectÀ´Éú³É£¬¾ßÌå²Ù×÷ÈçÏ£º
itleaks@Itleaks:/tmp/test$ echo "itleaks test">test.txt itleaks@Itleaks:/tmp/test$ git hash-object -w test.txt be976caf33466b3a9fbc04260139a992e5664b9c itleaks@Itleaks:/tmp/test$ tree . -al . ©À©¤©¤ .git ©¦ ©À©¤©¤ branches ©¦ ©À©¤©¤ config ©¦ ©À©¤©¤ description ©¦ ©À©¤©¤ HEAD ©¦ ©À©¤©¤ hooks ©¦ ©¦ ©À©¤©¤ applypatch-msg.sample ©¦ ©¦ ©À©¤©¤ commit-msg.sample ©¦ ©¦ ©À©¤©¤ post-update.sample ©¦ ©¦ ©À©¤©¤ pre-applypatch.sample ©¦ ©¦ ©À©¤©¤ pre-commit.sample ©¦ ©¦ ©À©¤©¤ prepare-commit-msg.sample ©¦ ©¦ ©À©¤©¤ pre-push.sample ©¦ ©¦ ©À©¤©¤ pre-rebase.sample ©¦ ©¦ ©¸©¤©¤ update.sample ©¦ ©À©¤©¤ info ©¦ ©¦ ©¸©¤©¤ exclude ©¦ ©À©¤©¤ objects ©¦ ©¦ ©À©¤©¤ be ©¦ ©¦ ©¦ ©¸©¤©¤ 976caf33466b3a9fbc04260139a992e5664b9c ©¦ ©¦ ©À©¤©¤ info ©¦ ©¦ ©¸©¤©¤ pack ©¦ ©¸©¤©¤ refs ©¦ ©À©¤©¤ heads ©¦ ©¸©¤©¤ tags ©¸©¤©¤ test.txt itleaks@Itleaks:/tmp/test$ find .git/objects/ -type f .git/objects/be/976caf33466b3a9fbc04260139a992e5664b9c
|
´ÓÉÏÃæ¿ÉÒÔ¿´³ö£¬µ±ÎÒÃÇʹÓÃhash-object¨CwÉú³ÉÒ»¸ö¶ÔÏóºó,git»áÔÚ.git/objectsÏÂÉúÒ»¸öÎļþbe/
976caf33466b3a9fbc04260139a992e5664b9c,Õâ¸ö¾ÍÊÇSHAÖµ¡£ÓÐÁËÕâ¸ö¶ÔÏóµÄSHAÖµºó£¬ÎÒÃÇ¿ÉÒÔͨ¹ýgitcat-fileÃüÁîÀ´²é¿´¸Ã¶ÔÏóµÄÔʼÊý¾Ý¡£
//²é¿´¶ÔÏóÀàÐÍ itleaks@Itleaks:/tmp/test$ git cat-file -t be976caf33466b3a9fbc04260139a992e5664b9c blob //²é¿´¶ÔÏóÄÚÈÝ itleaks@Itleaks:/tmp/test$ git cat-file -p be976caf33466b3a9fbc04260139a992e5664b9c itleaks test
|
´Ëʱ¶ÔÓ¦µÄÊý¾Ý¶ÔÏóͼÈçÏ£º

µ½ÕâÀÄã¿ÉÄÜ»áÎÊ£¬test.txtÕâ¸öÃû×ÖµÄÐÅÏ¢±£´æÔÚÄÄÄØ£¿ÆäÊµÇ°ÃæÒѾÌáµ½ÁË£¬blob¶ÔÏóÖ»´æÊý¾Ý(ÉÏÃæµÄ×Ö·û´®¡±
itleaks test¡±)£¬²¢²»±£´æÆäËû¶îÍâÐÅÏ¢¡£ÄÇÕâ¸öÃû×Öʲôʱºò±£´æµÄÄØ£¿±£´æÕ¦ÄÄÀïÄØ£¿Õâ¸ö¾ÍÊÇÓÉÏÂÃæÒªÌáµ½µÄtree
¶ÔÏóÀ´Î¬»¤µÄ¡£
Éú³ÉTree¶ÔÏó
ÉÏÃæµÄ²Ù×÷¹ýºó£¬ÏµÍ³ÒѾ´æÔÚÒ»¸öblob¶ÔÏóÁË¡£ÎÒÃÇ¿ÉÒÔ½«¸Ã¶ÔÏóÌí¼Óµ½Ò»¸ötree¶ÔÏóÀï,ÔÚÌí¼Óµ½tree¶ÔÏóǰ£¬±ØÐ뽫¸Ãblob¶ÔÏó·â×°³ÉÒ»¸ötree
¶ÔÏóµÄitemÊý¾Ý¿é, ²¢½«¸ÃitemÊý¾Ý¿éдµ½cacheÀï¡£itemÊý¾Ý¿éµÄ¸ñʽÊÇblob¶ÔÏóSHAÖµ+Êý¾ÝÎļþÃû×Ö(test.txt)+Îļþģʽ(100644)¡£ÕâÒ»¸ö¹ý³ÌÓÉgit
update-indexÍê³É
itleaks@Itleaks:/tmp/test$ git update-index --add --cacheinfo 100644 \ > be976caf33466b3a9fbc04260139a992e5664b9c test.txt //µ½´Ë£¬ÖÕÓÚ³öÏÖÁËÇ°ÃæÌáµ½µÄtest.txt£¬ÕâÀï²ÅÊÇÎÒÃÇÔÚgitÀï¿´µ½µÄÎļþÃû //ÆäʵÕâÀïµÄÎļþÃûÒ²¿ÉÒÔÌîÆäËûÃû×Ö£¬gitϵͳ²¢²»ÈÏʶ²Ù×÷ϵͳÖеÄÎļþÃû£¬Ö» //ÖªµÀÕâÀïµÄÎļþÃû£¬È»ºóÆäËûÓû§Í¨¹ýgit clone ¸ÃgitÏîĿʱ£¬¸Ãblob¶ÔÏó¶ÔÓ¦µÄÊý¾Ý //Îļþ»áÃüÃûΪÕâÀïÖ¸¶¨µÄÃû³Æ itleaks@Itleaks:/tmp/test$ git ls-files test.txt //ls-files¿ÉÒԲ鿴cacheÀïµÄËùÓÐblob¶ÔÏóÃèÊö itleaks@Itleaks:/tmp/test$ find .git/objects/ -type f .git/objects/be/976caf33466b3a9fbc04260139a992e5664b9c //update-indexÖ´Ðк󣬲¢²»»áÔö¼Óobject
|
Èç¹ûÓжà¸öÊý¾Ý£¬¿ÉÒÔÖØ¸´Ö´ÐÐÉÏÃæµÄÃüÁ½«¶à¸öblob¶ÔÏóÌí¼Óµ½cacheÖС£È»ºóµ±Óû§Ö´ÐÐgit write-treeµÄʱºò£¬¾Í»áÉú³ÉÒ»¸ötree¶ÔÏ󣬲¢½«cacheÀïµÄËùÓÐblob¶ÔÏóµÄÃèÊöÊý¾ÝÌí¼Óµ½tree¶ÔÏóµÄÎļþÀ¾ßÌåÃüÁîÈçÏ£º
itleaks@Itleaks:/tmp/test$ git write-tree 941220dc97574b7dba7b22fdb21333c7227c9603 itleaks@Itleaks:/tmp/test$ find .git/objects/ -type f .git/objects/be/976caf33466b3a9fbc04260139a992e5664b9c .git/objects/94/1220dc97574b7dba7b22fdb21333c7227c9603 //ÐÂÔöÁËÒ»¸öobjectÎļþ itleaks@Itleaks:/tmp/test$ git cat-file -t 941220dc97574b7dba7b22fdb21333c7227c9603 tree itleaks@Itleaks:/tmp/test$ git cat-file -p 941220dc97574b7dba7b22fdb21333c7227c9603 100644 blob be976caf33466b3a9fbc04260139a992e5664b9c test.txt //tree¶ÔÏóµÄÄÚÈÝÊÇÃèÊöÆä¹ÜÀíµÄblob¶ÔÏóµÄÖ¸ÏòÐÅÏ¢
|
´Ëʱ¶ÔÓ¦µÄÊý¾Ý¶ÔÏóͼÈçÏ£º

µ½´ËΪֹ£¬ËùÓеĶÔÏó¶¼ÊÇÏà¶Ôµ×²ãµÄÊý¾Ý¶ÔÏó£¬gitÓû§Ò»°ãÊDz»»áÖ±½ÓʹÓõġ£È»ºó¾Í¸Ãcommit¶ÔÏóÂ¶ÃæÁË¡£
Éú³Écommit¶ÔÏó
Æäʵcommit¶ÔÏó£¬Äã¿ÉÒÔÀí½â³Étree¶ÔÏóµÄÀ©Õ¹£¬ËüÊÇÓÃÀ´ÃèÊöÒ»¸ötree¶ÔÏóµÄ¶îÍâÐÅÏ¢µÄ¡£ËüÏ൱ÓÚÊÇtree¶ÔÏóΪÓû§Ô¤Áô³öÀ´µÄ½Ó¿Ú£¬Óû§Í¨¹ýÉú³ÉÒ»¸öcommit¶ÔÏ󣬾ͿÉÒÔ¸øÒ»¸ötree¶ÔÏó´ò±êÇ©£¬±ÈÈçÓû§ÐÕÃû£¬ÃèÊö£¬Ê±¼ä¡£¾ßÌåÉú³É¹ý³ÌÈçÏ£º
itleaks@Itleaks:/tmp/test$ echo 'initial version' | git commit-tree 941220dc97574b7dba f7bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 //ÉÏÃæµÄ941220dc97574b7dba¾ÍÊÇtree¶ÔÏóµÄSHAÖµ itleaks@Itleaks:/tmp/test$ find .git/objects/ -type f .git/objects/f7/bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 .git/objects/be/976caf33466b3a9fbc04260139a992e5664b9c .git/objects/94/1220dc97574b7dba7b22fdb21333c7227c9603 //commitÒ²ÊÇÒ»¸ö¶ÔÏó itleaks@Itleaks:/tmp/test$ git cat-file -t f7bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 commit itleaks@Itleaks:/tmp/test$ git cat-file -p f7bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 tree 941220dc97574b7dba7b22fdb21333c7227c9603 author itleaks <itleaks@126.com> 1403052327 +0800 committer itleaks <itleaks@126.com> 1403052327 +0800 initial version //commit¶ÔÏóµÄÄÚÈÝÖ¸³öÁËËüÃèÊöµÄÊÇÄĸötree
|
´Ëʱ¶ÔÓ¦µÄÊý¾Ý¶ÔÏóͼÈçÏ£º

CommitÉú³Éºó£¬Óû§¾ÍÊìϤÁË£¬Óû§Í¨¹ý³£ÓõÄgit showÃüÁî¾Í¿ÉÒÔºÜÖ±½ÓµÄ²é¿´Õâ¸öcommit
itleaks@Itleaks:/tmp/test$ git show f7bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 commit f7bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 Author: itleaks <itleaks@126.com> Date: Wed Jun 18 08:45:27 2014 +0800 initial version diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..be976ca --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ +itleaks test |
ÄÇÖ´ÐÐgit logÄØ£¿
itleaks@Itleaks:/tmp/test$ git log fatal: bad default revision 'HEAD' itleaks@Itleaks:/tmp/test$ cat .git/HEAD ref: refs/heads/master itleaks@Itleaks:/tmp/test $ tree .git/refs/heads/ .git/refs/heads/ 0 directories, 0 files
|
ϵͳ»áÌáʾbad HEAD,ÕâÊÇÒòΪrefs/heads/masteÎļþ²»´æÔÚ¡£Õâ¸ö¾ÍÊÇÏÂÃæÎÒÒª½²µÄgit
referrence¶ÔÏó¡£
Ref¶ÔÏó
´ÓÃû×Ö¿ÉÒÔ¿´³öÀ´£¬Ëü¾ÍÊÇÒ»¸öÒýÓã¬Ëü¾ÍÊÇcommit¶ÔÏóµÄ±ðÃû£¬ËüÖ±½ÓÒÔ×Ö·û´®µÄÐÎʽ±£´æÒ»¸öcommit¶ÔÏóµÄÃû×Ö£¬ÕâÑùÓû§Ö±½Ó¸ù¾Ýref¶ÔÏóµÄÃû×־ͿÉÒÔÖ±½ÓÕÒµ½¶ÔÓ¦µÄcommit¶ÔÏ󣬶ø²»ÓüÇסһ³¤´®SHA×Ö·û´®¡£ÁíÍ⣬ÕâÀïµÄref¶ÔÏó¾ÍÊÇÎÒÃdz£ËµËµµ½git
branch£¬Ò»¸öbranch¶ÔÓ¦Ò»¸örefs/heads/xxÎļþ¡£
itleaks@Itleaks:/tmp/test$ echo "f7bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2" > .git/refs/heads/master itleaks@Itleaks:/tmp/test$ find .git/objects/ -type f .git/objects/f7/bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 .git/objects/be/976caf33466b3a9fbc04260139a992e5664b9c .git/objects/94/1220dc97574b7dba7b22fdb21333c7227c9603 //Éú³Éref²¢Ã»ÓÐÐÂÔöobject itleaks@Itleaks:/tmp/test$ find .git/refs/ -type f .git/refs/heads/master //Ö´ÐÐÉÏÃæµÄÃüÁîÉú³ÉÒ»¸ömaster ref¶ÔÏóºó£¬Óû§²»ÔÙÐèҪʹÓÃgit show SHAÖµ£¬¶øÊÇ //Ö±½ÓʹÓÃgit show name¾Í¿ÉÒԲ鿴commit¶ÔÏóµÄÏêϸÐÅÏ¢ itleaks@Itleaks:/tmp/test$ git show master commit f7bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 Author: itleaks <itleaks@126.com> Date: Wed Jun 18 08:45:27 2014 +0800 initial version diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..be976ca --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ +itleaks test
|
refs/heads/masterÉú³Éºó£¬Óû§ÖÕÓÚ¿ÉÒÔʹÓÃgitlog²é¿´ÁË
itleaks@Itleaks:/tmp/test$ git log commit f7bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 Author: itleaks <itleaks@126.com> Date: Wed Jun 18 08:45:27 2014 +0800 initial version
|
´Ëʱ¶ÔÓ¦µÄÊý¾Ý¶ÔÏóͼÈçÏ£º

΢git²Ù×÷¶ÔÓ¦µÄgit³£ÓÃÃüÁî
µ½´Ë£¬´ó¼Ò¹À¼ÆÒ²¿´ÀÛÁ˰ɣ¬µ«ÊÇÈç¹ûÎÒ¸æËßÄãÉÏÃæÕâô³¤µÄ²Ù×÷£¬Óû§Æäʵͨ¹ýÈçÏÂÁ½ÌõÃüÁî¿ÉÒÔʵÏÖÒ»ÑùµÄЧ¹û£¬Äã»á²»»á¾ªÑȰ¡!
git add test.txt git commit -sm ¡°initial version¡±
|
ÎÒÃÇÒ²À´¿´ÏÂÕâÁ½Ìõ²Ù×÷¶ÔÓ¦µÄ.gitÄÚÈݱ仯¹ý³Ì
itleaks@Itleaks:/tmp/test$ echo "itleaks test">test.txt itleaks@Itleaks :/tmp/test$ git add test.txt itleaks@Itleaks:/tmp/test$ find .git/objects/ -type f .git/objects/be/976caf33466b3a9fbc04260139a992e5664b9c itleaks@Itleaks:/tmp/test$ git cat-file -t be976caf33466b3a9fbc04260139a992e5664b9c blob itleaks@Itleaks:/tmp/test$ git ls-files test.txt
|
´ÓÉÏÃæ¿ÉÒÔ¿´³ö£¬git addÃüÁî»áΪÎÒÃÇ´´½¨blob¶ÔÏ󣬲¢ÇÒ×Ô¶¯½«¸Ãblob¶ÔÏóÌí¼Óµ½cacheÖС£¸ü²»¿É˼ÒéµÄÊÇ£¬Éú³ÉµÄ¶ÔÏóÃû×Öbe976caf33466b3a9fbc04260139a992e5664b9cºÍÉÏÃæµÄһģһÑù£¬ÎªÉ¶£¬ÕâÊÇÓÉSHAÇ©ÃûÉú³É»úÖÆÏà¹Ø---Ö»ÒªÊý¾ÝÒ»Ö£¬Æä²úÉúµÄSHAÒ»¶¨Ò»Ñù¡£
itleaks@Itleaks:/tmp/test$ git commit -sm "initial version" [master (root-commit) 12ca076] initial version 1 file changed, 1 insertion(+) create mode 100644 test.txt itleaks@Itleaks:/tmp/test$ find .git/objects/ -type f .git/objects/12/ca0768b1a7c1f5f8547617af78e13d7263aaba .git/objects/be/976caf33466b3a9fbc04260139a992e5664b9c .git/objects/94/1220dc97574b7dba7b22fdb21333c7227c9603 itleaks@Itleaks:/tmp/test$ git cat-file -p 12ca0768b1a7c1f5f8547617af78e13d7263aaba tree 941220dc97574b7dba7b22fdb21333c7227c9603 author itleaks <itleaks@126.com> 1403098727 +0800 committer itleaks <itleaks@126.com> 1403098727 +0800 initial version Signed-off-by: itleaks <itleaks@126.com> itleaks@Itleaks:/tmp/test$ git cat-file -p 941220dc97574b7dba7b22fdb21333c7227c9603 100644 blob be976caf33466b3a9fbc04260139a992e5664b9c test.txt
|
´ÓÉÏÃæ¿ÉÒÔ¿´³öcommitÕâÌõÃüÁîÉú³ÉÁËÁ½¸ö¶ÔÏó£ºtree¶ÔÏóºÍcommit¶ÔÏó.´ó¼Ò×¢Òâû£¬Ö»ÓÐcommit¶ÔÏóµÄSHAÖµºÍÎÒÃÇÉÏÃæ²»Ò»Ñù£¬ÁíÍâÁ½¸ö¶ÔÏóÊÇÒ»ÑùµÄ£¬ÎªÊ²Ã´£¿ÄÇÊÇÒòΪcommit¶ÔÏóµÄÄÚÈÝÖаüº¬Ê±¼ä£¬Á½´Îcommit¶ÔÏóÉú³ÉµÄʱ¼ä²»Ò»ÑùÒâζ×ÅÆäÄÚÈݾͲ»Ò»Ñù£¬½ø¶øÆäSHA×ÔÈ»²»Ò»Ñù¡£
commitÁ´ÐγÉ
ÉÏÃæµÄ²Ù×÷£¬Ö»Éú³ÉÒ»¸öblob¶ÔÏó, Ò»¸ötree¶ÔÏó£¬Ò»¸öcommit¶ÔÏ󣬻¹Ã»·¨¿´µ½commitÁ´µÄÐγɹý³Ì¡£Òò´Ë£¬ÎªÁËÉú³ÉÁ´£¬ÎÒÃÇ»¹ÐèÒªÉú³ÉÁíÍâÒ»¸öcommit¶ÔÏó¡£½Ó×ÅʵÑé¡£
ÐÂÔöÎļþ£¬²¢Öظ´ÉÏÃæµÄ²Ù×÷µÄ¡£
itleaks@Itleaks:/tmp/test$ echo "second file">2.txt itleaks@Itleaks:/tmp/test$ git hash-object -w 2.txt 1c59427adc4b205a270d8f810310394962e79a8b itleaks@Itleaks:/tmp/test$ find .git/objects/ -type f .git/objects/f7/bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 .git/objects/1c/59427adc4b205a270d8f810310394962e79a8b .git/objects/be/976caf33466b3a9fbc04260139a992e5664b9c .git/objects/94/1220dc97574b7dba7b22fdb21333c7227c9603 itleaks@Itleaks:/tmp/test$ git cat-file -t 1c59427adc4b205a270d8f810310394962e79a8b blob itleaks@Itleaks:/tmp/test$ git cat-file -p 1c59427adc4b205a270d8f810310394962e79a8b second file itleaks@Itleaks:/tmp/test$ git ls-files test.txt //ÔÀ´µÄcache»¹ÔÚ£¬Òò´ËÖ»ÐèÌí¼ÓеÄblob¶ÔÏóµ½cacheÖÐÈ¥ itleaks@Itleaks:/tmp/test$ git update-index --add 2.txt itleaks@Itleaks:/tmp/test$ git ls-files 2.txt test.txt itleaks@Itleaks:/tmp/test$ git write-tree 931fdc25cbc3e0afa6e34cf275693ade0daf2c73 itleaks@Itleaks:/tmp/test$ find .git/objects/ -type f .git/objects/f7/bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 .git/objects/1c/59427adc4b205a270d8f810310394962e79a8b .git/objects/93/1fdc25cbc3e0afa6e34cf275693ade0daf2c73 .git/objects/be/976caf33466b3a9fbc04260139a992e5664b9c .git/objects/94/1220dc97574b7dba7b22fdb21333c7227c9603 itleaks@Itleaks:/tmp/test$ git cat-file -t 931fdc25cbc3e0afa6e34cf275693ade0daf2c73 tree itleaks@Itleaks:/tmp/test$ git cat-file -p 931fdc25cbc3e0afa6e34cf275693ade0daf2c73 100644 blob 1c59427adc4b205a270d8f810310394962e79a8b 2.txt 100644 blob be976caf33466b3a9fbc04260139a992e5664b9c test.txt //ÕâÀï¿ÉÒÔ¿´³ö£¬Õâ¸öÐÂÔöµÄtree¶ÔÏóÖ¸ÏòÁËÁ½¸öblob¶ÔÏó
|
½ÓÏÂÀ´¾ÍÊÇcommitÁ´ÐγɵÄÖØµãÁË£¬ÔÚÉú³Écommit¶ÔÏóʱ£¬ÓÐÒ»¸ö-p²ÎÊý£¬Õâ¸ö²ÎÊýÓÃÀ´Ö¸Ê¾ÐÂÉú³ÉµÄcommit¶ÔÏóµÄ¸¸Ç×commitµÄ¡£ÏÂÃæ¾ÍÀ´¿´¿´´øÕâ¸ö²ÎÊýºÍû´øÕâ¸ö²ÎÊýµÄÉú³ÉµÄcommit¶ÔÏóµÄ²î±ð
²»´ø-p²ÎÊýʱ
itleaks@Itleaks:/tmp/test$ echo "second commit"|git commit-tree 931fdc25cbc 2969683f04d3a32af0d6abf97f170190163b72e3 itleaks@Itleaks:/tmp/ test $ git cat-file -p 2969683f0 tree 931fdc25cbc3e0afa6e34cf275693ade0daf2c73 author itleaks <itleaks@126.com> 1403055500 +0800 committer itleaks <itleaks@126.com> 1403055500 +0800 second commit itleaks@Itleaks:/tmp/test$ git show 2969683f04d3a commit 2969683f04d3a32af0d6abf97f170190163b72e3 Author: itleaks <itleaks@126.com> Date: Wed Jun 18 09:38:20 2014 +0800 second commit diff --git a/2.txt b/2.txt new file mode 100644 index 0000000..1c59427 --- /dev/null +++ b/2.txt @@ -0,0 +1 @@ +second file diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..be976ca --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ +itleaks test itleaks@Itleaks:/tmp/test$ git log 2969683f04d3a commit 2969683f04d3a32af0d6abf97f170190163b72e3 Author: itleaks <itleaks@126.com> Date: Wed Jun 18 09:38:20 2014 +0800 second commit //û´ø-p²ÎÊýʱ£¬Õâ¸öеÄcommitÏ൱ÓÚÕâ´ÎcommitÒ»ÏÂ×ÓÔö¼ÓÁËÁ½¸öÎļþ itleaks@Itleaks:/tmp/test$ git log 2969683f04d3a commit 2969683f04d3a32af0d6abf97f170190163b72e3 Author: itleaks <itleaks@126.com> Date: Wed Jun 18 09:38:20 2014 +0800 second commit //ÕâÀïÖ»ÓÐÒ»Ìõcommit¼Ç¼
|
´ø-p²ÎÊýʱ
itleaks@Itleaks:/tmp/test$ echo "second commit2"|git commit-tree 931fdc25cbc -p f7bde89df6b5d8ea3f c29d97b2a89c18bdc68f0812749c76fdadd477cf itleaks@Itleaks:/tmp/test$ git cat-file -p c29d97b2a89c1 tree 931fdc25cbc3e0afa6e34cf275693ade0daf2c73 parent f7bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 author itleaks <itleaks@126.com> 1403055858 +0800 committer itleaks <itleaks@126.com> 1403055858 +0800 second commit2 itleaks@Itleaks:/tmp/test$ git show c29d97 commit c29d97b2a89c18bdc68f0812749c76fdadd477cf Author: itleaks <itleaks@126.com> Date: Wed Jun 18 09:44:18 2014 +0800 second commit2 diff --git a/2.txt b/2.txt new file mode 100644 index 0000000..1c59427 --- /dev/null +++ b/2.txt @@ -0,0 +1 @@ +second file //´øÁË-p²ÎÊýµÄcommit£¬ÏÔʾ³öÀ´µÄÐÞ¸ÄÖ»ÊÇÔö¼ÓÁË2.txtÎļþ itleaks@Itleaks:/tmp/test$ git log c29d97 commit c29d97b2a89c18bdc68f0812749c76fdadd477cf Author: itleaks <itleaks@126.com> Date: Wed Jun 18 09:44:18 2014 +0800 second commit2 commit f7bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 Author: itleaks <itleaks@126.com> Date: Wed Jun 18 08:45:27 2014 +0800 initial version //ÕâÀ¿ÉÒÔ¿´µ½¡±second commit2"Ç°ÃæµÄcommitÊÇ¡± initial version¡±£¬Õâ¾ÍÊÇcommitÁ´
|
´Ë´Î²Ù×÷ºó¶ÔÏóͼÈçÏ£º

Branch¸üÐÂ
ÉÏÃæÐÂÔöÁËÁ½¸öcommit¶ÔÏóºó£¬ÏµÍ³²¢²»»á×Ô¶¯¸üÐÂbranchµÄÐÅÏ¢£¬ÐèÒªÓû§Ö÷¶¯¸üУ¬Í¨¹ýupdate-ref¼°Œ¡ÊµÏÖ£¬¾ßÌåʵÏÖÈçÏ£º
itleaks@Itleaks:/tmp/test$ git show master commit f7bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 Author: itleaks <itleaks@126.com> Date: Wed Jun 18 08:45:27 2014 +0800 initial version diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..be976ca --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ +itleaks test //brach master»¹Ã»ÓиüУ¬½ÓÏÂÀ´¸üРitleaks@Itleaks:/tmp/test$ git update-ref refs/heads/master c29d97 itleaks@Itleaks:/tmp/test$ git log commit c29d97b2a89c18bdc68f0812749c76fdadd477cf Author: itleaks <itleaks@126.com> Date: Wed Jun 18 09:44:18 2014 +0800 second commit2 commit f7bde89df6b5d8ea3fa3ccae0e3d53e8a5aa25d2 Author: itleaks <itleaks@126.com> Date: Wed Jun 18 08:45:27 2014 +0800 initial version //¿´µ½ÎÒÃÇÉÏÃæÌí¼ÓµÄ¡± second commit2¡± commitÁË
|
´Ë´Î²Ù×÷ºó¶ÔÏóͼÈçÏ£º
|