git常见问题
1,ssh
在 github 上添加 SSH key:
https://www.cnblogs.com/blogzhangwei/p/5944975.html
远程分支推送详解:
https://www.cnblogs.com/dyh-air/p/9257237.html
cd ~/.ssh ls //生成秘钥(包括公钥和私钥,中间不用设置密码,免得忘记) ssh-keygen -t rsa -C "13260634356@163.com" //测试是否和远程服务器是否连接成功 ssh -T git@github.com
2,git pull 提示:
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
是因为本地分支和远程分支没有建立联系 (使用git branch -vv 可以查看本地分支和远程分支的关联关系) .根据命令行提示只需要执行以下命令即可
git branch --set-upstream-to=origin/远程分支的名字 本地分支的名字 //是本地分支与远程分支建立关联关系
git pull origin master --allow-unrelated-histories //合并两个独立的仓库
3,关联远程仓库
git remote add origin git@github.com:michaelliao/learngit.git
//
git push -u origin master
// -u:第一次带上这个参数,可以把本地master分支和远程master分支关联起来
//之后不用带-u这个参数
git clone url重远程仓库克隆
4,解决冲突
解决冲突,手动解决后重新走下面的步骤:
git add xxx//将工作区修改添加到暂存区stash,反操作为:git checkout -- .
git commit -m 'xxxx' git pull git push -u origin master git rebase --continue
5,版本回退:
//在Git中,用HEAD
表示当前版本
git reset --hard commit_id //返回到指定版本
git reset --hard HEAD^//返回到上一版本,或者
git revert HEAD
//撤销修改
git reset HEAD //回到git add 之前,但工作区可能已经修改;
git checkout -- <file>//工作区已修改,丢弃工作区的修改
git checkout -- . //丢弃工作区的全部修改
git checkout #其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
//从来没有被添加到版本库就被删除的文件,是无法恢复的!
git checkout 如果不加--file,就是切换到另一个分支
6,分支管理
git checkout -b dev//创建并切换分支 //相当于: git branch dev//创建分支 git checkout dev//切换分支 //查看分支: git branch //把dev分支的工作成果合并到master分支上 git merge dev //删除dev分支 git branch -d dev
//git强制覆盖本地命令(单条执行):
git fetch --all && git reset --hard origin/master && git pull
第一个是:拉取所有更新,不同步;
第二个是:本地代码同步线上最新版本(会覆盖本地所有与远程仓库上同名的文件);
第三个是:再更新一次(其实也可以不用,第二步命令做过了其实)
7,解决冲突
//Git pull 强制覆盖本地文件 git fetch --all git reset --hard origin/master git pull
8,添加远程仓库管理
Command line instructions Git global setup git config --global user.name "kuangzheng" git config --global user.email "kuangzheng@cmstop.com" #Create a new repository(场景一:本地没有仓库和项目) git clone git@git.meitiyun.org:answer/testReadme.git cd testReadme touch README.md git add README.md git commit -m "add README" git push -u origin master #Existing folder(场景二:本地已存在项目,没有仓库) cd existing_folder git init git remote add origin git@git.meitiyun.org:answer/testReadme.git git add . git commit -m "Initial commit" git push -u origin master #Existing Git repository(场景三:已存在一个本地仓库,当然已有项目) cd existing_repo git remote add origin git@git.meitiyun.org:answer/testReadme.git git push -u origin --all git push -u origin --tags //git push的时候可能会出现失败 fatal: refusing to merge unrelated histories,解决办法: //先 git pull remote_name master --allow-unrelated-histories //然后 git push -u remote_name master
9,清除本地缓存
.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
git rm -r --cached .idea/ git add . git commit -m 'delete .idea' git push -u origin master -f //强制提交 //编写.gitignore文件,并把所有忽略提交的文件都写入提交
10,推送本地所有分支和拉取远程所有分支
#推送本地所有分支到远程 git remote add origin_name remote_url git push origin_name --all #从远程拉取所有分支到本地 #简单使用git clone ,git fetch --all, git pull --all 都不能全部一次获取远程的所有分支,他们都只对master分支起作用,
#所以一次性拉取所有远程分支到本地应该使用 git clone的--mirror参数,但是这样会把它初始化为一个bare仓库,所以需要去掉这个属性 ,
#依次输入以下三个命令即可: git clone --mirror remote_url cd project_root git config --bool core.bare false
11,gitee 如何避免每次提交都要输入账号和密码问题
在选择了https的方式作为远程的方式适合,https的访问方式决定了每次都需要验证用户名&用户密码的;
只要采用SSH的方式,就避免了上面https的方式的每次验证用户名&用户密码,省去了不少的麻烦
//方式一:重置远程仓库 git remote rm origin git remote add git@gitee.com:Yourgitee_username/YourGitRepo.git //方式二:修改远程仓库的url git remote set-url origin-name url
12,本地分支回滚了,需要远程分支也回滚
Updates were rejected because the tip of your current branch is behind
参考:https://blog.csdn.net/zhangkui0418/article/details/82977519
方法1:先本地回滚,再创建一个新分支,删掉错误分支,再把新的分支命名为错误分支
git reset --hard commit-id #本地分支回滚
git checkout -b branch-new #创建本地新分支
git branch -D branch-old #删除本地错误分支
git branch -dr origin/branch-old #删除远程错误分支
git branch -m branch-new branch-old #本地修改
git push -u origin branch-old #推送到远程
方法2:使用强制push的方法: git push -u origin master -f 这样会使远程修改丢失,一般是不可取的,尤其是多人协作开发的时候。
13,分支branch和提交commit顺序的关系
git merge
git merge操作合并分支会让两个分支的每一次提交都按照提交时间(并不是push时间)排序,
并且会将两个分支的最新一次commit点进行合并成一个新的commit,最终的分支树呈现非整条线性直线的形式
git rebase
git rebase操作实际上是将当前执行rebase分支的所有基于原分支提交点之后的commit打散成一个一个的patch,并重新生成一个新的commit hash值,
再次基于原分支目前最新的commit点上进行提交,并不根据两个分支上实际的每次提交的时间点排序,
rebase完成后,切到基分支进行合并另一个分支时也不会生成一个新的commit点,可以保持整个分支树的完美线性
git rebase可以修改提交顺序,不按提交时间来排序
参考:https://www.dazhuanlan.com/2020/01/17/5e20e1adeaea3/
14,github官网进不去(已失效)
github.com配置ip为
https://websites.ipaddress.com/github.com
github.global.ssl.fastly.net配置ip为
https://websites.ipaddress.com/github.global.ssl.fastly.net
若不能访问,更新DNS缓存,打开CMD运行如下命令 ipconfig /flushdns 再试一下
15,仓库地址是https协议的,每次需要输入账号密码解决办法
1.设置记住密码(默认15分钟): git config --global credential.helper cache 2.设置一个小时之后失效: git config --global credential.helper 'cache --timeout=3600' 3.长期存储密码: git config --global credential.helper store #具体操作: 1打开 git bush 执行一下这个命令 git config --global credential.helper store 2触发下(拉取),输入帐号密码 3再拉取下,就不会出现要输入帐号密码了 #不加--global则只对本项目生效
16,github双因子认证