关于操作git
手册:http://www.yiibai.com/git/
一、安装git,可以通过git bash执行命令行;安装tortoiseGit执行git相关操作,在那之前需要了解下git命令行操作
二、在本地git仓库的使用,可以在任意目录新建文件夹,比如我在桌面新建了test文件夹,然后进入文件夹内,右键使用git bash执行命令行
- git init,初始化仓库,在当前文件夹生成了.git文件夹,当前文件夹处于master分支下
- 可以通过touch xxx创建文件,也可以直接创建,我创建了一个test.txt文本,并且内容随便输入11111;此时通过命令行git status查看仓库状态,会显示没有任何改变,即没有可操作的文件
- git add XXX,将添加文件到暂存区,比如我的是git add “test.txt”;此时通过命令行git status查看仓库状态,显示有可以添加到暂存区或者可以提交的文件:test.txt
git commit -m
'add test.java',提交文件到仓库,-m表示描述,是必需的,比如我的是
git commit -m
'提交test.txt',此时通过命令行git status查看仓库状态,会显示仓库干净
三、在本地仓库使用没有问题的前提下,我们进一步使用git,操作线上远程仓库
- 先注册一个github账号,然后创建一个仓库(项目),流程不懂请百度一下,我创建了test仓库,完成后可以看到:
- cd ~/.ssh 或cd .ssh,先检查本机有没密钥,本地仓库与线上github仓库的通信需要密钥。如果没有则提示: No such file or directory,如果有存在.ssh文件夹,则通过cd ~/.ssh进入该文件夹
- ls,检查当前路径下所有文件,正常情况下会有id_rsa、id_rea.pub、known_hosts三个文件,如果只有known_hosts,说明还是缺乏密钥,需要通过命令行生成
- cd ~,保证当前路径在”~”下,准备生成密钥
- (2017官方最新)ssh-keygen -t rsa -b 4096 -C "xxx",xxx是你注册github账号的邮箱,接着会出现以下情况:
- 接着在你c盘的用户文件夹内,找到.ssh文件夹进去,会看到以下三个文件,打开id_rsa.pub复制公钥内容:
- 将公钥ssh key到GItHub,登录GitHub系统;点击右上角账号头像的的“▼”→Settings→SSH kyes→Add SSH key。
- git config --global user.name “your_username” git config --global user.email “your_registered_github_Email” 配置账户,关联两个仓库,第一句名字为你的github账户名称,第二位注册邮箱
- ssh -T git@github.com,测试密钥是否配置设置成功,出现以下即已经ok:
ps:如果没有配置密钥,后面推送本地仓库文件到远程仓库就会出现权限不够或者仓库不存在的报错:
Please make sure you have the correct access rights and the repository exists.
如果配置了密钥还出现这种情况,可能需要github管理者进行相关权限配置。
- 到这里快成功了,接着我们将本地仓库文件推送给远程仓库,我们先把之前创建好的github的仓库的ssh路径给复制下来
- 回到之前在本地文件仓库打开的git bash,不是桌面在桌面打开的git bash
- git remote add origin ‘粘贴复制test ssh key的ssh路径’,添加远程库的意思,如果远程库存在会提示:fatal: remote origin already exists,远程库的名字就是
origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库,我改成了pb,,可以通过git remote查看所有远程库,也可以通过git remote rm 库名,删除远程库 - 再执行配置github用户名和邮箱:git config --global user.name “your_username” git config --global user.email “your_registered_github_Email”
-
git push -u 库名 master,我的是git push -u pb master;推送文件到远程库,如果库名不存在则会报错
ERROR: Repository not found.
fatal: Could not read from remote repository.
执行git remote add 库名 ‘粘贴复制test ssh key的ssh路径’解决
如果报以下错:错误的主要原因是github中的README.md文件不在本地代码目录中,
可以通过如下命令进行代码合并【注:pull=fetch+merge】 git pull --rebase origin master
再通过命令git push -u 库名 master完成代码上传到github的操作。
成功如下:
- 回到github账户刷新可以看到上传的文件,我的是test.txt文件:
四、进一步使用git操作,查看修改内容、查看历史、版本回退、克隆
- 还是可以通过git status查看仓库状态
未修改文件之前,没有提交的文件,工作区域干净
修改了test.txt之后,我增加了22222,再次查看状态:
上面的命令告诉我们 readme.txt文件已被修改,但是有未被提交的修改。
- git diff 文件名,查看文件修改了什么内容
- 提交到本地仓库,第一步是git add 第二步是:git commit
- 推送到远程库,刷新可看github的情况如下:
- git log,查看对仓库的历史操作(git log –pretty=oneline 简化输出历史操作记录)
- git reset --hard HEAD^ /git reset --hard HEAD^ ^...../git reset --hard HEAD~100(数值),回退到上个版本或者前几版本,通过cat xxx(文件名)可以查看返回版本内容
- 恢复最新版本,也就是回退最新版本号,通过版本号方式操作,所以首先要先获取版本号:git reflog ,再通过git reset –hard 6fcfc89(版本号)来恢复
- ps:撤销修改有三种方法
- 如果我知道要删掉那些内容的话,直接手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit掉
- 使用 git reset –hard HEAD^
- git checkout — file(文件名) 可以丢弃工作区的修改;readme.txt自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态,已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态
- rm file(文件名),删除仓库文件,彻底从版本库删除的话还需要执行commit命令 提交掉
- git checkout --file(文件名)恢复删除了的文件
- git clone xxx(仓库地址)克隆远程仓库项目,仓库地址最好选择http,ssh可能需要相关配置会显示权限不够认证不过关而克隆不了项目
五、解决冲突
- git checkout -b dev 创建并切换分支
git checkout 命令加上 –b参数表示创建并切换,相当于如下2条命令
git branch dev
git checkout dev
- git branch查看分支,会列出所有的分支,当前分支前面会添加一个星号。
- ps:在分支修改后add以及commit之后,不同分支文件不干扰,通过git branch切换分支以及cat查看文件,同个文件内容是不一样的
- git merge dev(分支名),合并分支,之后再cat文件,发现文件内容都一样了,推荐使用git merge –no-ff -m “注释” dev,删除后分支信息还在
- git branch -d dev(分支名),删除分支
- ps:冲突可以说是两个分支的冲突.具体是两个已经提交的分支的相同文件相同位置的的不同操作进行了合并.不会冲突的习惯是,修改文件之前先merge 别的分支.
-
我在master 分支上创建并提交一个文件,切换到新的b分支上是没有这个文件的.这说明分支之间是相互独立的.
通过git merge master 把master上新增的文件给merge 过来.这是不会又冲突的
- 如果我在新的分支b上把master 对应行的数据给改了,并提交.然后切换到master,我再git merge b -m 'from b' 也不会冲突,结果是被b分支的修改给覆盖了
- 如果我切换到分支b ,修改了master 原本哪行的代码,提交.然后再切换到master.我不知道b修改了这个文件.我也修改这一行的代码,并提交.好了,"两个分支相同文件相同位置的的不同操作" 我这个时候就在master merge b 或在 b上merge master. 冲突!!!
- 比如:我在master分支上修改了test.txt文件第1行并add+commit;在dev分支上也修改了第一行并且add+commit,最后merge分支dev,会发现冲突合并失败
- 通过git status可以看到test.txt都被修改了,通过cat文件可以看到冲突的代码
此时git状态在,mergeing中,相关命令操作可能无法进行,可以终止合并:git merge --abort
- 此时打开你的项目目录下想要提交的文件,内容会以下面的格式出现:
xxxxx
<<<<<<HEAD
内容1
=======
内容2
>>>>>>> dev
xxxxx
解决冲突最直接的方法就是与相关人员沟通后进行删除说明。以及内容1或者内容2,如果内容1和2都要保留则删除说明即可,比如我的冲突如下:
修改后(保留):
接着add以及commit。
六、分支合并
1、可以使用Beyond Compare 3工具,需要配置git支持调用才行,具体百度
2、常用方法是命令行:
- add以及commit
- git mergetool 冲突情况下会出现一个弹出框,可以检查和解决代码冲突
- git status 检查
- commit
- git status 检查
- git pull
- git push
- 本地运行项目没有问题即可
附加优秀博客:
- http://blog.jobbole.com/78960/
- http://www.cnblogs.com/xuezizhenchengxuyuan/p/6439782.html
- http://blog.csdn.net/mad1989/article/details/16885569
总结工作中操作流程:
-
克隆项目到本地:git clone xxx.git "指定目录" (clone后的是git项目的url地址)
- 根据情况初始化项目环境,比如需要npm install等,具体与同事沟通
- 修改之后提交步骤:
- 添加到本地工作区域:git add . (小数点)
- 放弃本地还未提交的内容修改恢复最初(拉取新代码可能会用到):git checkout . (小数点)
- 查看状态:gitc status
- 提交:git commit --m "备注"(cmd顺利,gitbash走linux命令,可能突然要求输入备注且当前无法输入,依次按键i字母键---》shift+:键--》输入内容--》w键q键或q键退出)
- 发生冲突:git merge --abort退出合并,或者git mergetool 调出工具解决冲突后再commit
- 查看状态:gitc status
- 拉取:git pull ,如果是新切的分支,第一次commit之后pull,需要执行:git pull origin xxx(分支名)
- 查看状态:gitc status
- 推送:git push,如果是新切的分支,第一次pull之后push,需要执行:git push origin xxx(分支名)
- 查看状态:gitc status
- 运行本地项目,切记在附带依赖环境下要安装其他必须环境!!!!!!!!!!!!!!!!!!!!!!!!!!如cnpm,bower,webpack等!!!!
处理分支:
- 查看分支:git branch
- 切换分支:git checkout 分支名
- 创建并切换分支:git checkout -b 分支名(此时分支内容为空)
- 删除分支:git branch -d
- 合并分支:git merge dev(分支名),合并分支,之后再cat文件,发现文件内容都一样了,推荐使用git merge –no-ff -m “注释” dev,删除后分支信息还在
管理远程仓库:
- 查看当前项目涉及的远程库以及地址:git remote -v
- 重命名仓库名:git remote rename 原仓库名 新仓库名
- 再次查看:git remote -v
- 添加新远程库:git remote add 仓库名 giturl地址
- 删除远程库:git remote remove 仓库名
- 新远程库分支与本地分支合并:git pull 库名 本地分支名(当前本地项目所在分支)
其他:
- 查看冲突文件内容:cat 文件名
- 查看对git仓库的操作历史:git log
- 查看单个文件修改内容:git diff 文件名
- 回滚版本:git reflog查看版本号,然后回滚:git reset –hard 6fcfc89(版本号),最后强制推送到某个远程库某分支:git push -f origin currentBranch
- 如果代码已经push过,回滚使用:git revert 版本号,参考文章:http://yijiebuyi.com/blog/8f985d539566d0bf3b804df6be4e0c90.html
- 如果提交到新git时,不想继续使用原来的git名称邮箱,可以在该项目目录下,执行git config --local user.name '名字' 以及 git config --local user.email '邮箱',重新设置该项目提交到git的名称,防止与原来的git提交混乱
本地修改和删除文件后重新从git仓库更新文件操作:
- git reset --hard HEAD^ + git pull 返回上版本(这个操作有弊端,如果当前还有其他大量代码没有被提交到仓库,那么会造成当前代码丢失,慎用,只能从仓库再拉取代码,再比较两份代码,把之前删除的复制到自己的本地项目)
- git checkout -- 被删除文件路径(通过git status可以看到被删除的文件路径,最简单直接的方法)