Git是目前世界上最先进的分布式版本控制系统。
创始人:Linus Torvalds林纳斯·托瓦兹
经典的集中管理型(CVS、VSS、SVN)
版本管理系统:
1、版本管理的服务器一旦崩溃,硬盘损坏,代码如何恢复?
2、程序员上传到服务器的代码要求是完整版本,但是程序员开发过程中想做小版本的管理,以便追溯查询,怎么破?
3、系统正在上线运行,时不时还要修改bug,要增加好几个功能要几个月,如何管理几个版本?
4、如何管理一个分布在世界各地、互不相识的大型开发团队?
1、命令行工具:Git for windows
Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。
C:\Users\admin路径下的.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 "[email protected]" ##全局是每个项目都是这个名; 非全局是针对这个项目,优先使用本地再全局;
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
add4b426ac0306b408e1c6b6c1e09f3188387a9e create
ce667fbd41f4f51b2810a816e238afcaddec8be1 create
0b2ee35565d8eb7943100ca5db507e99a3e6d2e4 create 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
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git log --pretty=oneline
add4b426ac0306b408e1c6b6c1e09f3188387a9e create
ce667fbd41f4f51b2810a816e238afcaddec8be1 create
0b2ee35565d8eb7943100ca5db507e99a3e6d2e4 create
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git reset --hard HEAD~
HEAD is now at ce667fb create 6) 版本穿越:
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git reflog ##查看历史记录的版本号,
add4b42 HEAD@{}: reset: moving to HEAD^
7595ce3 HEAD@{}: commit: update
add4b42 HEAD@{}: commit: create
ce667fb HEAD@{}: commit: create
0b2ee35 HEAD@{}: commit (initial): create Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git reset --hard 7595ce3 ##回到这个版本号的状态;
HEAD is now at 7595ce3 update 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
file changed, deletion(-)
delete mode src/pom.xml Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git log --pretty=oneline
00e4cff3cbc3d722bcd997caf25edb424286b687 fix bug ##版本记录就是为了留痕;完全删除了删不了的;
ce667fbd41f4f51b2810a816e238afcaddec8be1 create
0b2ee35565d8eb7943100ca5db507e99a3e6d2e4 create
工作区 + 暂缓区 + 本地库
工作区(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.
file changed, insertion(+)
create mode 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 | +
file changed, insertion(+)
create mode 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
file changed, 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': @qq.com
Counting objects: , done.
Delta compression using up to threads.
Compressing objects: % (/), done.
Writing objects: % (/), 1.70 KiB | bytes/s, done.
Total (delta ), reused (delta )
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
file changed, insertion(+) Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
$ git push origin master
Username for 'https://github.com': [email protected]
Counting objects: , done.
kris-2018用户再pull更新下数据
Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git pull origin master
remote: Enumerating objects: , done.
remote: Counting objects: % (/), done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
Unpacking objects: % (/), 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 | ++--
file changed, insertions(+), 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
file changed, insertion(+) Administrator@PC201803221826 MINGW64 /e/git-space (master)
$ git push origin master
Username for 'https://github.com': @qq.com
Counting objects: , done.
Delta compression using up to threads.
Compressing objects: % (/), done.
Writing objects: % (/), bytes | bytes/s, done.
Total (delta ), reused (delta )
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
file changed, insertion(+) Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
$ git push origin master
Username for 'https://github.com': [email protected]
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: , done.
remote: Counting objects: % (/), done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
Unpacking objects: % (/), 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': [email protected]
Counting objects: , done.
Delta compression using up to threads.
Compressing objects: % (/), done.
Writing objects: % (/), bytes | bytes/s, done.
Total (delta ), reused (delta )
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: , done.
remote: Counting objects: % (/), done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
Unpacking objects: % (/), 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 | +
file changed, 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下来:
或者