±à¼ÍƼö: |
±¾ÎÄÀ´×Ô51cto£¬ÔÚ±¾ÎÄÖУ¬ÎÒÃǽ«´øÄãÁ˽âÈçºÎÈ¥ÖØÖᢻָ´ºÍÍêÈ«»Øµ½ÒÔǰµÄ״̬£¬×öµ½ÕâЩֻÐèÒª¼¸¸ö¼òµ¥¶øÓÅÑŵÄ
Git ÃüÁî¡£ |
|

Óüò½à¶øÓÅÑÅµÄ Git ÃüÁî³·Ïú²Ö¿âÖеĸı䡣
ʹÓà Git ¹¤×÷ʱÆäÖÐÒ»¸öÏÊΪÈËÖª£¨ºÍûÓÐÒâʶµ½£©µÄ·½Ãæ¾ÍÊÇ£¬ÈçºÎÇáËɵطµ»Øµ½ÄãÒÔǰµÄλÖà ¡ª¡ª
Ò²¾ÍÊÇ˵£¬ÔÚ²Ö¿âÖÐÈçºÎºÜÈÝÒ×µØÈ¥³·ÏúÄÇÅÂÊÇÖØ´óµÄ±ä¸ü¡£ÔÚ±¾ÎÄÖУ¬ÎÒÃǽ«´øÄãÁ˽âÈçºÎÈ¥ÖØÖᢻָ´ºÍÍêÈ«»Øµ½ÒÔǰµÄ״̬£¬×öµ½ÕâЩֻÐèÒª¼¸¸ö¼òµ¥¶øÓÅÑŵÄ
Git ÃüÁî¡£
ÖØÖÃ
ÎÒÃÇ´Ó Git µÄ reset ÃüÁʼ¡£È·Êµ£¬ÄãÓ¦¸ÃÄܹ»ÈÏΪËü¾ÍÊÇÒ»¸ö ¡°»Ø¹ö¡± ¡ª¡ª Ëü½«Äã±¾µØ»·¾³·µ»Øµ½Ö®Ç°µÄÌá½»¡£ÕâÀïµÄ
¡°±¾µØ»·¾³¡± Ò»´Ê£¬ÎÒÃÇÖ¸µÄÊÇÄãµÄ±¾µØ²Ö¿â¡¢ÔÝ´æÇøÒÔ¼°¹¤×÷Ŀ¼¡£
ÏÈ¿´Ò»ÏÂͼ 1¡£ÔÚÕâÀïÎÒÃÇÓÐÒ»¸öÔÚ Git ÖбíʾһϵÁÐÌá½»µÄʾÒâͼ¡£ÔÚ Git ÖÐÒ»¸ö·ÖÖ§¼òµ¥À´Ëµ¾ÍÊÇÒ»¸öÃüÃûµÄ¡¢Ö¸ÏòÒ»¸öÌØ¶¨µÄÌá½»µÄ¿ÉÒÆ¶¯Ö¸Õë¡£ÔÚÕâÀÎÒÃǵÄ
master ·ÖÖ§ÊÇÖ¸ÏòÁ´ÖÐ×îÐÂÌá½»µÄÒ»¸öÖ¸Õë¡£

ͼ 1£ºÓвֿ⡢ÔÝ´æÇø¡¢ºÍ¹¤×÷Ŀ¼µÄ±¾µØ»·¾³
Èç¹û¿´Ò»ÏÂÎÒÃÇµÄ master ·ÖÖ§ÊÇʲô£¬¿ÉÒÔ¿´Ò»Ïµ½Ä¿Ç°ÎªÖ¹ÎÒÃDzúÉúµÄÌá½»Á´¡£
$
git log --oneline
b764644 File with three lines
7c709f0 File with two lines
9ef9173 File with one line |
Èç¹ûÎÒÃÇÏë»Ø¹öµ½Ç°Ò»¸öÌá½»»á·¢ÉúÊ²Ã´ÄØ£¿ºÜ¼òµ¥ ¡ª¡ª ÎÒÃÇÖ»ÐèÒªÒÆ¶¯·ÖÖ§Ö¸Õë¼´¿É¡£Git ÌṩÁËΪÎÒÃÇ×öÕâ¸ö¶¯×÷µÄ
reset ÃüÁî¡£ÀýÈ磬Èç¹ûÎÒÃÇÖØÖà master Ϊµ±Ç°Ìá½»»ØÍËÁ½¸öÌá½»µÄλÖã¬ÎÒÃÇ¿ÉÒÔʹÓÃÈçÏÂÖ®Ò»µÄ·½·¨£º
£¨Ê¹ÓÃÒ»¸ö¾ø¶ÔµÄÌá½» SHA1 Öµ 9ef9173£©
»ò£º
£¨ÔÚ ¡°current¡± ±êǩ֮ǰ£¬Ê¹ÓÃÒ»¸öÏà¶ÔÖµ -2£©
ͼ 2 չʾÁ˲Ù×÷µÄ½á¹û¡£ÔÚÕâÖ®ºó£¬Èç¹ûÎÒÃÇÔÚµ±Ç°·ÖÖ§£¨master£©ÉÏÔËÐÐÒ»¸ö git log
ÃüÁÎÒÃǽ«¿´µ½Ö»ÓÐÒ»¸öÌá½»¡£
$
git log --oneline
9ef9173 File with one line |

ͼ 2£ºÔÚ reset Ö®ºó
git reset ÃüÁîÒ²°üº¬Ê¹ÓÃһЩѡÏ¿ÉÒÔÈÃÄã×îÖÕÂúÒâµÄÌá½»ÄÚÈÝÈ¥¸üб¾µØ»·¾³µÄÆäËü²¿·Ö¡£ÕâЩѡÏî°üÀ¨£ºhard
ÔÚ²Ö¿âÖÐÈ¥ÖØÖÃÖ¸ÏòµÄÌá½»£¬ÓÃÌá½»µÄÄÚÈÝÈ¥Ìî³ä¹¤×÷Ŀ¼£¬²¢ÖØÖÃÔÝ´æÇø£»soft ½öÖØÖòֿâÖеÄÖ¸Õ룻¶ø
mixed£¨Ä¬ÈÏÖµ£©½«ÖØÖÃÖ¸ÕëºÍÔÝ´æÇø¡£
ÕâЩѡÏîÔÚÌØ¶¨Çé¿öÏ·dz£ÓÐÓ㬱ÈÈ磬git reset --hard <commit sha1
| reference> Õâ¸öÃüÁ¸²¸Ç±¾µØÈκÎδÌá½»µÄ¸ü¸Ä¡£Êµ¼ÊÉÏ£¬ËüÖØÖÃÁË£¨Çå³ýµô£©ÔÝ´æÇø£¬²¢ÓÃÄãÖØÖõÄÌá½»ÄÚÈÝÈ¥¸²¸ÇÁ˹¤×÷ÇøÖеÄÄÚÈÝ¡£ÔÚÄãʹÓÃ
hard Ñ¡Ïî֮ǰ£¬Ò»¶¨ÒªÈ·±£ÕâÊÇÄãÕæÕýµØÏëÒª×öµÄ²Ù×÷£¬ÒòΪÕâ¸öÃüÁî»á¸²¸ÇµôÈκÎδÌá½»µÄ¸ü¸Ä¡£
»Ö¸´
git revert ÃüÁîµÄʵ¼Ê½á¹ûÀàËÆÓÚ reset£¬µ«ËüµÄ·½·¨²»Í¬¡£reset ÃüÁĬÈÏ£©ÊÇÔÚÁ´ÖÐÏòºóÒÆ¶¯·ÖÖ§µÄÖ¸ÕëÈ¥¡°³·Ïú¡±¸ü¸Ä£¬revert
ÃüÁîÊÇÔÚÁ´ÖÐÌí¼ÓÒ»¸öеÄÌύȥ¡°È¡Ïû¡±¸ü¸Ä¡£Ôٴβ鿴ͼ 1 ¿ÉÒԷdz£ÇáËɵؿ´µ½ÕâÖÖÓ°Ïì¡£Èç¹ûÎÒÃÇÔÚÁ´ÖеÄÿ¸öÌá½»ÖÐÏòÎļþÌí¼ÓÒ»ÐУ¬Ò»ÖÖ·½·¨ÊÇʹÓÃ
reset ʹÄǸöÌá½»·µ»Øµ½½öÓÐÁ½ÐеÄÄǸö°æ±¾£¬È磺git reset HEAD~1¡£
ÁíÒ»¸ö·½·¨ÊÇÌí¼ÓÒ»¸öеÄÌύȥɾ³ýµÚÈýÐУ¬ÒÔʹ×îÖÕ½áÊø±ä³ÉÁ½Ðеİ汾 ¡ª¡ª ʵ¼ÊЧ¹ûÒ²ÊÇÈ¡ÏûÁËÄǸö¸ü¸Ä¡£Ê¹ÓÃÒ»¸ö
git revert ÃüÁî¿ÉÒÔʵÏÖÉÏÊöÄ¿µÄ£¬±ÈÈ磺
ÒòΪËüÌí¼ÓÁËÒ»¸öеÄÌá½»£¬Git ½«ÌáʾÈçϵÄÌá½»ÐÅÏ¢£º
Revert
"File with three lines"
This reverts commit b764644bad524b804577684bf74e7bca3117f554.
# Please enter the commit message for your changes.
Lines starting
# with '#' will be ignored, and an empty message
aborts the commit.
# On branch master
# Changes to be committed:
# modified: file1.txt
# |
ͼ 3£¨ÔÚÏÂÃæ£©Õ¹Ê¾ÁË revert ²Ù×÷Íê³ÉºóµÄ½á¹û¡£
Èç¹ûÎÒÃÇÏÖÔÚÔËÐÐÒ»¸ö git log ÃüÁÎÒÃǽ«¿´µ½Ç°ÃæµÄÌύ֮ǰµÄÒ»¸öÐÂÌá½»¡£
$
git log --oneline
11b7712 Revert "File with three lines"
b764644 File with three lines
7c709f0 File with two lines
9ef9173 File with one line |
ÕâÀïÊǹ¤×÷Ŀ¼ÖÐÕâ¸öÎļþµ±Ç°µÄÄÚÈÝ£º
$
cat <filename>
Line 1
Line 2 |

ͼ 3 revert ²Ù×÷Ö®ºó
»Ö¸´»òÖØÖÃÈçºÎÑ¡Ôñ£¿
ΪʲôҪÓÅÏÈÑ¡Ôñ revert ¶ø²»ÊÇ reset ²Ù×÷£¿Èç¹ûÄãÒѾ½«ÄãµÄÌá½»Á´ÍÆË͵½Ô¶³Ì²Ö¿â£¨ÆäËüÈË¿ÉÒÔÒѾÀÈ¡ÁËÄãµÄ´úÂë²¢¿ªÊ¼¹¤×÷£©£¬Ò»¸ö
revert ²Ù×÷ÊÇÈÃËûÃÇÈ¥»ñµÃ¸ü¸ÄµÄ·Ç³£ÓѺõķ½Ê½¡£ÕâÊÇÒòΪ Git ¹¤×÷Á÷¿ÉÒԷdz£ºÃµØÔÚ·ÖÖ§µÄÄ©¶ËÌí¼ÓÌá½»£¬µ«Êǵ±ÓÐÈË
reset ·ÖÖ§Ö¸ÕëÖ®ºó£¬Ò»×éÌá½»½«ÔÙÒ²¿´²»¼ûÁË£¬Õâ¿ÉÄÜ»áÊÇÒ»¸öÌôÕ½¡£
µ±ÎÒÃÇÒÔÕâÖÖ·½Ê½Ê¹Óà Git ¹¤×÷ʱ£¬ÎÒÃǵĻù±¾¹æÔòÖ®Ò»ÊÇ£ºÔÚÄãµÄ±¾µØ²Ö¿âÖÐʹÓÃÕâÖÖ·½Ê½È¥¸ü¸Ä»¹Ã»ÓÐÍÆË͵ĴúÂëÊÇ¿ÉÒԵġ£Èç¹ûÌá½»ÒÑ¾ÍÆË͵½ÁËÔ¶³Ì²Ö¿â£¬²¢ÇÒ¿ÉÄÜÆäËüÈËÒѾʹÓÃËüÀ´¹¤×÷ÁË£¬ÄÇôӦ¸Ã±ÜÃâÕâÐ©ÖØÐ´Ìá½»ÀúÊ·µÄ¸ü¸Ä¡£
×ÜÖ®£¬Èç¹ûÄãÏë»Ø¹ö¡¢³·Ïú»òÕßÖØÐ´ÆäËüÈËÒѾÔÚʹÓõÄÒ»¸öÌá½»Á´µÄÀúÊ·£¬µ±ÄãµÄͬÊÂÊÔͼ½«ËûÃǵĸü¸ÄºÏ²¢µ½ËûÃÇÀÈ¡µÄÔʼÁ´ÉÏʱ£¬ËûÃÇ¿ÉÄÜÐèÒª×ö¸ü¶àµÄ¹¤×÷¡£Èç¹ûÄã±ØÐë¶ÔÒÑ¾ÍÆËͲ¢±»ÆäËûÈËÕýÔÚʹÓõĴúÂë×ö¸ü¸Ä£¬ÔÚÄã×ö¸ü¸Ä֮ǰ±ØÐëÒªÓëËûÃǹµÍ¨£¬ÈÃËûÃÇÏȺϲ¢ËûÃǵĸü¸Ä¡£È»ºóÔÚÕâ¸öÇÖÈë²Ù×÷ûÓÐÐèÒªºÏ²¢µÄÄÚÈÝÖ®ºó£¬ËûÃÇÔÙÀÈ¡×îеĸ±±¾¡£
Äã¿ÉÄÜ×¢Òâµ½ÁË£¬ÔÚÎÒÃÇ×öÁË reset ²Ù×÷Ö®ºó£¬ÔʼµÄÌá½»Á´ÈÔÈ»ÔÚÄǸöλÖá£ÎÒÃÇÒÆ¶¯ÁËÖ¸Õ룬Ȼºó
reset ´úÂë»Øµ½Ç°Ò»¸öÌá½»£¬µ«Ëü²¢Ã»ÓÐɾ³ýÈκÎÌá½»¡£»»¾ä»°Ëµ¾ÍÊÇ£¬Ö»ÒªÎÒÃÇÖªµÀÎÒÃÇËùÖ¸ÏòµÄÔʼÌá½»£¬ÎÒÃÇÄܹ»Í¨¹ý¼òµ¥µÄ·µ»Øµ½·ÖÖ§µÄÔʼÁ´µÄÍ·²¿À´¡°»Ö¸´¡±Ö¸Õëµ½Ç°ÃæµÄλÖãº
git
reset <sha1 of commit> |
µ±Ìá½»±»Ìæ»»Ö®ºó£¬ÎÒÃÇÔÚ Git ÖÐ×öµÄ´óÁ¿ÆäËü²Ù×÷Ò²»á·¢ÉúÀàËÆµÄÊÂÇé¡£ÐÂÌá½»±»´´½¨£¬ÓйصÄÖ¸Õë±»ÒÆ¶¯µ½Ò»¸öеÄÁ´£¬µ«ÊÇÀϵÄÌá½»Á´ÈÔÈ»´æÔÚ¡£
񄯗
ÏÖÔÚÎÒÃÇÀ´¿´Ò»¸ö·ÖÖ§±ä»ù¡£¼ÙÉèÎÒÃÇÓÐÁ½¸ö·ÖÖ§£ºmaster ºÍ feature£¬Ìá½»Á´ÈçÏÂͼ 4 Ëùʾ¡£master
µÄÌá½»Á´ÊÇ C4->C2->C1->C0 ºÍ feature µÄÌá½»Á´ÊÇ C5->C3->C2->C1->C0¡£

ͼ 4£ºmaster ºÍ feature ·ÖÖ§µÄÌá½»Á´
Èç¹ûÎÒÃÇÔÚ·ÖÖ§Öп´ËüµÄÌá½»¼Ç¼£¬ËüÃÇ¿´ÆðÀ´Ó¦¸ÃÏñÏÂÃæµÄÕâÑù¡££¨ÎªÁËÒ×ÓÚÀí½â£¬C ±íʾÌá½»ÐÅÏ¢£©
$
git log --oneline master
6a92e7a C4
259bf36 C2
f33ae68 C1
5043e79 C0
$ git log --oneline feature
79768b8 C5
000f9ae C3
259bf36 C2
f33ae68 C1
5043e79 C0 |
ÎÒ¸æËßÈËÃÇÔÚ Git ÖУ¬¿ÉÒÔ½« rebase ÈÏΪÊÇ ¡°½«ÀúÊ·ºÏ²¢¡±¡£´Ó±¾ÖÊÉÏÀ´Ëµ£¬Git ½«Ò»¸ö·ÖÖ§ÖеÄÿ¸ö²»Í¬Ìá½»³¢ÊÔ¡°ÖØ·Å¡±µ½ÁíÒ»¸ö·ÖÖ§ÖС£
Òò´Ë£¬ÎÒÃÇʹÓûù±¾µÄ Git ÃüÁ¿ÉÒÔ±ä»ùÒ»¸ö feature ·ÖÖ§½øÈëµ½ master ÖУ¬²¢½«ËüÆ´Èëµ½
C4 ÖУ¨±ÈÈ磬½«Ëü²åÈëµ½ feature µÄÁ´ÖУ©¡£²Ù×÷ÃüÁîÈçÏ£º
$
git checkout feature
$ git rebase master
First, rewinding head to replay your work on
top of it...
Applying: C3
Applying: C5 |
Íê³ÉÒÔºó£¬ÎÒÃǵÄÌá½»Á´½«±ä³ÉÈçÏÂͼ 5 µÄÑù×Ó¡£

ͼ 5£ºrebase ÃüÁîÍê³ÉºóµÄÌá½»Á´
½Ó×Å£¬ÎÒÃÇ¿´Ò»ÏÂÌá½»ÀúÊ·£¬ËüÓ¦¸Ã±ä³ÉÈçϵÄÑù×Ó¡£
$
git log --oneline master
6a92e7a C4
259bf36 C2
f33ae68 C1
5043e79 C0
$ git log --oneline feature
c4533a5 C5
64f2047 C3
6a92e7a C4
259bf36 C2
f33ae68 C1
5043e79 C0 |
×¢ÒâÄǸö C3' ºÍ C5'¡ª ÔÚ master ·ÖÖ§ÉÏÒÑ´¦ÓÚÌá½»Á´µÄ¡°¶¥²¿¡±£¬ÓÉÓÚ²úÉúÁ˸ü¸Ä¶ø´´½¨ÁËÐÂÌá½»¡£µ«ÊÇҲҪעÒâµÄÊÇ£¬rebase
ºó¡°ÔʼµÄ¡± C3 ºÍ C5 ÈÔÈ»ÔÚÄÇÀï ¡ª Ö»ÊÇÔÙûÓÐÒ»¸ö·ÖÖ§Ö¸ÏòËüÃǶøÒÑ¡£
Èç¹ûÎÒÃÇ×öÁËÕâ¸ö±ä»ù£¬È»ºóÈ·¶¨Õâ²»ÊÇÎÒÃÇÏëÒªµÄ½á¹û£¬Ï£ÍûÈ¥³·ÏúËü£¬ÎÒÃÇ¿ÉÒÔ×öÏÂÃæÊ¾ÀýËù×öµÄ²Ù×÷£º
ÓÉÓÚÕâ¸ö¼òµ¥µÄ±ä¸ü£¬ÏÖÔÚÎÒÃǵķÖÖ§½«ÖØÐÂÖ¸Ïòµ½×ö rebase ²Ù×÷֮ǰһģһÑùµÄλÖà ¡ª¡ª ÍêÈ«µÈЧÓÚ³·Ïú²Ù×÷£¨Í¼
6£©¡£

ͼ 6£º³·Ïú rebase ²Ù×÷Ö®ºó
Èç¹ûÄãÏë²»ÆðÀ´Ö®Ç°Ò»¸ö²Ù×÷Ö¸ÏòµÄÒ»¸ö·ÖÖ§ÉÏÌá½»ÁËʲôÄÚÈÝÔõô°ì£¿ÐÒÔ˵ÄÊÇ£¬Git ÃüÁîÒÀÈ»¿ÉÒÔ°ïÖúÄã¡£ÓÃÕâÖÖ·½Ê½¿ÉÒÔÐ޸Ĵó¶àÊý²Ù×÷µÄÖ¸Õ룬Git
»á¼ÇסÄãµÄÔʼÌá½»¡£ÊÂʵÉÏ£¬ËüÊÇÔÚ .git ²Ö¿âĿ¼Ï£¬½«Ëü±£´æÎªÒ»¸öÌØ¶¨µÄÃûΪ ORIG_HEAD
µÄÎļþÖС£ÔÚËü±»ÐÞ¸Ä֮ǰ£¬ÄǸö·¾¶ÊÇÒ»¸ö°üº¬ÁË´ó¶àÊý×îÐÂÒýÓõÄÎļþ¡£Èç¹ûÎÒÃÇ cat Õâ¸öÎļþ£¬ÎÒÃÇ¿ÉÒÔ¿´µ½ËüµÄÄÚÈÝ¡£
$
cat .git/ORIG_HEAD
79768b891f47ce06f13456a7e222536ee47ad2fe |
ÎÒÃÇ¿ÉÒÔʹÓà reset ÃüÁÕýÈçÇ°ÃæËùÊö£¬Ëü·µ»ØÖ¸Ïòµ½ÔʼµÄÁ´¡£È»ºóËüµÄÀúÊ·½«ÊÇÈçϵÄÕâÑù£º
$
git log --oneline feature
79768b8 C5
000f9ae C3
259bf36 C2
f33ae68 C1
5043e79 C0 |
ÔÚ reflog ÖÐÊÇ»ñÈ¡ÕâЩÐÅÏ¢µÄÁíÍâÒ»¸öµØ·½¡£reflog ÊÇÄã±¾µØ²Ö¿âÖÐÏà¹ØÇл»»ò¸ü¸ÄµÄÏêϸÃèÊöÇåµ¥¡£Äã¿ÉÒÔʹÓÃ
git reflog ÃüÁîÈ¥²é¿´ËüµÄÄÚÈÝ£º
$
git reflog
79768b8 HEAD@{0}: reset: moving to 79768b
c4533a5 HEAD@{1}: rebase finished: returning
to refs/heads/feature
c4533a5 HEAD@{2}: rebase: C5
64f2047 HEAD@{3}: rebase: C3
6a92e7a HEAD@{4}: rebase: checkout master
79768b8 HEAD@{5}: checkout: moving from feature
to feature
79768b8 HEAD@{6}: commit: C5
000f9ae HEAD@{7}: checkout: moving from master
to feature
6a92e7a HEAD@{8}: commit: C4
259bf36 HEAD@{9}: checkout: moving from feature
to master
000f9ae HEAD@{10}: commit: C3
259bf36 HEAD@{11}: checkout: moving from master
to feature
259bf36 HEAD@{12}: commit: C2
f33ae68 HEAD@{13}: commit: C1
5043e79 HEAD@{14}: commit (initial): C0 |
Äã¿ÉÒÔʹÓÃÈÕÖ¾ÖÐÁгöµÄ¡¢Äã¿´µ½µÄÏà¹ØÃüÃû¸ñʽ£¬È¥ÖØÖÃÈκÎÒ»¸ö¶«Î÷£º
Ò»µ©ÄãÀí½âÁ˵±¡°Ð޸ġ±Á´µÄ²Ù×÷·¢Éúºó£¬Git ÊÇÈçºÎ¸ú×ÙÔʼÌá½»Á´µÄ»ù±¾ÔÀí£¬ÄÇôÔÚ Git ÖÐ×öһЩ¸ü¸Ä½«²»ÔÙÊÇÄÇô¿ÉŵÄÊ¡£Õâ¾ÍÊÇÇ¿´óµÄ
Git µÄºËÐÄÄÜÁ¦Ö®Ò»£ºÄܹ»ºÜ¿ìËÙ¡¢ºÜÈÝÒ׵س¢ÊÔÈκÎÊÂÇ飬²¢ÇÒÈç¹û²»³É¹¦¾Í³·ÏúËüÃÇ¡£ |