Uninote
Uninote
用户根目录
每日点滴

<!DOCTYPE html> <html><head><meta http-equiv='Content-Type' content='text/html; charset=utf8'><title>git</title> <script> var g_resRoot = '../../../__res/'; var g_json_outline = '{"children":[{"children":[],"level":1,"lvNumber":"1","text":"参考资料"},{"children":[],"level":1,"lvNumber":"2","text":"try git"},{"children":[],"level":1,"lvNumber":"3","text":"基础练习"},{"children":[{"children":[],"level":2,"lvNumber":"4.1","text":"beyond comparer"}],"level":1,"lvNumber":"4","text":"工具安装"},{"children":[{"children":[],"level":2,"lvNumber":"5.1","text":"制造冲突"}],"level":1,"lvNumber":"5","text":"冲突"},{"children":[],"level":1,"lvNumber":"6","text":"git 培训"},{"children":[],"level":1,"lvNumber":"7","text":"git pull auto rebase"}],"level":0,"lvNumber":"","text":"git"}'; </script> <link rel='stylesheet' type='text/css' href='../../../__res/common.css'><style>.s0{color:#000000;} .s1{color:#0000ff;} .s2{color:#000000;} .s3{color:#0000ff;} .s4{color:#c80000;} .s5{color:#000000;} .s6{color:#0000ff;} .s7{color:#c80000;} </style> </head><body> <script src='../../../__res/util.js'></script><div id='outline'> <li><a href='#ol_0' style='font-weight:bold; font-size:22px'>git</a></li> <li> <a href='#ol_1' >参考资料</a></li> <li> <a href='#ol_2' >try git</a></li> <li> <a href='#ol_3' >基础练习</a></li> <li> <a href='#ol_4' >工具安装</a></li> <li> <a href='#ol_5' >beyond comparer</a></li> <li> <a href='#ol_6' >冲突</a></li> <li> <a href='#ol_7' >制造冲突</a></li> <li> <a href='#ol_8' >git 培训</a></li> <li> <a href='#ol_9' >git pull auto rebase</a></li> </div>

<pre id='ol_0' class='title'>git</pre> <pre><d class='s0'></d></pre> <h1 id='ol_1'>参考资料</h1> <pre><d class='s0'>参考网站:</d></pre> <pre><d class='s1'><a href='https://www.kernel.org/pub/software/scm/git/docs/'>https://www.kernel.org/pub/software/scm/git/docs/</a></d></pre> <pre><d class='s1'><a href='http://git-scm.com'>http://git-scm.com</a></d><d class='s0'></d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'>自带文档,在命令行输入git help <cmd>,比如想了解merge,输入:</d></pre> <pre><d class='s0'>git help merge</d></pre> <pre><d class='s0'></d></pre> <h1 id='ol_2'>try git</h1> <pre><d class='s2'>光说不练是永远也掌握不好git的。而git的最强大之处在于协同开发的支持。其实我们完全不需要任何git服务器就能模拟一个服务器+两个用户协同开发的情景。找一个测试目录,建立以一个空文件夹server,再进入server,执行命令:git init --bare,这样就建立了一个本地的服务器,目录结构如下:</d></pre> <pre><d class='s2'><img src='....\pic\798cff0fd9ab678a233ac814842618f4.jpg' /></d><d class='s2'></d></pre> <pre><d class='s2'></d></pre> <pre><d class='s2'>返回server所在目录(try_git),分别clone两个仓库出来:</d></pre> <pre><d class='s2'><img src='....\pic\1db0fb8d278dfd8816dd819eeb635fae.jpg' /></d><d class='s2'></d></pre> <pre><d class='s2'>注意,两处红圈换成自己的目录。</d></pre> <pre><d class='s2'></d></pre> <pre><d class='s2'>这样就形成了下面的结构,u1,u2用来模拟两个用户:</d></pre> <pre><d class='s2'><img src='....\pic\58d6dda4101fcb9ea6f166509830d179.jpg' /></d><d class='s2'></d></pre> <pre><d class='s0'>分别为两个仓库设置两个username,否则在log中看到的都是全局配置的username:</d></pre> <pre><d class='s0'>在u1下执行:</d></pre> <pre><d class='s0'>git config --local user.name u1</d></pre> <pre><d class='s0'>在u2下执行:</d></pre> <pre><d class='s0'>git config --local user.name u2</d></pre> <pre><d class='s2'></d></pre> <pre><d class='s2'>练习git,最好不要在生产项目中练,一来很多权限你可能不具备,试不出效果来;二来不一小心,还可能造成很严重的后果。。</d></pre> <pre><d class='s2'></d></pre> <pre><d class='s2'></d></pre> <pre><d class='s2'></d></pre> <t id='6d7871e6-47cc-4088-b5d9-c77e4142f3f5'> <pre class='tnd_head'>lv1= lv2= type=</pre> <h1 id='ol_3'>基础练习</h1> <pre><d class='s2'>现在,我们可以在u1、u2中练习一下基本操作了,如:</d></pre> <pre><d class='s2'>本地操作:</d></pre> <pre><d class='s2'>commit add checkoout branch reset merge/rebase log diff</d></pre> <pre><d class='s2'>远端操作:</d></pre> <pre><d class='s2'>pull fetch push remote</d></pre> </t> <pre><d class='s2'></d></pre> <h1 id='ol_4'>工具安装</h1> <pre><d class='s2'>git</d></pre> <pre><d class='s2'>TortoiseGit</d></pre> <pre><d class='s2'>beyond comparer(后面简称bc)</d></pre> <pre><d class='s2'></d></pre> <t id='fcd334e2-7100-49e0-8ec7-c30c6574b29c'> <pre class='tnd_head'>lv1= lv2= type=</pre> <h2 id='ol_5'>beyond comparer</h2> <pre><d class='s2'>乌龟自带的比较、冲突软件不是很好用。推荐beyond comparer。先设置比较(Diff Viewer):</d><d class='s3'></d></pre> <pre><d class='s3'><img src='....\pic\d70d153f1b2d011d3d02b5f7de532b83.jpg' /></d><d class='s3'></d></pre> <pre><d class='s3'></d></pre> <pre><d class='s0'>再设置合并工具(Merge Tool):如我的设置为:C:\Program Files (x86)\Beyond Compare\BCompare.exe %mine %theirs %base %merged。注意根据自己的安装路径修改。</d></pre> <pre><d class='s3'></d></pre> <pre><d class='s3'><img src='....\pic\c4c4e47fd1b468dbb2ee119519e1a2aa.jpg' /></d><d class='s3'></d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'></d></pre> </t> <pre><d class='s2'></d></pre> <h1 id='ol_6'>冲突</h1> <pre><d class='s2'>并行开发必然会遇到冲突,项目越大,冲突越多,越难解决。有些人一看到冲突就发憷,是因为他还不懂得如何使用一些工具。</d></pre> <pre><d class='s2'></d></pre> <h2 id='ol_7'>制造冲突</h2> <pre><d class='s2'>要学会如何处理冲突,我们得先能制造冲突。就像做安全防御,你不懂进攻,如何防守呢?</d></pre> <pre><d class='s2'></d></pre> <pre><d class='s2'>制造冲突很简单:两个用户,同时针对同一个文件的一个地方进行修改。比如u1进行了如下修改,并commit、push到server:</d></pre> <pre><d class='s2'><img src='....\pic\cee7d28bbb6045b70e1d17aec53d9a6c.jpg' /></d><d class='s2'></d></pre> <pre><d class='s2'>在同时,u2进行了如下操作并commit:</d></pre> <pre><d class='s2'><img src='....\pic\40e102409da2e547f0839dda808ad863.jpg' /></d><d class='s2'></d></pre> <pre><d class='s2'>commit后尝试push到server会报错,此时需要先把server上的代码(u1的commmit)拉下来,合并后才能push。但合并时会报冲突:</d><d class='s3'></d></pre> <pre><d class='s3'><img src='....\pic\2eeaa3e3cf01b3a0ff769fc8730a3bcc.jpg' /></d><d class='s3'></d></pre> <pre><d class='s3'></d></pre> <pre><d class='s4'>到了这一步,就必须要借助工具才能很好的解决问题了(这个demo太简单,也许你可以手动解决,但真正的工程中,手动解决是极其低效,极容易出错的)。</d></pre> <pre><d class='s4'></d></pre> <pre><d class='s2'>点击resolve,打开冲突解决界面,所有红色的文件都是有冲突的(status为Conflict)。</d></pre> <pre><d class='s2'><img src='....\pic\5c2a7c6872849efc71e57543e23af290.jpg' /></d><d class='s3'></d></pre> <pre><d class='s2'></d></pre> <pre><d class='s2'>解决的办法是一个一个的鼠标双击,此时会启动bc的三方合并:</d></pre> <pre><d class='s2'><img src='....\pic\5ebf7a1aa793e59cd2312a70701043bd.jpg' /></d><d class='s3'></d></pre> <pre><d class='s2'></d></pre> <pre><d class='s2'>此时去冲突文件所在的目录查看,发现生成了三个文件:</d></pre> <pre><d class='s2'><img src='....\pic\c58efbc81a2311bbbb9b77f2aeb286d7.jpg' /></d><d class='s2'></d></pre> <pre><d class='s2'></d></pre> <pre><d class='s2'>这三个文件,就是bc用于冲突解决的重要依据,作为输入,并排在bc的上方,并且是只读的,在合并过程中无法编辑。</d></pre> <pre><d class='s2'><img src='....\pic\eac30a130e7b6a3861bc0726d87de6c0.jpg' /></d><d class='s2'></d></pre> <pre><d class='s3'></d></pre> <pre><d class='s2'>最下面的一个窗口是合并结果区,同时可以手动编辑。合并完成后,点击右边的保存图标(<img src='....\pic\8041aa40a90fbe95b460a640b41edb73.jpg' /></d><d class='s2'>),保存合并结果。</d></pre> <pre><d class='s2'></d></pre> <pre><d class='s2'>关闭bc,回到乌龟,在冲突文件上右键,选择Resolved(点击后BASE、LOCAL、REMOTE这些临时文件将被删除):</d></pre> <pre><d class='s2'><img src='....\pic\eb72505dcd79aa7ae1281aa6524d1d87.jpg' /></d><d class='s2'></d></pre> <pre><d class='s2'></d></pre> <pre><d class='s2'>此时文件恢复为正常颜色,status变成了modified,这个文件的冲突解决。</d></pre> <pre><d class='s2'><img src='....\pic\6cb5e0090df20b2d659a9f10fd5e3af9.jpg' /></d><d class='s2'></d></pre> <pre><d class='s2'></d></pre> <pre><d class='s2'>重复上述操作,直到所有文件冲突解决为止。</d></pre> <pre><d class='s2'></d></pre> <t id='f5b2a219-dd2d-4c3c-9adb-e6fe197c4172'> <pre class='tnd_head'>lv1= lv2= type=</pre> <h1 id='ol_8'>git 培训</h1> <pre><d class='s0'><a href='..\规范/规范.html#0304d579-c3c4-4e14-8b20-8ad6e5b91037'>git 规范 </a></d></pre> <pre><d class='s0'><a href='....\git/git 分享.html#149119fa-7f50-433c-b8c4-6c75726dbfa3'>git 分享 </a></d></pre> <pre><d class='s5'>git ignore</d></pre> <pre><d class='s5'>永存于历史记录,体积无法变小。</d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'>强推一定要通知所有的人员</d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'>两种操作:local & remote:fetch、pull、push;</d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'>local:编辑 & 形成历史(commits)</d></pre> <pre><d class='s0'>remote:交换commits</d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'>objects</d></pre> <pre><d class='s0'>file:///E:/ebook_decompile/TortoiseGit/Introductio.html</d></pre> <pre><d class='s0'>git cat-file -p <commit></d></pre> <pre><d class='s0'>tree:root tree就是一个版本</d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'>refs & objects</d></pre> <pre><d class='s3'></d></pre> <pre><d class='s0'><a href='....\git/git.html#a13bcba6-00b0-4780-a994-b75f4919aabf'>Reset Demystified </a></d></pre> <pre><d class='s0'>--hard --mixed --soft</d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'>merge</d></pre> <pre><d class='s0'>E:\xjc\yscx_xjc\web\Webadmin\Action\OrderAction.class.php</d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'>cherry-pick & rebase</d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'>3 way merge;冲突解决</d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'>upstream,origin merge</d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'>.gitignroe</d></pre> <pre><d class='s0'></d></pre> <pre><d class='s0'>help!!</d></pre> <pre><d class='s0'>git help *, eg: git help log</d></pre> <pre><d class='s0'><> & []</d></pre> <pre><d class='s3'></d></pre> <pre><d class='s0'>一个成功的Git分支模型</d><d class='s3'></d></pre> <pre><d class='s3'><img src='....\pic\e282687acae8f6702368d4e349123e0d.jpg' /></d><d class='s3'></d></pre> </t> <pre><d class='s6'></d></pre> <t id='95d2a614-1ee8-47df-8497-1087d5338e11'> <pre class='tnd_head'>lv1= lv2= type=</pre> <h1 id='ol_9'>git pull auto rebase</h1> <pre><d class='s6'></d></pre> <pre><d class='s7'>只有分支间的合并采用merge!其他时候都用rebase。git pull时要用rebase,不要merge!!</d></pre> <pre><d class='s5'></d></pre> <pre><d class='s5'>给git pull默认加上rebase功能</d></pre> <pre><d class='s5'><a href='https://blog.csdn.net/zzqhost/article/details/71307716'>https://blog.csdn.net/zzqhost/article/details/71307716</a></d></pre> <pre><d class='s2'>git config --global branch.autosetuprebase always</d></pre> <pre><d class='s4'>这样对于新建的分支都会设定上面的rebase=true了。已经创建好的分支还是需要手动配置的</d><d class='s2'>:</d><d class='s5'></d></pre> <pre><d class='s5'>git config branch.master.rebase true</d></pre> </t> <pre><d class='s2'></d></pre> </body></html>

编码规范

git_basic

点赞(0) 阅读(60) 举报
目录
标题