±à¼ÍƼö: |
±¾ÎÄÀ´×Ôcnblogs£¬ÎÄÕÂÖ÷Òª½éÉÜÁËÈçºÎͨ¹ý
Git-SVN ¿ªÊ¼Ê¹Óà Git£¬²¢×Ü½áÆ½Ê±¹¤×÷¸ßƵÂÊʹÓõ½µÄ Git ³£ÓÃÃüÁî¡£ |
|
µ¼Óï
±¾ÎÄ´Ó Git Óë SVN µÄ¶Ô±ÈÈëÊÖ£¬½éÉÜÈçºÎͨ¹ý Git-SVN ¿ªÊ¼Ê¹Óà Git£¬²¢×Ü½áÆ½Ê±¹¤×÷¸ßƵÂÊʹÓõ½µÄ
Git ³£ÓÃÃüÁî¡£
Ò»¡¢Git vs SVN
Git ºÍ SVN ÊëÓÅÊëºÃ£¬Ã¿¸öÈËÓв»Í¬µÄÌåÑé¡£
GitÊÇ·Ö²¼Ê½µÄ£¬SVNÊǼ¯ÖÐʽµÄ
ÕâÊÇ Git ºÍ SVN ×î´óµÄÇø±ð¡£ÈôÄÜÕÆÎÕÕâ¸ö¸ÅÄÁ½ÕßÇø±ð»ù±¾¸ã¶®´ó°ë¡£ÒòΪ Git ÊÇ·Ö²¼Ê½µÄ£¬ËùÒÔ
Git Ö§³ÖÀëÏß¹¤×÷£¬ÔÚ±¾µØ¿ÉÒÔ½øÐкܶà²Ù×÷£¬°üÀ¨½ÓÏÂÀ´½«ÒªÖذõÍÆ³öµÄ·ÖÖ§¹¦ÄÜ¡£¶ø SVN ±ØÐëÁªÍø²ÅÄÜÕý³£¹¤×÷¡£
Git¸´ÔÓ¸ÅÄî¶à£¬SVN¼òµ¥Ò×ÉÏÊÖ
ËùÓÐÍ¬Ê±ÕÆÎÕ Git ºÍ SVN µÄ¿ª·¢Õß¶¼±ØÐë³ÐÈÏ£¬Git µÄÃüÁîʵÔÚÌ«¶àÁË£¬ÈÕ³£¹¤×÷ÐèÒªÕÆÎÕadd,commit,status,fetch,push,rebaseµÈ£¬ÈôÒªÊìÁ·ÕÆÎÕ£¬»¹±ØÐëÕÆÎÕrebaseºÍmergeµÄÇø±ð£¬fetchºÍpullµÄÇø±ðµÈ£¬³ý´ËÖ®Í⣬»¹ÓÐcherry-pick£¬submodule£¬stashµÈ¹¦ÄÜ£¬½öÊÇÕâЩÃû´ÊÌý×Ŷ¼ºÜÈÆ¡£
ÔÚÒ×ÓÃÐÔÕâ·½Ãæ£¬SVN »áºÃµÃ¶à£¬¼òµ¥Ò×ÉÏÊÖ£¬¶ÔÐÂÊÖºÜÓѺᣵ«ÊÇ´ÓÁíÍâÒ»·½Ãæ¿´£¬Git ÃüÁî¶àÒâζ׏¦Äܶ࣬ÈôÎÒÃÇÄÜÕÆÎմ󲿷Ö
Git µÄ¹¦ÄÜ£¬Ìå»áµ½ÆäÖеİÂÃ»á·¢ÏÖÔÙÒ²»Ø²»È¥ SVN µÄʱ´úÁË¡£
Git·ÖÖ§Á®¼Û£¬SVN·ÖÖ§°º¹ó
ÔÚ°æ±¾¹ÜÀíÀ·ÖÖ§ÊǺܳ£Ê¹ÓõŦÄÜ¡£ÔÚ·¢²¼°æ±¾Ç°£¬ÐèÒª·¢²¼·ÖÖ§£¬½øÐдóÐèÇ󿪷¢£¬ÐèÒª feature
·ÖÖ§£¬´óÍŶӻ¹»áÓпª·¢·ÖÖ§£¬Îȶ¨·ÖÖ§µÈ¡£ÔÚ´óÍŶӿª·¢¹ý³ÌÖУ¬³£³£´æÔÚ´´½¨·ÖÖ§£¬Çл»·ÖÖ§µÄÐèÇó¡£
Git ·ÖÖ§ÊÇÖ¸ÕëÖ¸Ïòij´ÎÌá½»£¬¶ø SVN ·ÖÖ§ÊÇ¿½±´µÄĿ¼¡£Õâ¸öÌØÐÔʹ Git µÄ·ÖÖ§Çл»·Ç³£Ñ¸ËÙ£¬ÇÒ´´½¨³É±¾·Ç³£µÍ¡£
¶øÇÒ Git Óб¾µØ·ÖÖ§£¬SVN ÎÞ±¾µØ·ÖÖ§¡£ÔÚʵ¼Ê¿ª·¢¹ý³ÌÖУ¬¾³£»áÓöµ½ÓÐЩ´úÂëûдÍ꣬µ«ÊÇÐè½ô¼±´¦ÀíÆäËûÎÊÌ⣬ÈôÎÒÃÇʹÓÃ
Git£¬±ã¿ÉÒÔ´´½¨±¾µØ·ÖÖ§´æ´¢Ã»Ð´ÍêµÄ´úÂ룬´ýÎÊÌâ´¦ÀíÍêºó£¬Ôٻص½±¾µØ·ÖÖ§¼ÌÐøÍê³É´úÂë¡£
¶þ¡¢Git ºËÐĸÅÄî
Git ×îºËÐĵÄÒ»¸ö¸ÅÄî¾ÍÊǹ¤×÷Á÷¡£
¹¤×÷Çø(Workspace)ÊǵçÄÔÖÐʵ¼ÊµÄĿ¼¡£
ÔÝ´æÇø(Index)ÀàËÆÓÚ»º´æÇøÓò£¬ÁÙʱ±£´æÄãµÄ¸Ä¶¯¡£
²Ö¿âÇø(Repository)£¬·ÖΪ±¾µØ²Ö¿âºÍÔ¶³Ì²Ö¿â¡£
´Ó SVN Çл»µ½ Git£¬×îÄÑÀí½â²¢ÇÒ×î²»ÄÜÀí½âµÄÊÇÔÝ´æÇøºÍ±¾µØ²Ö¿â¡£ÊìÁ·Ê¹Óà Git ºó£¬»á·¢ÏÖÕâ¼òÖ±ÊÇÉñÉè¼Æ£¬ÓÉÓÚÕâÁ½ÕߵĴæÔÚ£¬Ê¹Ðí¶à¹¤×÷±äµÃÒ×¹ÜÀí¡£
ͨ³£Ìá½»´úÂë·ÖΪ¼¸²½£º
git add´Ó¹¤×÷ÇøÌá½»µ½ÔÝ´æÇø
git commit´ÓÔÝ´æÇøÌá½»µ½±¾µØ²Ö¿â
git push»ògit svn dcommit´Ó±¾µØ²Ö¿âÌá½»µ½Ô¶³Ì²Ö¿â
Ò»°ãÀ´Ëµ£¬¼ÇסÒÔÏÂÃüÁ±ã¿É½øÐÐÈÕ³£¹¤×÷ÁË£¨Í¼Æ¬À´Ô´ÓÚÍøÂ磩£º

[ GitÃüÁî ]
Èý¡¢Git-SVN³£ÓÃÃüÁî
±¾½ÚÃüÁîÕë¶ÔʹÓà Git-SVN µÄ¿ª·¢Õߣ¬ÇëÎñ±ØÕÆÎÕ¡£
Èô·þÎñÆ÷ʹÓÃµÄ SVN£¬µ«ÊDZ¾µØÏëÒªÌåÑé Git µÄ±¾µØ·ÖÖ§£¬ÀëÏß²Ù×÷µÈ¹¦ÄÜ£¬¿ÉÒÔʹÓà Git-SVN¹¦ÄÜ¡£
³£ÓòÙ×÷ÈçÏ£¨Í¼Æ¬À´Ô´ÓÚÍøÂ磩£º

[ Git-SVN ]
# ÏÂÔØÒ»¸ö SVN ÏîÄ¿ºÍËüµÄÕû¸ö´úÂëÀúÊ·£¬²¢³õʼ»¯Îª
Git ´úÂë¿â
$ git svn clone -s [repository]
# ²é¿´µ±Ç°°æ±¾¿âÇé¿ö
$ git svn info
# È¡»ØÔ¶³Ì²Ö¿âËùÓзÖÖ§µÄ±ä»¯
$ git svn fetch
# È¡»ØÔ¶³Ì²Ö¿âµ±Ç°·ÖÖ§µÄ±ä»¯£¬²¢Óë±¾µØ·ÖÖ§±ä»ùºÏ²¢
$ git svn rebase
# ÉÏ´«µ±Ç°·ÖÖ§µÄ±¾µØ²Ö¿âµ½Ô¶³Ì²Ö¿â
$ git svn dcommit
# ÀȡзÖÖ§£¬²¢Ìá½»µ½Ô¶³Ì²Ö¿â
$ svn copy [remote_branch] [new_remote_branch]
-m [message]
# ´´½¨Ô¶³Ì·ÖÖ§¶ÔÓ¦µÄ±¾µØ·ÖÖ§
$ git checkout -b [local_branch] [remote_branch] |
ËÄ¡¢³õʼ»¯
´Ó±¾½Ú¿ªÊ¼£¬³ýÌØÊâ˵Ã÷£¬ÒÔÏÂÃüÁî¾ùÊÊÓÃÓÚ Git Óë Git-SVN¡£
# ÔÚµ±Ç°Ä¿Â¼Ð½¨Ò»¸öGit´úÂë¿â
$ git init
# ÏÂÔØÒ»¸öÏîÄ¿ºÍËüµÄÕû¸ö´úÂëÀúÊ· [Git only]
$ git clone [url] |
Îå¡¢ÅäÖÃ
# ÁоÙËùÓÐÅäÖÃ
$ git config -l
# ΪÃüÁîÅäÖñðÃû
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.br branch
# ÉèÖÃÌá½»´úÂëʱµÄÓû§ÐÅÏ¢
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email
address]" |
Git Óû§µÄÅäÖÃÎļþλÓÚ ~/.gitconfig
Git µ¥¸ö²Ö¿âµÄÅäÖÃÎļþλÓÚ ~/$PROJECT_PATH/.git/config
Áù¡¢ÔöɾÎļþ
# Ìí¼Óµ±Ç°Ä¿Â¼µÄËùÓÐÎļþµ½ÔÝ´æÇø
$ git add .
# Ìí¼ÓÖ¸¶¨Îļþµ½ÔÝ´æÇø
$ git add <file1> <file2> ...
# Ìí¼ÓÖ¸¶¨Ä¿Â¼µ½ÔÝ´æÇø£¬°üÀ¨Æä×ÓĿ¼
$ git add <dir>
# ɾ³ý¹¤×÷ÇøÎļþ£¬²¢ÇÒ½«Õâ´Îɾ³ý·ÅÈëÔÝ´æÇø
$ git rm [file1] [file2] ...
# Í£Ö¹×·×ÙÖ¸¶¨Îļþ£¬µ«¸ÃÎļþ»á±£ÁôÔÚ¹¤×÷Çø
$ git rm --cached [file]
# ¸ÄÃûÎļþ£¬²¢ÇÒ½«Õâ¸ö¸ÄÃû·ÅÈëÔÝ´æÇø
$ git mv [file-original] [file-renamed] |
°ÑÎļþÃû file1 Ìí¼Óµ½ .gitignore ÎļþÀGit »áÍ£Ö¹¸ú×Ù file1 µÄ״̬¡£
Æß¡¢·ÖÖ§
# ÁгöËùÓб¾µØ·ÖÖ§
$ git branch
# ÁгöËùÓб¾µØ·ÖÖ§ºÍÔ¶³Ì·ÖÖ§
$ git branch -a
# н¨Ò»¸ö·ÖÖ§£¬µ«ÒÀȻͣÁôÔÚµ±Ç°·ÖÖ§
$ git branch [branch-name]
# н¨Ò»¸ö·ÖÖ§£¬²¢Çл»µ½¸Ã·ÖÖ§
$ git checkout -b [new_branch] [remote-branch]
# Çл»µ½Ö¸¶¨·ÖÖ§£¬²¢¸üй¤×÷Çø
$ git checkout [branch-name]
# ºÏ²¢Ö¸¶¨·ÖÖ§µ½µ±Ç°·ÖÖ§
$ git merge [branch]
# Ñ¡ÔñÒ»¸ö commit£¬ºÏ²¢½øµ±Ç°·ÖÖ§
$ git cherry-pick [commit]
# ɾ³ý±¾µØ·ÖÖ§£¬-D ²ÎÊýÇ¿ÖÆÉ¾³ý·ÖÖ§
$ git branch -d [branch-name]
# ɾ³ýÔ¶³Ì·ÖÖ§
$ git push [remote] :[remote-branch] |
°Ë¡¢Ìá½»
# Ìá½»ÔÝ´æÇøµ½²Ö¿âÇø
$ git commit -m [message]
# Ìá½»¹¤×÷ÇøÓëÔÝ´æÇøµÄ±ä»¯Ö±½Óµ½²Ö¿âÇø
$ git commit -a
# ÌύʱÏÔʾËùÓÐ diff ÐÅÏ¢
$ git commit -v
# Ìá½»ÔÝ´æÇøÐ޸ĵ½²Ö¿âÇø£¬ºÏ²¢µ½ÉÏ´ÎÐ޸쬲¢ÐÞ¸ÄÉϴεÄÌá½»ÐÅÏ¢
$ git commit --amend -m [message]
# ÉÏ´«±¾µØÖ¸¶¨·ÖÖ§µ½Ô¶³Ì²Ö¿â
$ git push [remote] [remote-branch] |
¾Å¡¢ÀÈ¡
# ÏÂÔØÔ¶³Ì²Ö¿âµÄËùÓб䶯
(Git only)
$ git fetch [remote]
# ÏÔʾËùÓÐÔ¶³Ì²Ö¿â (Git only)
$ git remote -v
# ÏÔʾij¸öÔ¶³Ì²Ö¿âµÄÐÅÏ¢ (Git only)
$ git remote show [remote]
# Ôö¼ÓÒ»¸öеÄÔ¶³Ì²Ö¿â£¬²¢ÃüÃû (Git only)
$ git remote add [remote-name] [url]
# È¡»ØÔ¶³Ì²Ö¿âµÄ±ä»¯£¬²¢Óë±¾µØ·ÖÖ§ºÏ²¢£¬(Git only), ÈôʹÓà Git-SVN£¬Çë²é¿´µÚÈý½Ú
$ git pull [remote] [branch]
# È¡»ØÔ¶³Ì²Ö¿âµÄ±ä»¯£¬²¢Óë±¾µØ·ÖÖ§±ä»ùºÏ²¢£¬(Git only), ÈôʹÓà Git-SVN£¬Çë²é¿´µÚÈý½Ú
$ git pull --rebase [remote] [branch] |
Ê®¡¢³·Ïú
# »Ö¸´ÔÝ´æÇøµÄÖ¸¶¨Îļþµ½¹¤×÷Çø
$ git checkout [file]
# »Ö¸´ÔÝ´æÇøµ±Ç°Ä¿Â¼µÄËùÓÐÎļþµ½¹¤×÷Çø
$ git checkout .
# »Ö¸´¹¤×÷Çøµ½Ö¸¶¨ commit
$ git checkout [commit]
# ÖØÖÃÔÝ´æÇøµÄÖ¸¶¨Îļþ£¬ÓëÉÏÒ»´Î commit ±£³ÖÒ»Ö£¬µ«¹¤×÷Çø²»±ä
$ git reset [file]
# ÖØÖÃÔÝ´æÇøÓ빤×÷Çø£¬ÓëÉÏÒ»´Î commit ±£³ÖÒ»ÖÂ
$ git reset --hard
# ÖØÖõ±Ç°·ÖÖ§µÄÖ¸ÕëΪָ¶¨ commit£¬Í¬Ê±ÖØÖÃÔÝ´æÇø£¬µ«¹¤×÷Çø²»±ä
$ git reset [commit]
# ÖØÖõ±Ç°·ÖÖ§µÄHEADΪָ¶¨ commit£¬Í¬Ê±ÖØÖÃÔÝ´æÇøºÍ¹¤×÷Çø£¬ÓëÖ¸¶¨ commit
Ò»ÖÂ
$ git reset --hard [commit]
# н¨Ò»¸ö commit£¬ÓÃÓÚ³·ÏúÖ¸¶¨ commit
$ git revert [commit]
# ½«Î´Ìá½»µÄ±ä»¯·ÅÔÚ´¢²ØÇø
$ git stash
# ½«´¢²ØÇøµÄÄÚÈݻָ´µ½µ±Ç°¹¤×÷Çø
$ git stash pop |
ʮһ¡¢²éѯ
# ²é¿´¹¤×÷ÇøÎļþÐÞ¸Ä״̬
$ git status
# ²é¿´¹¤×÷ÇøÎļþÐ޸ľßÌåÄÚÈÝ
$ git diff [file]
# ²é¿´ÔÝ´æÇøÎļþÐÞ¸ÄÄÚÈÝ
$ git diff --cached [file]
# ²é¿´°æ±¾¿âÐ޸ļǼ
$ git log
# ²é¿´Ä³ÈËÌá½»¼Ç¼
$ git log --author=someone
# ²é¿´Ä³¸öÎļþµÄÀúÊ·¾ßÌåÐÞ¸ÄÄÚÈÝ
$ git log -p [file]
# ²é¿´Ä³´ÎÌá½»¾ßÌåÐÞ¸ÄÄÚÈÝ
$ git show [commit] |
Ê®¶þ¡¢ÆäËû
дÔÚºóÃæ
´Ó SVN µ½ Git£¬³ý±¾ÎÄÁоٵĻù´¡¸ÅÄîºÍ³£ÓÃÃüÁ°üÀ¨µ«²»ÏÞÓÚÈçºÎ´Ó
SVN ·þÎñÆ÷Çл»µ½ Git ·þÎñÆ÷£¬·ÖÖ§Ä£Ð͹ÜÀíµÈÒ²·Ç³£ÖØÒª¡£
|