Git命令和eclipse总Git使用
目录
1.概述
Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库(本地仓库),开发者可以提交到本地,实现离线开发。
2.特点
1、从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上。
2、在自己的机器上根据不同的开发目的,创建分支,修改代码。
3、在单机上自己创建的分支上提交代码。
4、在单机上合并分支。
5、把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
6、生成补丁(patch),把补丁发送给主开发者。
7、看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
8、一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
3.Git和SVN比较
1. git比svn快,用起来更流畅。
2. git在本地就可以用,可以随便保存各种历史痕迹,不用担心污染服务器。svn commit就到服务器了,有时候发现commit错了或不全就得再来一遍,有review更吐血了。(git commit --amend太好用了)
3. git拉branch和在branch之间切换都非常简单,可以随便折腾。svn一个branch就是一个copy。
4. git绝对不会有被lock了不能commit的情况。
5. git可以实现离线工作,svn不能连接到服务器上基本不能工作
6. svn一致性非常高
4.Git使用
4.1下载安装
Git安装很简单,可参看百度教程git下载安装图文教程
4.2git命令的使用
4.2.1. 初始化操作
4.2.1.1. 绑定用户
打开git-bash.exe,在桌面快捷方式/开始菜单/安装目录中
因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识,用户和邮箱为你github注册的账号和邮箱
ps :git config --global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。
4.2.1.2. 为github账号设置SSH key
配置ssh的好处就是,本地向服务器push代码时就不用总是填写用户名和密码了
如果你的key丢失了,不管是公钥还是私钥,丢失一个都不能用了,解决方法也很简单,重新再生成一次,然后在github.com里再设置一次就行
2-1 生成ssh key
首先检查是否已生成** cd ~/.ssh,ls如果有3个文件,则**已经生成,id_rsa.pub就是公钥
如果没有生成,那么通过$ ssh-****** -t rsa -C “邮箱”来生成。
1)是路径确认,直接按回车存默认路径即可
2)直接回车键,这里我们不使用密码进行登录, 用密码太麻烦;
3)直接回车键
生成成功后,去对应目录用记事本打开id_rsa.pub,得到ssh key公钥
或者通过git-gui.exe help->show ssh key查看
查看本地ssh key是否正常
$ssh -T [email protected]
出现如下信息表示设置成功:
Hi username! You've successfully authenticated, but GitHub does not # provide shell access.
2-2 为github账号配置ssh key
切换到github,展开个人头像的小三角,点击settings
然后打开SSH keys菜单, 点击Add SSH key新增**,填上标题,跟仓库保持一致吧,好区分。
接着将id_rsa.pub文件中key粘贴到此,最后Add key生成**吧。
如此,github账号的SSH keys配置完成。
4.2.2. 创建本地仓库
通过:git init 可以将一个目录变成本地仓库
Ps:瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见
git的运行区域(点击打开链接)
把一个文件放到Git仓库只需要两步:
1.告诉git,把文件添加到仓库或目录下的所有文件添加到仓库暂存区
$git add [-f] 文件名.后缀
$git add [-f] 文件名.后缀 文件名.后缀
$git add .
Ps:提交的代码必须都在仓库目录下,[-f]强制添加
2.告诉git,把仓库暂存区提交到仓库
$git commit –m “本次提交说明”
查看工作区文件状态
$git status
4.2.3. 版本回退
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL
:
1. 查看提交历史,以确定回退到什么版本
$git log [--pretty=oneline]
[--pretty=oneline]简化输出信息
2. 查看命令历史,以确定回到那个命令
$git reflog
3. 回退到指定版本或者指定命令
$git reset --hard commitid/指针id
4.2.4. 撤销修改
1. 当你改乱了工作区某个文件的内容,工作区的修改(也可以是删除),都可以一键还原
$git checkout -- 文件
Ps:这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
2. 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改分两步
第一步:$git reset HEAD 文件
丢弃暂存区回到场景1,第二步按场景1操作
4.2.5. 删除版本库文件
工作区中该文件已经删除,有两种选择:
一、删除版本库中的文件
$git rm 文件
$git commit –m “删除说明”
二、删错了,恢复工作区文件
$git checkout -- 文件
4.2.6. 远程仓库
1.关联远程仓库
$git remote add origin 远程仓库地址
2.取消关联远程仓库
$git remote remove origin
3.查看远程库信息
$git remote –v
4.推送本地仓库到远程仓库
$git push –u origin 分支库名/master
Ps:由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
之后执行就是 $git push origin分支库名/master
5.克隆远程库到本地
$git clone 远程仓库地址
Ps: 从远程库clone时,默认情况下,你的只能看到本地的master分支
6.创建远程origin的分支到本地
$git checkout –b 分支名 origin/分支名
7.更新本地代码到远程仓库
$git pull
8. 建立本地分支和远程分支的关联(如果git pull提示“no tracking information”)
$git branch --set-upstream 分支名 origin/分支名
4.2.7.分支操作
1.创建和切换分支
$git checkout –b 分支名
相当于下面两条命令
$git branch 分支名 创建分支
$git chechout 分支名 切换分支
2.查看所有分支
$git branch
3.合并分支
$git merge [–no—ff] [-m “描述”] 被合并分支名
Ps:[–no—ff] 参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
4.删除分支
$git branch –d 分支名
$git branch –D 分支名 强制删除没有被合并的分支
4.2.8. 保护工作现场
工作只进行到一半,还没法提交,预计完成还需1天时间。Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
$git stash 保存工作现场
$git stash list 查看工作现场
工作现场恢复:
1.使用 $git stash apply [[email protected]{0}] 恢复,stash内容并不删除,需要用 $git stash dro 来删除
2.用 $git stash pop [[email protected]{0}],恢复的同时把stash内容也删了
4.2.9. 标签管理
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照
1.创建标签
$git tag 标签名
$git tag 标签名 commit_id 给指定历史提交的commit_id设置标签
$git tag –a 标签名 –m “说明文字” commit_id 带说明的标签
$git tag –s 标签名 –m “说明文字” commit_id 用私钥签名一个标签
Ps: 签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg**对, 如果报错,请参考GnuPG帮助文档配置Key. 用PGP签名的标签是不可伪造的,因为可以验证PGP签名
2.查看标签
$git tag 查看设置的标签列表
$git show 标签名 查看标签信息
3.操作标签
删除标签
$git tag –d 标签名
推送某个标签到远程仓库
$git push origin 标签名
一次性推送给所有的标签
$git push origin --tags
删除远程标签:先删除本地标签,然后
$git push origin :refs/tags/标签名
4.2.10. 忽略特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件.GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore。最后一步就是把.gitignore也提交到Git
校验配置文件中哪个规则写错了
$git check-ignore -v 文件名
4.2.11. 配置别名
给命令配置别名
$git config --global alias.别名 命令名
Ps:--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用
删除别名配置
当前用户:配置文件放在C:\Users\Administrator的一个隐藏文件.gitconfig中,删除对应的配置就删除别名配置
当前仓库:Git配置文件都放在.git/config文件中
4.2.12. 企业开发使用步骤
1、在GitHub或GitLab上创建远程仓库
2、克隆项目,打开Bash,cd到本地想创建本地仓库的位置(一般建议你的开发就应该在这个目录上,比如Eclipse的workspace就在这个目录上,你对本地仓库的操作都会同步到开发中,在Eclipse中项目点右键refresh一下就会更新,超级方便),然后:
$ git clone "仓库的 SSH url"(成功的话就能ls查看到仓库文件,cd进去会目录上会显示(master)主分支)
3、创建分支,一般不推荐直接在主分支上开发,所以创建子分支作为开发分支
$ git branch 分支名(创建分支)
$ git checkout 分支名 (切换分支)
4、在进行了修改后,提交修改到缓存区:
$ git add 目录/文件/.(.代表目录下的全部文件)
5、如果本阶段修改已完成,可以将修改提交到本分支(即可多次add后commit):
$ git commit -m "提交说明"
这里说一下git的运行区域(图解可参看博客点击打开链接)
工作区就是我们本地的文件系统
版本库包括缓存区与分支区,执行add的修改就被提交到了缓存区,执行commit后的修改就被提交到了分支区
6、如果一天的任务完成或一阶段任务完成了,就可以把本地分支的内容提交到远程仓库中,以供管理者审查、合并:
$ git push origin 分支名
7、因为使用Git的目的就是多人协作开发,所以别人完成了的工作可能是你完成工作的基础,这时候你的本地就需要别人push到远程仓库(你们使用的是一个远程仓库)的代码,可以通过:
$ git pull origin 分支名(拉取主仓库到本地本分支)
上述过程其实相当于两步,
git fetch origin (将远程仓库拉取到本地) 与 git merge origin 分支名 (合并本地与分支)
*这样做其实是不太规范的,规范的做法是:master主分支上存放远程仓库的所有版本,子分支只用来本地开发和上传修改,所以所有的pull都应当拉到master上,而不是直接到pull子分支,然后再通过merge master实现与master子分支合并:
$ git checkout master (从当前分支切换到主分支)
$ git pull(拉取远程仓库当前版本到主分支)
$ git checkout 子分支名 (从主分支切换到子分支)
$ git merge master(与主分支合并)
注意:还有一个git rebase指令同样是合并分支,与只是被合并的分支就消亡了,是完全的合并,而merge是内容合并。rebase可以与pull一起使用,这在第九点冲突时会说到。
8、在拉取之前,因为我们有本地的修改,它们还未保存,pull后会丢失,我们可以commit提交、版本合并后再拉取,但你可能还不想这样做,而且你的代码不一定到了上传、合并的时机,那就需要暂存我们的修改:
$ git stash(暂存修改)
$ git stash pop (pull之后,弹出修改)
9、在这个过程中,有很大可能遇到冲突
最常见的冲突是内容冲突:你修改了一个函数的实现,而远程仓库版本跟你的不一样,当主版本和你的修改合并时,这段代码的修改到底听谁的,所以就冲突了。通常出现在git pull与git merge的过程中。
这种冲突的解决方式是:直接修改冲突文件,在执行指令后有冲突的文件会标识在命令行中,在冲突文件中有如下标志:
<<<<<<< HEAD
这之间的是你的修改
=======
这之间是其他人的修改
>>>>>>> 6853e5ff961e684d3a6c02d4d06183b5ff330dcc
然后删除其他人的修改或者删除自己的修改,删除标识符,当处理完所有冲突后,执行git add与git commit即可。
在git rebase的过程中,也许会出现冲突: 在这种情况,Git会停止rebase并会让你去解决冲突;在解决完冲突后,用git add命令去更新这些内容的索引(index), 然后,你无需执行commit,只要执行:
$ git rebase --continue这样git会继续应用(apply)余下的补丁,这里说的补丁是这种情况:
表示把你的本地当前分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把本地当前分支更新为最新的"origin"分支,最后把保存的这些补丁应用到本地当前分支上
$ git rebase --abort在任何时候,你可以用--abort参数来终止rebase的行动,并且当前分支会回到rebase开始前的状态。
如果想更详细的了解Git,推荐廖雪峰的Git教程
4.3.git工具的使用
4.3.1. 提交本地仓库到远程仓库
1.自带git插件进行配置我们的用户名和密码,即是自己github注册用户。windows--perferences--Team--Git--Configuration
2.eclipse生成SSH2 key:windows -- perferences--General--Network Commection--SSH2--key management--General
RSA Key
然后把生成的SSH Key 注册到github上,登录github--settings--add把上诉生成的SSH Key粘贴即可。
备注:该方法就相当于命令行方法,在公司电脑和自己笔记本电脑把生成的SSH Key粘贴即可,可以添加很多个SSH Key
查看生成的秘钥是否在在默认系统盘(C盘),有些人奇葩会安装在其他盘。
然后把生成的公钥粘贴到github上:(该步不能省略,一定要用命令检查下生成的公钥是否正常)
若该步没有操作,执行命令:$ ssh -T [email protected]报这样的错误:
3.本地创建项目如“testGit”和本地git仓库
打开eclipse,创建项目“testGit”里面随便写点什么,然后"File"--"Team"--"Share Project"--"Git"--"next"
如上图所示到此该项目“testGit”就变成git仓库,到workspace下打开该项目,发现多了一个隐藏文件“.git”,但该项目处于untracked状态(文件夹中的符号”?”表示),下面我们需要提交代码到本地仓库,如下图:
首先我们要忽略不必要的文件如maven项目target文件夹
配置.gitignore来排除这个文件夹,打开Navigator窗口,在project根目录中添加.gitignore文件,将需要排除控制的目录写入.gitignore文件中:
这样git提交就过滤了一些不必要的文件,若是要过滤其他文件夹或文件直接在“.gitignore”中写,具体写法参考:
http://blog.****.net/u014079 773/article/details/51602344
然后提交修改的文件必须先add然后commit故通过Team -> Add to index可以将文件加入git索引,进行版本监控:
若是不想添加到版本库中则“Remove from Index”该命令前提是为未commit,若是已经commit那么该命令不起作用。添加成功后文件状态发生变化由之前的“?”变成“*”:
细节:EGIT中只要Commit就可以默认将untracked的文件添加到索引再提交更新,不需要分开操作
最后执行commit:(首次提交后,会自动生成master分支)
在注释中输入提交信息:
到此项目“testGit”就本地提交成功。接下来我们把本地项目提交至远程远程仓库github上:
首先在github官网上登录并创建仓库“testGit”(该名称与本地仓库名称一致,表示本地仓库提交到远程仓库并与之关联),创建完毕后执行如下操作:
进行如下设置:
下拉框选择如下:
然后进入如下截图操作:注意:“Force Update”若是勾选,表示覆盖提交
点击“next”出现如下图所示:
最后点击finis如下图,登录github查看是否上传成功。
出现如下截图表示上传成功。
4.3.2. 下载项目
方法一:切换至git视图进行如下操作
1.eclipse切换至git视图
2.进行如下截图操作:
3.点击next:
4.点击finish:(directory为任意路径,但是最好不要放入workspace下,可以放入非系统盘的其他盘下,创建一个“gitHub”文件夹,该文件下专门用于存放down下的git项目)
至此从github上clone成功,如下截图:
5.选中右击“Import Project”
6.默认选中“Import existing Eclipse projects”即第一个选项
7.点击next:
8.最后点击finish,eclipse切换到“Java”视图,看到导入的项目
方法二:通过File--Import--Git方式导入
1.File--Import
2.选中git方式(表示从git中导入)
3.选中“Clone URI”(表示从远程github上导入到本地eclipse中)
4.输入远程githubURI,点击next
点击next
点击next
点击next
点击finish
至此eclipse导入github远程项目成功
4.3.3. 提交已经修改的项目
1.如何提交已经修改的项目,已修改的项目文件夹出现“*”号标志,选择带“*”号标志的文件右击“Team”--"commit"
点击“commit and push”表示提交并推送,即把修改的文件提交至本地,推送到远程仓库。
2.如何恢复未提交的修改文件:
3.实际开发中提交项目只需要提交如下三个文件即可:
4.如何用命令查看,修改remote url:
如果你在连接github仓库的时候,用的https协议的地址,还需要切换为git协议
可以用git remote -v 查看你当前的remote url
$ git remote -v
origin https://github.com/love-somnus/Spring.git (fetch)
origin https://github.com/love-somnus/Spring.git (push)
可以看到是使用https协议进行访问的。
这时,你可以使用 git remote set-url 来调整你的url。
git remote set-url origin [email protected]:love-somnus/Spring.git
完了之后,你便可以再用 git remote -v 查看一下。至此OK。
5.查看本地SSH Key是否正常:
$ ssh -T [email protected]
# Attempts to ssh to github
出现如下信息表示设置成功:
Hi username! You've successfully authenticated, but GitHub does not # provide shell access.
备注:
1.使用eclipse插件提交项目至远程必须先本地提交,最后提交至远程仓库
2.查看谁提交了代码,项目右击“team”--“show history”
3.查看提交记录:Team--Show in History (命令行为:git log)
4.撤销恢复修改:Replace With--HEAD Revision (命令行为 git checkout head .)
5.更新项目远程仓库:Team-- Pull (命令行:git pull https://github.com/someone/xxx.git)
6.查看哪些文件被修改了:Team--Synchronize Workspace
7.提交项目时注意忽略不必要的文件或文件夹如maven项目下的target文件夹忽略
8.git提供了多重协议用来连接git服务器,其中最常见的就是https和git,git就是可以免用户名和密码的,不同的协议,项目连接地址是有区别的,如下
https形式:https://github.com/love-somnus/Spring.git git形式:[email protected]:love-somnus/Spring.git
4.3.4. 切换分支
选中分支右键 checkout-》checkout commit
4.3.5.还原文件或项目
1.以还原index2.html文件为例,打开index2.html文件,如图:
2.右键点击文件,选择team菜单,然后选择Show Local History菜单,如图
3.在右侧文件修改历史列表中,选择要查看的历史版本,点击右键,如图:
4.点击右键菜单中的Compare with workspace,可以比对所选择的版本和本地当前版本文件的不同:如图:
5.比对后,如果是要还原至的版本,那么点击右键菜单中reset->hard开始还原文件,这时会弹出提示框,如图:
6.提示框 : 询问您是否要用选择的版本文件覆盖当前文件,点击Yes即可完成还原,点击Cancel取消。
4.4.Git冲突解决
多人协作的工作模式通常是这样:
1.首先,可以试图用git push origin branch-name推送自己的修改;
2.如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
3.如果合并有冲突,则解决冲突,并在本地提交;
4.没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
5.Git工作流程图
6.Git版本管理流程
如有不足地方,还望指出,谢谢!
转载请备注源链接!