git常见问题

1,ssh

在 github 上添加 SSH key:

https://www.cnblogs.com/blogzhangwei/p/5944975.html

远程分支推送详解:

https://www.cnblogs.com/dyh-air/p/9257237.html

ssh-key生成密钥及SSH无密码登录的配置

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 pull --rebase origin master
git status

解决冲突,手动解决后重新走下面的步骤:

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/

 



原文地址:https://www.cnblogs.com/tkzc2013/p/11882104.html