前言
开个坑,记录一下git一些使用场景和对应操作
错误提交commit
# 回退一次commit
git reset --hard HEAD^
# 回退到某次commit
git reset --hard <commit_id>
如果使用git revert,会留下两条记录。
特别是不小心将master合并到current branch时候,如果用revert来撤销修改,那么接下来的PR会产生非常多的conflict
接着将本地reset完的结果push上去
git push --force origin <branch_name>
初始化
这个过程不算进阶,只不过我平时一直用github desktop操作,十分不熟悉罢了。
git init
git remote add origin [email protected]:xxxx.git
出于安全考虑,Github 服务器和我们本地的通讯要求使用 SSH Key 来验证
# 网上的一些方案无法生成可用的SSH key
ssh-keygen -t rsa -b 4096 -C "[email protected]"
放到github中便可
git clone 相关
使用github的镜像网站进行访问,github.com.cnpmjs.org,我们将原本的网站中的github.com 进行替换。
如
git clone https://github.com.cnpmjs.org/graykode/gray.git
之后会得到项目文件夹,进去后.git内就包含了远程仓库项目的所有信息
root@hecs-x-large-2-linux-20200730202807:~/code/iLife/iLife# git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/auth
remotes/origin/back-end-baiduai
remotes/origin/back-end-bili
注意:使用这个方法后,push,fetch可能需要多次才能成功
error:src refspec master does not match any
引起该错误的原因是,目录中没有文件,空目录是不能提交上去的,而且在push之前至少有过一次commit才能提交
HEAD detached at origin/master
这是由于当切换到远端master时候
git checkout origin/master
提示如下内容
$ git status
HEAD detached at origin/master
Untracked files:
(use "git add <file>..." to include in what will be committed)
iLife/
nothing added to commit but untracked files present (use "git add" to track)
说明现在是一个匿名分支状态
正常情况下,HEAD指向一个branch,而branch又指向一个commit。
detached HEAD state指的是HEAD指针没有指向任何的branch,而是指向了一个commit
因为HEAD不能指向远程分支,它只能指向本地的某个commit或者本地分支。当"git checkout 远程分支",而本地又没有这个分支,HEAD就会直接指向远程分支指向的commit了,HEAD指向commit就会进入detached HEAD state。
于是:
git checkout -b 分支名
让一个branch指向这个commit链即可恢复正常
删除本地未提交的更改
一直用desktop导致命令行很不熟练0 0
删除本地所有未提交的更改:
git checkout .
删除本地对file文件的更改
git checkout -- file
每次git pull都需要auth
如果我们git clone的下载代码的时候是连接的https://而不是git@git (ssh)的形式,当我们操作git pull/push到远程的时候,总是提示我们输入账号和密码才能操作成功,频繁的输入账号和密码会很麻烦。
解决办法:
git bash进入你的项目目录,输入:
git config --global credential.helper store
然后你会在你本地生成一个文本,上边记录你的账号和密码。当然这些你可以不用关心。
然后你使用上述的命令配置好之后,再操作一次git pull,然后它会提示你输入账号密码,这一次之后就不需要再次输入密码了。
gitignore失效问题
如果项目一开始没有添加gitignore,后面添加gitignore会失效,因为git已经将这些文件夹加入项目管理了。删除缓存即可
git rm -r --cached .
git add .
git commit -m "update gitignore"