7、回退版本
git reset 命令用于回退版本,可以指定退回某一次提交的版本。git reset 命令语法格式如下:
git reset [--soft | --mixed | --hard] [HEAD]
–mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
git reset [HEAD]
// 实例:
$ git reset HEAD^ # 回退所有内容到上一个版本
$ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
$ git reset 052e # 回退到指定版本
–hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:
git reset --hard HEAD
// 实例:
$ git reset -–hard HEAD~3 # 回退上上上一个版本
$ git reset –-hard bae128 # 回退到某个版本回退点之前的所有信息。
$ git reset --hard origin/master # 将本地的状态回退到和远程的一样
注意:谨慎使用 -–hard 参数,它会删除回退点之前的所有信息。
回退后,因为本地版本落后于远程仓库,直接push提交不上去。需要git push -f,强制提交
8、删除/拉取分支
如果本地分支代码害怕有问题,那么删除该分支在本地代码后,从新拉取。以master为例
1、先切到别的分支,再git branch -d master,如果本地分支跟服务器不同需要-D
2、git checkout -b master origin/master // 拉取分支
9、提交记录
gitk
该命令会打开一个git自带的历史记录可视化工具,比我们从浏览器里再打开页面看提交记录更方便一些
10、设置提交人名称
git config user.name // 查询当前的提交人姓名
git config --global user.name sunquan // 把提交人姓名设置为sunquan
11、避免每次推送都输入密码
git config --global credential.helper store
12、获取当前 Git 仓库关联的远程仓库的 URL
git config --get remote.origin.url
该命令将返回当前 Git 仓库关联的远程仓库的 URL,也就是你的本地仓库代码是从哪个远程 Git 仓库拉取下来的。
13、关联本地代码与远程仓库
git remote add origin <remote-repository-URL>
14、关联本地分支到远程分支
如果未关联,pull时会提示
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.git pull
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/ develop
解决方法:假如分支名为v2.0.0
git branch --set-upstream-to=origin/v2.0.0
三:从本地上传新项目
- 本地文件夹中,git init
- 在github上新建代码库
- 输入命令git add . 将该目录下所有文件添加到本地仓库;
- 输入命令git commit -m “描述” 将刚刚添加的文件提交到本地仓库;
- GitHub上新建的远程仓库建立连接:git remote add origin https://github.com/xxx/xxx
- git push
如遇到 OpenSSL SSL_read: Connection was reset, errno 10054的报错,可以把ssl验证关闭:git config --global http.sslVerify “false”
四:合并分支实操
大多时候公司都是分工合作,可能一人一个分支,各自在自己的分支上开发,然后开发完毕后合并到主分支(master)上线。这时就需要在master上将你的分支合并过来,有时别人分支如果也合并到master了,就需要你先在你的分支上把master上最新的代码合并到你的分支上,然后push;再去master上把你的分支合并过来,然后push。记着push,合并只是合并到本地了。
比如我们现在在dev分支上,想将dev分支合并到master分支,操作如下:
1、确认当前分支
git branch -a // 展示所有分支,高亮的为当前分支
2、首先切换到master分支上
git checkout master
3、如果是多人开发的话 需要把远程master上的代码pull下来
//如果是自己一个开发就没有必要了,为了保险期间还是pull
git pull origin master
4、然后我们把dev分支的代码合并到master上
git merge dev
5、然后查看状态及执行提交命令
git status
On branch master
Your branch is ahead of 'origin/master' by 12 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
//上面的意思就是你有12个commit,需要push到远程master上
6、最后执行提交命令
git push origin master
五:git不能先commit后再pull
今天遇到一个在使用git上的一个误区。具体的问题现象是:
我commit后再pull而不能在本地合并的情况,结果导致我的commit直接把同事的修改覆盖了。因为相对于我此次的commit的A版本是同事的提交的B版本的上一个C版本,我直接是对C版本进行的修改,就是因为我没有先把同事的B版本先pull下来在本地产生一个最新的版本的合并。
我一直都是先commit后再pull,这样能“避免”冲突,事实上这样肯定不行,这样会导致你的commit不是基于最新的版本来进行的,而是上一个版本,这其中有其他的提交而在服务器上产生了最新的版本。而这样避免冲突的方式是错误的,更像是躲开了冲突。正确的操作是先pull下来,再添加,然后冲突解决,然后提交推送.
下面有一个简单的图示:
六:.gitignore添加无效
有一些包含密码的文件我们不想上传git,这时大家都知道把文件路径添加到.gitignore中即可。
但是我在我的老项目中,尝试了几次都不起效果。原来是如果某些文件已经被纳入了版本管理中,在.gitignore中再声明也是不起作用的。
解决方法: git清除本地缓存(改变成未track状态),然后再提交:
1、git rm -r --cached .
2、将不需要上传git的文件添加到.gitignore
3、将所有文件再add commit push上去
gitignore中的文件在github等远程仓库上是没有的,当然本地仓库是有的
ignore的文件,本地代码中文件名称颜色会置灰,且无法记录改动
七:解决冲突
1、当我们pull代码,git命令提示pull失败,拉的代码会把本地代码覆盖。这就是因为有文件冲突
2、这时,我们把本地代码暂存(stash)下,然后再pull,即可拉去成功。
3、此时大概率有两位文件,
- 一类为须要我们手动合并,因为和别人改了同一行,可自行决定incoming那部分
- 一类在本地仓库中已自动合并,因为我们和别人改了同一个文件,但不是同一行,git已自动合并,且add到了暂存区
4、将手动解决冲突后的文件add到暂存区,然后连同自动合并的在暂存区里所有的文件都commit(我曾被同事将此部分代码舍弃导致代码丢失),然后push即可。如下为需要解决冲突的场景
5、以上为pull操作时的冲突场景,合并代码也会出现冲突的场景。跟上面一样操作即可。
如果合并代码出现冲突,手动解决了冲突,并add了该文件。这时后悔了,不想再合并了,只需要放弃暂存区里的更改即可,此时git status会发一切都没有改变。
这是因为虽然合并了冲突并且add到暂存区,但后来撤销了更改,最终是没有commit到本地仓库,且没有push到远程仓库。故一切都没有改变
八:命令行与开发工具区别?
存在在idea可视化配置好的git信息,在命令行中不能使用的情况。
比如idea可视化工具关联了本地代码与git url,且用工具可以正常进行pull/commit/push等操作。
但是在命令行中使用git status等命令时直接报错,报错信息如下