温馨提醒:本教程巨长,最好跟着做,单看不跟着练习操作容易睡着(新手来说)
一:上传项目到github
首先是git软件的安装,git 官网下载链接 ,然后是安装,全部下一步下一步就好了。这里就不赘述了
在idea上面配置好你的git,files->settings->Version Control->Git->Path to Git executable: 设置为安装git中所安装的git.exe
码接下来为github设置账号密码:files->settings->Version Control->GitHub->Create API Token
然后在github上面新建一个仓库
创建完成后如下
接下来我们用idea创建一个hellogit的Java project,如果不会,那么请自行百度用idea创建一个简单的Java Project
创建完成后,点击VCS--import into Verdion Control--Create Git Repository。
然后右击你的项目,找到git然后点击 +add 然后你会发现你的文件变绿色了,接下来就点击Commit Diretory
接下来就去github上面看看你的项目是不是已经上传了
二:接下来我们不依赖idea的git工具,我们用git命令的方式。
git安装好了之后,在c盘或者其他盘符创建一个文件夹,比如git
然后在git文件夹里面右击鼠标git bash here
好了接下来就是重点了。
三:初级应用
【1】下载项目
你的项目github上的下载地址图示
git clone https://github.com/JohnBarrowman65/hellogit.git(你的githubi项目https下载链接)
然后git 目录下就能看到你在github上的项目已经被下载下来了。
定位到hellogit文件夹右击git bash here
【2】查看日志
git log
查看到我们在上传项目的时候的提交日志,记住git log 后的第一行提示信息,有一个commit 后面一串字符串(SHA-1 校验和) 后面跟着括号,括号里面的HEAD ->master这些信息。。后面有讲到这些都是什么东西。
【3】在src目录下随便新建一个文件,比如新建一个gitcommit.java文件,然后查询
git status
status是用来查询当前工作目录的状态的,如图
“皇家“信息翻译:
(1)On branch master --说明你是在一个叫master 的branch(分支)上。我们新建项目的时候,默认都是有一条主线master(也叫主分支)的。
(2)Untracked files --未追踪的文件gitcommit.java,git还给你一个温馨提示git add
【4】添加入staging area 区
git add .
#如果是你删除了一个文件,用这个
git rm .
看清楚了后面有个点,enter后再git status看下,发现new file:xxx.java了,说明文件已经被记录进了 staging area(暂存区)
【5】提交
git commit -m ‘备注信息’
然后再git log一下,可以看到我们刚刚commit的记录信息
这个时候commit只是commit到我们本地的仓库,远程仓库你去看还是没有提交的。
这里涉及到git这个分布式中央仓库的理论基础知识,也是跟svn这些单中央仓库一个很大的不同的地方。git你clone项目的时候不仅是下载下远程仓库的东西,还会在你自己电脑本地创建一个本地仓库,你无需联网就可以自己写自己的东西,由于可以提交到本地,所以你可以分步提交代码,把代码提交做得更细,而不是一个提交包含很多代码,难以 review 也难以回溯。
【6】push到中央仓库
git push
【7】上面的情况是单单一个人的,然后一个项目往往都是好几个人一同操作的,所以我们本地模拟下你的同事
切换回git主目录再clone下一个项目并另起一个名字区别假装是你的同事。注意 不用怕冲突,因为git是以文件为区分管理的
git clone https://github.com/JohnBarrowman65/hellogit.git anotherhellogit(同事的文件名)
切换进入anotherhellogit文件夹,打开git bash here,接下来还是一顿简单的操作新增文件然后提交最后push
接下来就是你要下载下同事的文件下来了,切换回你的目录
git pull
然后你可以看到你的文件夹里面也已经有同事提交的东西了。
【8】push冲突了
(1)写完所有的commit后,不用考虑中央仓库是否有新的提交,直接push
(2)如果 push
失败,就用 pull
把本地仓库的提交和中央仓库的提交进行合并,然后再 push
一次
到此为止,这个工作模型已经是一个最简单的可用的工作模型了。这个工作模型已经可以让团队用来合作开发了。
------------------------------------------------------------分割线--------------------------------------------------------------------------
三:接下来探讨下我们前面留下的坑,HEAD->master,commit,等具体的实际意思
【9】HEAD当前commit的引用,你的一次更新改动commit到仓库后就算一次commit,每当有新的commit后,HEAD自动与其对应,commit本身有后面一串很长的SHA-1来标识。总之,当前commit在哪里,HEAD
就在哪里,这是一个永远自动指向当前commit的引用,所以你永远可以用HEAD来操作当前commit。
【10】branch分支,mseter也是一个分支,不过是指主分支,git上默认分支就是master
新建分支叫做branch1并切换到branch1的分支
git checkout -b branch1
注意master和branch1是平等的
删除分支,删除远程仓库分支
#删除分支
git branch -d branch1
#删除远程仓库分支
git origin -d branch1
【11】merge合并分支到主线上。
上面我们刚刚创建了一个branch1的分支,假如我们在这个分支里面新增了文件,还是一顿操作
然后再上传分支到git远程仓库上面
git push origin branch1
接下来注意先切换回master主线,这个时候最好git pull一下(这其实是pull操作的一种经典情形:本地的master没有新提交,而远端仓库中有同事提交了新内容到master),然后再合并分支branch1
git checkout master #切换到master主线
git pull #更新下
git merge branch1 #合并分支
最后就是git push上去就可以了,这个时候我们就可以在github上面看到我们刚刚新增的branch1分支中添加的东西了
【12】merge冲突
当你在合并分支的时候有可能回出现冲突,比如你在这个分支中修改了a,另一个分支中修改了b,那么合并后就是既改 A 也改 B,这个动作会自动完成;如果两个分支都改了同一个文件,但一个改的是第 1 行,另一个改的是第 2 行,那么合并后就是第 1 行和第 2 行都改,也是自动完成。但是你的两个分支改了相同的内容,Git 不知道应该以哪个为准,如果在merge的时候发生了这种情况,Git 就会把问题交给你来决定。那么你现在需要做两件事:解决掉冲突然后手动commit一下放弃解决冲突。
取消merge用的命令是git merge -abort
-------------------------------------------------------分割线--------------------------------------------------------------------------
接下来说下最常用的工作流模型,也是很多公司用的(听说)
这种工作流的核心内容可以总结为两点:
任何新的功能(feature)或 bug 修复全都新建一个 分支来写;分支写完后,合并到主线,然后删掉这个分支。
打个比方,对于hellogit这个项目,你需要完成里面的论坛功能,那么你就自己新建一个bbs的branch,写好后提交到中央仓库,给经理或者其他同事看下确认没问题了,你再最后确认合并到主线上。
【13】Feature Branching工作流
#创建分支
git checkout -b xxx
#提交东西
git add .
git commit -m xxx(提交备注说明)
#上传分支
git push origin xxx
#切换分支
git checkout master
#更新本地仓库跟中央仓库的master一致
git pull
#合并分支
git merge xxx
#提交到中央仓库
git push
#删除本地分支
git branch -d xxx
#删除远程仓库分支
git push origin -d xxx
这个时候可以通知你的同事或者上级查收下你的代码,我们切换到一开始创建的你的”同事“
git pull
git chekcout bbs
如图就是我上传的bbs功能,你同事那里也能看到了,确认没问题后,你就再合并分支然后上传到中央仓库
git merge bbs
git push
git branch -d bbs
git push origin -d bbs
这个时候可以上去看看github上面是不是已经存在bbs的功能代码了
同时为了不必要留下很多分支,建议你同时删除本地和中央仓库的bbs分支
用这种方案去工作还有个好处就是多任务的支持,很多时候你的任务时一起来的,你就可以同时建立多个分支,这个做完可以切换到另一个继续做。
-------------------------------------------------分割线-------------------------------------------------------------------------------
四:高级应用
【14】merge换成rebase的操作
#新建并切换到新增的分支
git checkout -b rebasebranch
#这里就写你的功能啦.......
#变基(衍合)
git rebase master
#在rebase之后,切回master再merge一下,把master移到最新的commit
#切换分支
git checkout master
#合并分支
git merge rebasebranch
如图:先新增了分支,然后提交到了中央仓库
然后使用rebase合并分支,最后push上到项目中。这样也能实现分支的合并
注意:一般不要从master向其他branch执行rebase操作
五:高级应用修改commit
先在本地对需要修改的文件进行修改
--git add xxx(修改了的文件名)
--git commit -amend
commit-amend是用在修改当前commit的,那要是发生在前一个commit呢?用rebase
首先先定位到你需要修改的commit前,用
git log
如上图,我想修改的提交备注为”修改gitcommit文件“那一行的commit
那么我可以这样
git rebase -i HEAD^^
在弹出的编译页面选择你需要修改的commit,把最前面的pick改为edit退出后就停留在你需要修改的commit了
这个时候就能继续你的修改东西的操作了
git add xxx(修改了的文件名)
git commit -amend
在修复完成之后,就可以用git rebase --continue来继续rebase过程,把后面的commit直接重新连接起来并应用上去。
最后写好了也可以push上去到中央仓库。
六:高级应用撤销commit
git reset --hard HEAD^
或者
git reset --soft commit_id //保存代码
git reset --hard commit_id //不保存commit之前的代码
前面的操作也是用于撤销最新的commit的,但是如果是前面几个,那么reset--hard就用不了,这个时候用交互式rebase撤销commit
git rebase -i HEAD^^
这个时候又弹出一个编辑框了,你只需要删除你想要撤销的commit上的那一行就可以了。
当然是发生在前面所有的前提都是在内容未push前的。如果是push后的,并且是在你自己未合并到master主线上的分支,那么你也可以更改然后强制push上去
git push origin branch1 -f。
记住假如你的分支已经合并到master那么千万别强制push了,不然覆盖掉之前人家提交的,你会被打的。这个时候你就要用revert了。它的用法很简单,你希望撤销哪个commit,就把它填在后面:
git revert HEAD^
本地做完提交后再push就可以了
七:高级应用stash
临时存放工作目录的改动,当你某个功能还没写好没commit的时候,你不必急急忙忙commit上去,再去切换分支做别的紧急的事情,可以直接
git stash -u
做完紧急的事情后你再返回来做你的功能
git stash pop
这样你之前存储的东西又都回来了!
八:高级应用reflog
找回误删除的分支
git reflog
这个命令可以找到HEAD的移动记录,找到你想要找回的分支当时commit,切换到它,比如说branch1我要找回它
那么我就切换到它
git checkout branch1
git checkou -b branch1
这样你刚删除的分支branch1就找回来了。
九:高级应用排除不想被管理的文件和目录
.gitignore文件
创建仓库的时候github上面有模板让你选择,自动生成相应的.gitignore文件
写这个教程花了我整整一天的时候,各位看官如果觉得有帮助请点个赞谢谢,文中如果有出错的地方,欢迎有老司机指正