Git是目前世界上最先进的分布式版本控制系统。
创始人:Linus Torvalds林纳斯·托瓦兹
经典的集中管理型(CVS、VSS、SVN)
版本管理系统:
1、版本管理的服务器一旦崩溃,硬盘损坏,代码如何恢复?
2、程序员上传到服务器的代码要求是完整版本,但是程序员开发过程中想做小版本的管理,以便追溯查询,怎么破?
3、系统正在上线运行,时不时还要修改bug,要增加好几个功能要几个月,如何管理几个版本?
4、如何管理一个分布在世界各地、互不相识的大型开发团队?
1、命令行工具:Git for windows
Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。
C:Usersadmin路径下的.gitconfig文件里面可以看到
--global 表示全局属性,所有的git项目都会共用属性
1)填写用户名和邮箱
Administrator@PC201803221826 MINGW64 /e/git-space $ git config --global user.name "kris" Administrator@PC201803221826 MINGW64 /e/git-space $ git config --global user.email "kris073@aliyun.com" ##全局是每个项目都是这个名; 非全局是针对这个项目,优先使用本地再全局;
2)创建版本库 Administrator@PC201803221826 MINGW64 /e/git-space $ git init //在项目文件夹内执行; Initialized empty Git repository in E:/git-space/.git/
3)提交文件 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git status //查看文件状态; On branch master Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) src/ ##被追踪状态,红色; nothing added to commit but untracked files present (use "git add" to track)
Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git add src/abc.java ①##加入暂存区 warning: LF will be replaced by CRLF in src/abc.java. The file will have its original line endings in your working directory. $ git commit #②把暂存区的提交到本地库;命名为:即直接带注释提交:git commit -m "create01" $ vim src/abc.java 把文件修改后,它的状态还是红色 $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: src/abc.java Untracked files: (use "git add <file>..." to include in what will be committed) src/main/ src/pom.xml no changes added to commit (use "git add" and/or "git commit -a") $ git add src/pom.xml $ git add src/abc.java $ git commit -m "create 02"
4)查看文件提交记录 git log 文件名 $ git log --pretty=oneline 7595ce37bf951f64fc838feb78eed3ddc2da24b1 update 04 add4b426ac0306b408e1c6b6c1e09f3188387a9e create 03 ce667fbd41f4f51b2810a816e238afcaddec8be1 create 02 0b2ee35565d8eb7943100ca5db507e99a3e6d2e4 create 01 5)回退历史: git reset --hard HEAD^ 回退到上一次提交 git reset --hard HEAD~n 回退n次操作 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git reset --hard HEAD^ HEAD is now at add4b42 create 03 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git log --pretty=oneline add4b426ac0306b408e1c6b6c1e09f3188387a9e create 03 ce667fbd41f4f51b2810a816e238afcaddec8be1 create 02 0b2ee35565d8eb7943100ca5db507e99a3e6d2e4 create 01 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git reset --hard HEAD~2 HEAD is now at ce667fb create 02 6) 版本穿越: Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git reflog ##查看历史记录的版本号, add4b42 HEAD@{0}: reset: moving to HEAD^ 7595ce3 HEAD@{1}: commit: update 04 add4b42 HEAD@{2}: commit: create 03 ce667fb HEAD@{3}: commit: create 02 0b2ee35 HEAD@{4}: commit (initial): create 01 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git reset --hard 7595ce3 ##回到这个版本号的状态; HEAD is now at 7595ce3 update 04 7) 还原文件: Administrator@PC201803221826 MINGW64 /e/git-space (master) $ vim src/pom.xml ##改错了,想回到之前的状态;只还原一个文件 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git checkout -- src/pom.xml Administrator@PC201803221826 MINGW64 /e/git-space (master) $ vim src/pom.xml 8) 删除某个文件 先删除文件 #把本地文件删了,但它服务器上还有 再git add 再提交 $ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: src/pom.xml ##红色,删除了也是有变化 no changes added to commit (use "git add" and/or "git commit -a") $ git add src/pom.xml Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git commit Aborting commit due to empty commit message. Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git commit -m "fix bug" [master 00e4cff] fix bug 1 file changed, 1 deletion(-) delete mode 100644 src/pom.xml Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git log --pretty=oneline 00e4cff3cbc3d722bcd997caf25edb424286b687 fix bug ##版本记录就是为了留痕;完全删除了删不了的; ce667fbd41f4f51b2810a816e238afcaddec8be1 create 02 0b2ee35565d8eb7943100ca5db507e99a3e6d2e4 create 01
工作区 + 暂缓区 + 本地库
工作区(Working Directory):就是你电脑本地硬盘目录
本地库(Repository):工作区有个隐藏目录.git,它就是Git的本地版本库
暂存区(stage):一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
2. Git的实战操练---分支
分支: 系统上线了,但是产品经理又提了新的需求,评估一下工期要两个月,但是同时系统正在上线运行,时不时还要修改bug,如何管理几个版本? 两段代码的功能上线时间是不同的,就用到分支了,拆开;分支之间互相独立不影响;
1)创建分支 git branch 分支名
master分支: Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git branch -v //查看分支 * master 00e4cff fix bug 创建名为dev的分支 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git branch dev Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git branch -v dev 00e4cff fix bug * master 00e4cff fix bug
2)切换分支 git checkout 分支名 //只是切换; git checkout -b 分支名 //创建并且切换 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git checkout dev Switched to branch 'dev' Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ vim newfunc.java Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ git add newfunc.java warning: LF will be replaced by CRLF in newfunc.java. The file will have its original line endings in your working directory. Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ git commit -m "newfunc" [dev 0830a63] newfunc warning: LF will be replaced by CRLF in newfunc.java. The file will have its original line endings in your working directory. 1 file changed, 1 insertion(+) create mode 100644 newfunc.java Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ git branch -v * dev 0830a63 newfunc ##在这个分支上创建并提交,就往前推动了一步; master 00e4cff fix bug
3)合并分支 先切换到主干,git checkout master //再合并git merge 分支名
Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ git checkout master Switched to branch 'master' Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git checkout dev ##这样子来回切一遍,newfunc.java就出来了;虽然在分支上,但最终还是要回到主干上;切换到分支它才会出现;切到master就不见了; Switched to branch 'dev' 把分支合并,拽取/吸收,站在没有功能的那个分支 $ git branch -v dev 0830a63 newfunc * master 00e4cff fix bug Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git merge dev Updating 00e4cff..0830a63 Fast-forward newfunc.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 newfunc.java Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git branch -v dev 0830a63 newfunc * master 0830a63 newfunc
冲突:大家都改同一份代码
冲突一般指同一个文件同一位置的代码,在两种版本合并时版本管理软件无法判断到底应该保留哪个版本,因此会提示该文件发生冲突,需要程序员来手工判断解决冲突。
合并时冲突:
程序合并时发生冲突系统会提示CONFLICT关键字,命令行后缀会进入MERGING状态,表示此时是解决冲突的状态。
解决冲突:
此时通过git diff 可以找到发生冲突的文件及冲突的内容。然后修改冲突文件的内容,再次git add <file> 和git commit 提交后,后缀MERGING消失,说明冲突解决完成。
①合并merge时产生的冲突;
////master主分支修改newfunc.java文件
$ vim newfunc.java Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git add newfunc.java $ git commit -m "mm" [master 4b2a4d7] mm 1 file changed, 1 insertion(+) $ git branch -v dev 0830a63 newfunc * master 4b2a4d7 mm
////////dev分支也修改同样的文件!!! $ git checkout dev Switched to branch 'dev' Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ vim newfunc.java Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ git add newfunc.java $ git commit -m "dd" $ git branch -v * dev 34671bc dd master 4b2a4d7 mm Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ git checkout master Switched to branch 'master' Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git branch -v dev 34671bc dd * master 4b2a4d7 mm Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git merge dev ##master和分支都修改同一个文件,master在合并分支时就会出现错误: Auto-merging newfunc.java CONFLICT (content): Merge conflict in newfunc.java Automatic merge failed; fix conflicts and then commit the result. Administrator@PC201803221826 MINGW64 /e/git-space (master|MERGING) #正在合并中 解决:编辑文件,可以把标签删了(可以选择要哪个改动的),然后重新提交 Administrator@PC201803221826 MINGW64 /e/git-space (master|MERGING) $ vim newfunc.java ggggggggggg <<<<<<< HEAD 删 mmmmmmmmmmm ======= 删 HHHHHHHHHHH >>>>>>> dev 删 Administrator@PC201803221826 MINGW64 /e/git-space (master|MERGING) $ git add newfunc.java Administrator@PC201803221826 MINGW64 /e/git-space (master|MERGING) $ git commit -m "mmdd" [master f33fb98] mmdd Administrator@PC201803221826 MINGW64 /e/git-space (master) ##在不同分支newfunc.java的数据内容是不一样的; $ git branch -v dev 34671bc dd * master f33fb98 mmdd
3. GitHub介绍与实操
GitHub是一个Git项目托管网站,主要提供基于Git的版本托管服务
https://github.com/kris-2018/Test.git起别名是放在conf里边的 1) 增加远程地址
git remote add <远端代号> <远端地址> 。
<远端代号> 是指远程链接的代号,一般直接用origin作代号,也可以自定义。
<远端地址> 默认远程链接的url
Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git remote add origin https://github.com/kris-2018/Test.git
2)推送到远程库
git push <远端代号> <本地分支名称>。
<远端代号> 是指远程链接的代号。
<分支名称> 是指要提交的分支名字,比如master。
例: git push origin master
Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git push origin master Username for 'https://github.com': 2030323705@qq.com Counting objects: 24, done. Delta compression using up to 8 threads. Compressing objects: 100% (12/12), done. Writing objects: 100% (24/24), 1.70 KiB | 0 bytes/s, done. Total 24 (delta 0), reused 0 (delta 0) To https://github.com/kris-2018/Test.git * [new branch] master -> master
3) 从GitHub上克隆一个项目
git clone <远端地址> <新项目目录名>。
<远端地址> 是指远程链接的地址。
<项目目录名> 是指为克隆的项目在本地新建的目录名称,可以不填,默认是GitHub的项目名。
命令执行完后,会自动为这个远端地址建一个名为origin的代号。
例 git clone https://github.com/user111/Helloworld.git hello_world
Administrator@PC201803221826 MINGW64 /e/git-Hei $ git clone https://github.com/kris-2018/Test.git Test Cloning into 'Test'...
4) 从GitHub更新项目
git pull <远端代号> <远端分支名>。
<远端代号> 是指远程链接的代号。
<远端分支名>是指远端的分支名称,如master。
例 git pull origin master
需要添加Collaborators合作者
在项目中点击settings页签,然后点击Collaborators,然后在文本框中搜索合作伙伴的邮箱或者账号。点击添加。
添加后GitHub会给合作伙伴对应的邮箱发一封,邀请邮件。
合作伙伴会收到邀请邮件。点击View invitation 按钮后会跳转至GitHub页面,让合作伙伴选择,是否接受邀请。
点击接受后,则合伙伙伴正式加入项目,获得直接提交代码的权限。
remote: Permission to kris-2018/Test.git denied to kris073.
kris18用户: Collaborators: Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master) $ vim src/abc.java ##对数据进行修改 Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master) $ git add src/abc.java Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master) $ git commit -m "a" ##提交 [master ccbf98d] a 1 file changed, 1 insertion(+) Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master) $ git push origin master Username for 'https://github.com': kris18@aliyun.com Counting objects: 4, done.
kris-2018用户再pull更新下数据
Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git pull origin master remote: Enumerating objects: 15, done. remote: Counting objects: 100% (15/15), done. remote: Compressing objects: 100% (6/6), done. remote: Total 12 (delta 0), reused 12 (delta 0), pack-reused 0 Unpacking objects: 100% (12/12), done. From https://github.com/kris-2018/Test * branch master -> FETCH_HEAD f33fb98..36cee76 master -> origin/master Updating f33fb98..36cee76 Fast-forward src/abc.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) Administrator@PC201803221826 MINGW64 /e/git-space (master) $ vim src/abc.java ##数据已经发生更新;
协作冲突
冲突:两个人之间
在上传或同步代码时,由于你和他人都改了同一文件的同一位置的代码,版本管理软件无法判断究竟以谁为准,就会报告冲突,需要程序员手工解决。
① 一种是做下权限,加到项目组; ② 审查机制;
在第三方中点Fork
解决冲突,三板斧:
1、修改合并
2、git add
3、git commit
Administrator@PC201803221826 MINGW64 /e/git-space (master) $ vim src/abc.java Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git add src/abc.java Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git commit -m "ccc" [master 824de95] ccc 1 file changed, 1 insertion(+) Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git push origin master Username for 'https://github.com': 2030323705@qq.com Counting objects: 4, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (4/4), 318 bytes | 0 bytes/s, done. Total 4 (delta 0), reused 0 (delta 0) To https://github.com/kris-2018/Test.git 36cee76..824de95 master -> master ################################## $ vim src/abc.java ##修改 Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master) $ git add src/abc.java Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master) $ git commit -m "dd" [master 10b7713] dd 1 file changed, 1 insertion(+) Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master) $ git push origin master Username for 'https://github.com': kris18@aliyun.com To https://github.com/kris-2018/Test.git ! [rejected] master -> master (fetch first) error: failed to push some refs to 'https://github.com/kris-2018/Test.git' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.
$ git pull origin master ##两个人修改不同地方有可能不会报错,修改同一个地方肯定会报错的 remote: Enumerating objects: 7, done. remote: Counting objects: 100% (7/7), done. remote: Compressing objects: 100% (2/2), done. remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0 Unpacking objects: 100% (4/4), done. From https://github.com/kris-2018/Test * branch master -> FETCH_HEAD 36cee76..824de95 master -> origin/master Auto-merging src/abc.java CONFLICT (content): Merge conflict in src/abc.java Automatic merge failed; fix conflicts and then commit the result. 解决办法: $ vim src/abc.java aaaaaaaaaaa bbbbbbbbbb <<<<<<< HEAD dddddddddddddddd ======= ccccccccccccccccc >>>>>>> 824de9578a98395bb4623035ddaa0231322c5d6a Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master|MERGING) $ vim src/abc.java Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master|MERGING) $ git add src/abc.java Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master|MERGING) $ git commit -m "bbcc" [master eff7cbb] bbcc Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master) $ git push origin master Username for 'https://github.com': kris18@aliyun.com Counting objects: 8, done. Delta compression using up to 8 threads. Compressing objects: 100% (5/5), done. Writing objects: 100% (8/8), 644 bytes | 0 bytes/s, done. Total 8 (delta 0), reused 0 (delta 0) To https://github.com/kris-2018/Test.git 824de95..eff7cbb master -> master
kris-2018本地仓库再pull更新下:
Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git pull origin master remote: Enumerating objects: 14, done. remote: Counting objects: 100% (14/14), done. remote: Compressing objects: 100% (5/5), done. remote: Total 8 (delta 0), reused 8 (delta 0), pack-reused 0 Unpacking objects: 100% (8/8), done. From https://github.com/kris-2018/Test * branch master -> FETCH_HEAD 824de95..eff7cbb master -> origin/master Updating 824de95..eff7cbb Fast-forward src/abc.java | 1 + 1 file changed, 1 insertion(+)
4. 在idea中使用Git
配置下Git地址:
把idea中项目提交到GitHub
使用在远端建立仓库:
出现弹框:填写仓库名和描述;
选择项目中要提交的:只提交源码的,.idea是你本地工程文件不要提交,.iml随意可提交也可不提交;
提交src下的java源码工程、pom文件;
如果弹窗出现Add File to Git:它会去检查你工程文件看看那个没提交,不能提交.dea你的工程文件,直接把它Remenber,don‘t ask again; 点击NO
蓝色就是有改动过但还没提交;红色是还没有提交的文件; 绿色表已放在了暂缓区;
红色:
把刚刚放在暂缓区的文件提交了: 先提交到本地( 下面截图即是提交到本地 ); 再push
把别人的代码down下来:
或者