git 作为一款流行的协作工具,可以提高发开效率,对于我们开发人员来说,掌握git的使用已经成为一项必备的技能。下面是我平时使用git的一些总结。
首先,线上一张简单概括的技能图:
能掌握上面这张图的技能,你就已经成为git大神级人物了。我只是把日常用到的操作记录下来,给大家分享一下。
1. 使用git查看某个文件的历史修改记录。
使用 git log --follow -p filename 就可以看到这个文件所有的历史修改记录。这样在我们pull代码下来之后想查看某个文件,或者修改了某个文件但是想找到以前版本的代码非常有用。
2. 使用git工具执行 git pull 命令是出现 ssh: connect to host github.com port 22: Bad file number
平常有在公司写demo的习惯,有些写不完的demo,周末回家还可以写写。于是在github上面建了个仓库,在家里与公司的电脑都pull了一份,在公司写不完的demo,回家也可以继续写。
但是今天在公司想要把平时写的demo push到github上面,回家再看看来着,发现竟然报错了,而且还不是平常的错误,错误如下图:
经谷歌一查,是因为公司把ssh的端口22给禁掉了,但是ssh的端口是可以改的,于是找了一些方法,果然奏效,方法如下:
1)使用管理员权限打开命令窗口,输入 cd ~/.ssh 就进入到了 c:\Users\zhangsan.ssh文件夹下。在该文件夹下新建config文件,输入
host github.com
hostname ssh.github.com
port 443
然后保存退出。
2)在git里面执行 ssh -T git@github.com
3)执行命令之后,出现 Are you sure you want to continue connecting(yes/no)? 输入yes按回车,出现成功提示即可。
2. 使用git工具执行git pull 的时候出现error: unable to create file /web/module/index/login.js (Permission denied)
当pull代码的时候,由于远程分支上有新的文件,pull下来之后应该需要在本地硬盘新建一个文件,由于git没有权限操作硬盘创建文件,才会出现这个错误
所以可以使用管理员权限打开git,然后再pull一遍就可以了。
3. git的后悔药操作
1)本地修改的代码搞乱了,不想要了,想恢复到没改动之前
git checkout -- filePath
2)本地修改的代码使用git add . 添加到暂存区,又不想要了
git reset --soft
git checkout -- filePath
3)本地修改代码之后,并且commit了,也不想要了,就是本地修改的代码给commit的代码都没了
git reset --hard
4)当git pull 的时候,我靠一大堆冲突,老子不知道怎么解决,等别人merge好了再说
git reset --hard
5)老子正在改代码,有个同事过来临时叫我改点东西,那就先把刚改的缓存起来吧
git stash
改完那个问题之后,继续找出刚才的代码
git stash pop
- 丢弃所有新建的文件
git clean -df #返回到某个节点
4. 重新安装git之后、创建rsa 密钥出现 hzliaobolin%USEROROFILE%.ssh/ 不存在,rsa文件不能保存
USEROROFILE 原本是不存在的,是使用git config --global user.name 之后才会出现的,而且这个文件夹应该保存在C:\user\hzliaobolin\下,其实这个文件夹必须在git安装完成之后立即配置git config --global 才会生成
而安装完git之后,打开git、默认进入的路径是C:\user\hzliaobolin\,在此文件夹下配置用户信息就可。需要正确按照不走安装git
1) 安装git完成、打开git。显示的路劲应该是C:\user\hzliaobolin、然后配置个人信息
git config --global user.name "lbl"
git config --global user.email "hzliaobolin@corp.netease.com"
配置完成之后、会在C:\user\hzliaobolin下生成一个%USEROROFILE%文件夹。
2) 生成git 的ssh key
进入到C:\user\hzliaobolin\目录下、看看是否有.ssh文件夹存在.
如果存在:
清空.ssh文件夹、在C:\user\hzliaobolin文件夹下打开git
然后 cd .ssh
ssh-keygen -t rsa -C "hzliaobolin@corp.netease.com" 按三个回车,密码为空
3)在github上添加ssh密钥,把id_rsa.pub复制粘贴即可
5. 使用git pull 代码或者是git checkout 切换分支时出现 Unlink of file 'templates/media/container.html' failed. Should I try again? (y/n)
出现这个问题的主要原因是由于有其他应用也运行着本地工程里的一些文件,导致更新文件或者切换分支的时候其他应用汇阻止git moving该文件。导致操作失败,
解决方法是找到打开这个文件的应用并将其关闭,实在找不到,那么把其他应用全关了就ok。
使用git diff 查看文件修改了哪些部分
还没有git add . 时:
git diff 查看全部文件的修改
git diff filename 查看具体某一个文件的修改
git add . 之后:
git diff --cached 查看全部文件的修改
git diff --cached filename 查看具体某一个文件的修改
6. 使用git stash 缓存修改 或把修改迁移到其他的分支
当我们当dev分支开发时,突然需要到master分支去改个bug,懒得提交了,那么我们可以使用git stash 把修改的内容缓存起来。然后切到master改完bug之后再切回dev分支,再执行git stash pop,我们的修改又回来到工作区了
当我们在master分支修改代码时,发现我操,分支错了,但是那么多的代码不舍得删啊。那么我们可以使用git stash 先把代码缓存,然后切到dev分支,再使用git stash pop 把代码还原回来了。
git stash list 查看所有的缓存列表
git stash pop [--index] 还原最新/指定的缓存,同时把缓存记录从缓存列表里面删掉
git stash apply [--index] 还原最新/指定的缓存, 不删掉缓存记录
git stash drop [--index] 删除最新的缓存/指定的缓存
git stash clear 删除所有分支的缓存
7. 使用git重命名本地/远程分支
先切换到需要重命名的分支,然后执行以下的命令
git branch -m old_branch new_branch # 重命名本地分支,此时老的分支已不存在
git push origin :old_branch # 删掉远程的老的分支
git push --set-upstream origin new_branch # 推送新的本地分支到远程,并设置本地分支跟踪新的远程分支
8. 使用git bash生成密钥/公钥,并拷贝私钥要github中
今天重装了下git,push代码的时候提示没有权限
lbl@lbl-PC MINGW64 /g/workspace/wuyanxia (master)
$ git pull
The authenticity of host 'github.com (xxx.xx.252.123)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,xxx.xx.252.123' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
发现是忘记生成秘钥了,导致跟以前保存在github中的ssh key不对应,所以不能push代码,于是又去找命令生成了一遍,忘得太快,还是记录一下好:
- 随便一个目录打开git bash
- 运行命令 cd ~/.ssh
- ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- 连续三个回车,然后到c盘下的.ssh文件下就可以看到秘药跟公钥的文件了
- 打开id_rsa文件,复制全部的内容,然后打开github
这样就ok了。
9、在windows 7下面git bash 反应异常缓慢
重新装了git最新版本之后,发现在git bash中输入命令之后,一两秒钟才有反应,异常的卡,google了下,找到了解决方法,只要出入一下三条命令就可以了
$ git config --global core.preloadindex true
$ git config --global core.fscache true
$ git config --global gc.auto 256
10、git add 出现/./.git/index.lock': File exists..操作异常
当执行git add 或者git checkout时都提示. /.git/index.lock': File exists.错误,导致git使用不了
只需要去.git目录下把index.lock文件删掉就好了
$ git add .
fatal: Unable to create 'E:/javaWorkspace/study-platform/.git/index.lock': File exists.
Another git process seems to be running in this repository, e.g.
an editor opened by 'git commit'. Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue.
git 删除删除分支命令
删除远程分支: git push origin --delete branch-name
删除本地分支: git branch -d branch-name
git 同步远程于本地的分支
使用git branch 查看本地分支与用git branch -r查看本地存的远程分支,发现有些分支在代码仓库中已经被删掉,需要同步。
git remote prune origin // 删除掉没有与远程分支对应的本地分支
11、设置git pull 的默认行为为rebase
git pull操作会先把代码拉下来,然后进行merge,会把一些commit合并掉,然后只有一条merge纪录,不方便review,所以最好改成rebase方式,保留commit
In git >= 1.7.9:
git config --global pull.rebase true
In git < 1.7.9:
git config --global branch.autosetuprebase always