ǰÑÔ
×÷Ϊһ¸ö¿ª·¢Õߣ¬Èç¹ûÏÖÔÚ»¹²»ÖªµÀgit»òÕß»¹²»»áʹÓÃgit£¬ÄÇôÄãÓ¦¸ÃºÃºÃµÄ·´Ê¡¡£×Ô¼ºÈ¥ºÃºÃ¿´Ò»±éµÄÈëÃŽéÉܰɡ£½ñÌìÖ»ÊǶÔ×Ô¼ºÔÚÈÕ³£ÖÐʹÓÃgitµÄһЩ³£ÓÃÃüÁîµÄ½éÉÜÓë×Ô¼ºÈÏΪ²»´íÇÒÄÜÌá¸ßÎÒÃǰ칫ЧÂʵÄÃüÁî¡£ÄÚÈÝ¿ÉÄÜ»áÓеãÔÓÂÒ£¬µ«¾ø¶Ô¶¼ÊǾµäµÄÃüÁÔڴ˼Çϱʼǣ¬Ò²Ï£ÍûÄܰïÖúÀ´ÉÍÁ³¹Ø¹ËµÄÄãÃÇ¡£
ÇøÓò
ÔÚÕâ֮ǰ£¬À´½éÉÜÒ»ÏÂgitµÄÈý¸öÇøÓò
¹¤×÷Çø(working directory)
ÔÝ´æÇø(stage index)
±¾µØÀúÊ·Çø(history)
ͨ¹ýÒ»ÕÅͼ¾ÍÄܼò½àÒ×¶®µÄÃ÷°×ËüÃÇÖ®¼äµÄת»¯¡£

clone
ÏÈ´ÓcloneÃüÁîÀ´½éÉÜ£¬Ê¹ÓùýgitµÄ¶¼ÖªµÀËü¡£git colneÃüÁîÀȡԶ³Ì²Ö¿âµ½±¾µØ¡£µ«µ±ÎÒÃÇÒªÀÈ¡µ½Ö¸¶¨µÄÎļþ¼ÐÏÂʱ£¬Äã¿ÉÄÜ»áÖ±½Ómkdir£¬ÆäʵÎÞÐèÈç´Ë£¬Ò»ÌõÃüÁî¾ÍÄܸ㶨git
clone Ô¶³Ì²Ö¿â ÎļþÃû£¬¾ÍÊÇÈç´Ë¼òµ¥¡£
rm
ÎÒÃÇÔÚ¹¤×÷ÖпÉÄÜ»áÓöµ½ÕâôһÖÖÇé¿ö£¬Ê¹ÓÃgit add .Ö±½Ó½«¹¤×÷ÇøµÄËùÓÐÐ޸ĵÄÎļþ¼ÓÈëµ½ÔÝ´æÇøÁË£¬µ«ÊǺóÃæ·¢ÏÖÓÐÒ»¸öÎļþÏȲ»Òª¼Ó½øÈ¥£¬´ËʱÎÒÃǾͿÉÒÔʹÓÃÈçÏÂÃüÁî¾Í¿ÉÒÔ½«¸ÃÎļþÍ˻ص½¹¤×÷ÇøÖС£
stash
ÓÐÕâôһÖÖÇé¿ö£¬µ±ÄãÕýÔÚ¿ª·¢ÖÐʱ£¬ÓÐÒ»¸öÏßÉϵĽô¼±bugÐèÒªÐÞ¸´£¬´Ëʱ¿ª·¢ÖеŦÄÜÓÖûÓÐÍê³ÉÄã²»ÏëÌá½»£¬´ËʱÄã¿ÉÒÔʹÓÃgit
stash½«¹¤×÷ÇøµÄÎļþ¶¼´æ·ÅÆðÀ´¡£ÕâʱÄã¾Í¿ÉÒÔ·ÅÐĵÄÈ¥ÇзÖÖ§ÐÞ¸´bug£¬ÐÞ¸´ÍêÖ®ºóÖ´ÐÐgit stash
pop¿ÉÒÔ½«ÏÈǰ´æ·ÅµÄÈ¡³ö£¬µ±È»Ò²ÓÐһЩÆäËûµÄÏà¹ØÃüÁîÀýÈ磺git stash list²é¿´´æ·ÅµÄ¼Ç¼,git
stash drop¶ªÆú´æ·ÅµÄ¼Ç¼¡£
tag
¿ÉÄÜÔÚ¿ª·¢ÖÐÎÒÃÇÒª´ò±êÇ©git tag tagName£¬²¢ÇÒÒª½«ÏàÓ¦µÄ±êÇ©ÍÆË͵½Ô¶³Ì²Ö¿âÖУ¬´Ëʱ¿ÉÒÔʹÓÃÈçÏÂÃüÁî½øÐÐÍÆËÍ¡£
amend
µ±ÄãcommitÒԺ󣬷¢ÏÖÓÐÒ»¸öÎļþûÓмӽøÉϴεÄcommitÖУ¬»òÕßÓÖÐÞ¸ÄÁËһЩÎļþ¡£´ËʱÄã²¢²»ÏëÔö¼ÓеÄcommitÐÅÏ¢£¬Ö»ÊÇÏ뽫Æä¼ÓÈëµ½ÉϴεÄcommitÖС£ÕâʱÄã¾Í¿ÉÒÔʹÓÃ
git commit --amend <file> |
½«ÔÝ´æÇøµÄÎļþ¼ÓÈëÆäÖÐ,²¢ÇÒÄãÒ²¿ÉÒÔÐ޸ĴËʱµÄcommitÐÅÏ¢¡£
reset
resetÒ²ÄÜʵÏÖÇ°ÃæµÄrmµÄЧ¹û£¬¿ÉÒÔʹÓÃÈçÏÂÃüÁîÀ´Ìæ´úÇ°ÃæµÄgit rm --cached <file>ÃüÁî
µ«resetÓÃ;¸ü¹ã£¬½áºÏsoft²ÎÊý¿ÉÒԻس·µ½ÈÎÒâµÄcommit½Úµã½øÐвÙ×÷
Ö´ÐиÃÃüÁîÖ®ºó£¬¾Í»Øµ½index´¦£¬¹¤×÷Çø²»±ä¡¢ÔÝ´æÇø»Øµ½µ±Ê±µÄindex´¦¡£ÁíÍ⻹ÓÐÒ»¸öhard²ÎÊý¡£
Óësoft¿ÉÒÔ˵¶ÔÁ¢£¬ËüµÄЧ¹û¾ÍÔÚÓÚ¹¤×÷ÇøÓëÔÝ´æÇøµÄ²»Í¬£¬Ëü»áÇå¿ÕÕâÁ½¸öÇø¡£
rebase
¶ÔÓÚrebaseÊÇÖØ¶¨ÏòµÄÒâ˼£¬Èç¹ûÄ㵱ǰµÄ·ÖÖ§ÓëÔ¶³ÌµÄ·ÖÖ§commitÐÅÏ¢´æÔÚ²îÒìʱ£¬»áÌáÐÑÄã´Ëʱ²»ÄܽøÐÐpush£¬±ØÐëÏȽ«Ô¶³ÌµÄcommitÐÅÏ¢ÀÈ¥µ½±¾µØÀ´£¬²ÅÄܽøÐÐÌá½»¡£¶ÔÓÚÕâÖÖÇé¿ö¾Í¿ÉÒÔʹÓÃrebaseÃüÁîÁË¡£Èçϵ±Ç°´¦ÔÚdevelop·ÖÖ§

´ËʱӦ¸ÃÏÈÖ´ÐÐrebaseÃüÁî
git fetch git rebase origin/master |
Ö´ÐÐÍêÖ®ºó£¬×îºóÔÙpushµ½Ô¶³Ìmaster
×îÖÕ¸÷¸ö·ÖÖ§µÄÇé¿ö¾ÍÊÇÉÏͼµÄЧ¹ûÁË¡£Èç¹û¾õµÃÃüÁî¶àÄѼǣ¬ÕâÀïÒ²¿ÉÓÃÒ»ÌõÃüÁîÀ´Íê³ÉÉÏÃæµÄЧ¹û
git pull --rebase origin master |
ÕâÊÇrebaseµÄ¼òµ¥ÔËÓã¬Ò²Êdz£¼ûµÄÃüÁîÁË¡£ÏÂÃæ½éÉÜrebaseµÄÒ»¸ö¿ÉÑ¡²ÎÊý--onto¡£
--onto
ʹÓó¡¾°£º¿ª·¢¹ý³ÌÖÐÎÒÃǶ¼»á´´½¨²»Í¬µÄ·ÖÖ§½øÐпª·¢²»Í¬µÄ¹¦ÄÜ£¬µ±ÄãÔÚ·ÖÖ§AÉÏ´´½¨ÁËзÖÖ§B½øÐпª·¢¹¦Äܲ¢ÇÒÒ²Ìá½»ÁËһЩcommitʱ£¬´ËʱÄã·¢ÏÖÔÀ´A·ÖÖ§ÉÏÓдíÎóµÄcommit£¬Èç¹ûÒªrebaseµ½masterÉÏʱ£¬²»Äܽ«Õâ¸ö´íÎóµÄcommitÒ²¸½´øÉÏ¡£Õâ¸öʱºò¾Í¸Ã--onto´óÏÔÉñͨÁË¡£

µ±Ç°´¦ÔÚB·ÖÖ§£¬ÒªµÃµ½ÉÏÃæµÄ½á¹û£¬Ö»ÐèÖ´ÐÐÈçÏÂÃüÁî
git rebase --onto master <bµÄcommit hash code> B |
Õâ¸ö²»½ö¿ÉÒÔÕë¶Ô²»Í¬µÄ·ÖÖ§£¬Ò²ÄÜ×÷ÓÃÓÚͬһ¸ö·ÖÖ§ÉÏ¡£ËùÒÔÕë¶ÔÉÏÃæµÄÇé¿ö¿ÉÒÔÖ»¶Ô·ÖÖ§B½øÐвÙ×÷£¬µÈ¼ÛÃüÁîÈçÏ£º
git rebase --onto <aµÄcommit hash code> <bµÄcommit hash code> B |
--interactive
µ±ÎÒÃÇÒªÐÞ¸ÄcommitÐÅÏ¢µÄÃû³ÆÊ±£¬Èç¹ûÒªÐ޸ĵÄcommit´¦ÔÚµÚÒ»¸öʱ£¬¿ÉÒÔʹÓÃ
Èç¹û²»ÊǵÚÒ»¸öʱ£¬ÎÒÃǾÍҪʹÓõ½rebaseµÄ--interactive¿ÉÑ¡²ÎÊýÁË£¬¿ÉÒÔ¼òдΪ-i¡£
git rebase -i <commit hash code> |
²ÎÊýºóÃæµÄcommit hash codeΪÐèÒªÐ޸ĵÄcommitµÄǰһ¸ö¡£Ö´ÐÐÖ®ºó¾Í»á³öÏÖÈçÏÂÀàËÆµÄÐÅÏ¢£º
pick 137cf0a First coommit pick 163dc38 Second commit # Rebase f9aee6e..163dc38 onto f9aee6e (2 command(s)) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out |
¸ù¾ÝÌáʾÎÒÃÇ¿ÉÒÔÓÐ6¸ö¿ÉÑ¡ÔñµÄ²Ù×÷¡£ÏàÐÅÌáʾÒѾ˵µÄºÜÃ÷ÏÔÁË£¬¶ÔÓÚÎÒÃÇÕâÖÖÒªÐÞ¸ÄFirst coommitµÄÇé¿ö£¬ÐèҪʹÓÃr¡£
r 137cf0a First commit pick 163dc38 Second commit |
Ö´ÐÐÖ®ºó»áÌøµ½ÐÞ¸ÃFirst coomitµÄ½çÃæ£¬½øÐÐÐ޸ļ´¿É¡£
First commit # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Thu Jan 26 23:07:10 2017 +0800 # # rebase in progress; onto f9aee6e # You are currently editing a commit while rebasing branch 'master' on 'f9aee6e'. # # Changes to be committed: # new file: file1 |
ÖÁÓÚÆäËûµÄ²Ù×÷ÏÓÐÐËȤµÄ¿ÉÒÔ×Ô¼ºÈ¥³¢ÊÔһϡ£ÀýÈçs²Ù×÷¾Í¿ÉÒÔÓÃÀ´ºÏ²¢commit¡£
branch
ÏàÐÅbranch¶¼ºÜÊìϤ£¬ÎÒÕâÀïҪ˵µÄÊÇËûµÄÁíÒ»ÖÖ¿ÉÄÜ»áÓõ½µÄÇé¿ö¡£³¡¾°ÊÇÕâÑùµÄ£ºÈç¹ûÔÚÄã½øÐд´½¨ÐµķÖ֧ʱ£¬²¢²»Ïë´Óµ±Ç°µÄcommitÐÅÏ¢½Úµã½øÐд´½¨·ÖÖ§¡£

ҪʵÏÖÈçÉÏЧ¹ûÖ»ÐèÔÚ´´½¨·Ö֧ʱÔÚºóÃæÔÙÌí¼Ó¶îÍâµÄ²ÎÊý£¬¸Ã²ÎÊý¾ÍÊÇÄãËùÐèµ÷µ½µÄcommit½ÚµãµÄhash
code
git branch new_branch <commit hash code> |
push
ÕâÀïÌáÒ»ÏÂpushµÄ--set-upstream,ËüµÄЧ¹ûÊÇÉèÖÃÉÏÓηÖÖ§£¬µ±ÎÒÃǽ«Ô¶³Ì²»´æÔڵı¾µØ·ÖÖ§ÍÆË͵½Ô¶³Ìʱ£¬Èç¹û²»ÔÚÍÆË͵ķÖÖ§ÉÏ£¬ÎÒÃÇÒ»°ã»áʹÓÃÈçÏÂÃüÁî½øÐÐÍÆËÍ¡£
git checkout push_branch git push origin push_branch |
ÏÂÃæÊǼò½àµÄ·½·¨£¬Ê¹ÓøòÎÊýÎÞÐèÇл»·ÖÖ§£¬¿ÉÒÔÖ±½ÓʹÓÃÈçÏÂÃüÁî½øÐÐÍÆËÍ¡£
git push --set-upstream origin push_branch |
cherry-pick
Õâ¸öÃüÁîµÄ³¡¾°ÊÇ£ºµ±ÄãËùÔڵķÖ֧ûÓã¬ÄãҪɾ³ýËü£¬µ«ÆäÖеÄÒ»¸öcommitÄ㻹ÊÇÏëÍÆË͵½Ô¶³ÌmasterÉÏ¡£

½«·ÖÖ§Çл»µ½master£¬Ö´ÐÐÒÔÏÂÃüÁ
git cherry-pick <bµÄ commit hash code> |
merge
ÎÒÃÇËùÊìÖªµÄÊÇʹÓÃmergeÀ´½øÐзÖÖ§µÄºÏ²¢£¬Ã¿´ÎʹÓÃmergeʱ¶¼»á×Ô¶¯½«¸±·ÖÖ§ºÏ²¢³ÉÒ»¸öcommit½øÐÐÍÆË͵½Ö÷·ÖÖ§ÉÏ£¬ÄÇôÈç¹ûÎÒ²»ÏëËü×Ô¶¯ÍÆË͵½Ö÷·ÖÖ§ÉÏʱ(¿ÉÄÜÎÒ»¹ÐèÒª½øÐÐÐÞ¸Ä)£¬Õâʱ¾Í¿ÉÒÔʹÓÃ--squash²Ù×÷
git merge --squash dev_branch |
Ö´ÐÐÍêÒÔÉÏÃüÁîºó£¬ÎÒÃǾͿÉÒÔÔÚÔÝ´æÇø¿´µ½Ò»¸ö»¹Î´Ìá½»µÄÎļþ״̬¡£
reflog
µ±ÎÒÃÇÇзÖ֧̫Ƶ·±ÁËÖ®ºó£¬¿ÉÄÜ»áÍüÁËһЩ·ÖÖ§ÊÇ´ÓÄĸö·ÖÖ§ÇйýÀ´µÄ£¬´Ëʱ¿ÉÒÔʹÓÃÈçÏÂÃüÁî²é¿´£º
894a16d HEAD@{0}:
commit: commit another todo 6876e5b HEAD@{1}:
checkout: moving from solve_world_hunger to kill_the_batman 324336a HEAD@{2}:
commit: commit todo 6876e5b HEAD@{3}:
checkout: moving from blowup_sun_for_ransom to solve_world_hunger 6876e5b HEAD@{4}:
checkout: moving from kill_the_batman to blowup_sun_for_ransom 6876e5b HEAD@{5}:
checkout: moving from cure_common_cold to kill_the_batman 6876e5b HEAD@{6}:
commit (initial): initial commit |
ÕâÑùÎÒÃǾͿÉÒÔ¿´µ½ËùÓõIJÙ×÷ÀúÊ·ÁË¡£ÕâÑùÈç¹ûÎÒÃÇʹÓÃgit resetÃüÁСÐÄɾ³ýÁËÐèÒªµÄ¶«Î÷¡£¿ÉÒÔͨ¹ý´ËÀ´²éÕÒµ½É¾³ý²Ù×÷µÄhash
code£¬Ö®ºó¾Í¿ÉÒÔͨ¹ýÈçÏÂÃüÁî½øÐлָ´¡£
ĿǰÏëµ½µÄ¾ÍÕâЩÁË£¬Ï£ÍûÄÜÓÐËù°ïÖú |