git 版本控制问题集合

git作为分布式协作版本控制工具, 在使用的过程中常常会遇到各种问题, 下面列举比较常见的一些问题及其解决办法.

一. 创建分支并关联远程分支

**1.查看远程分支**

git branch -r //查看所有远程分支
git branch -a //查看所有远程分支和本地分支
git branch //查看所有本地分支

2.拉取远程分支并创建本地分支
需求: 其他小伙伴已经创建了a分支,并推到远程分支了,你需要拉取a分支并在本地创建a分支

方法1:git checkout -b a origin/a // 使用该方式会在本地新建分支a,并自动切换到该本地分支a。
并且采用此种方法建立的本地分支会和远程分支建立映射关系。

方法2:git fetch origin a:a //使用该方式会在本地新建分支a,但是不会自动切换到该本地分支a,需要手动checkout。采用此种方法建立的本地分支不会和远程分支建立映射关系。

3.本地分支和远程分支建立映射关系的作用

git branch -vv   // 查看本地分支和远程分支的映射关系(跟踪关系track),前面带*号的表示当前分支
git branch -u origin/分支名   // 手动建立本地分支和远程分支都有映射关系
git branch --set-upstream-to origin/分支名      // 手动建立当前分支与远程分支的映射关系
git branch --unset-upstream   // 撤销本地分支与远程分支的映射关系

问题思考:本地分支只能跟踪远程的同名分支吗?
答: 否,操作时指定和本地分支名不同的远程分支名即可。

二. 版本回退与前进问题

1.本地回退:
git log //查看提交的历史 	
git log --pretty=oneline //如果嫌上面的输出信息过多可以使用这条(只输出版本号) 	
git reflog //用git log是看不出来被删除的commitid,用git reflog则可以看到被删除的commitid ,并且可以看到所有分支的commit 
git reset --hard HEAD^ //回到上个版本, 	
git reset --hard HEAD^^是上上个版本 	
git reset --hard HEAD~1 回到指定上几个版本, 数字从0开始,1表示回退到上上个版本 	
git reset --hard 版本号 要回到指定版本, 直接在后面加版本号即可.

2.自己的远程分支回退
先reset, 然后执行 git push -f origin 远程分支名
3.公共分支回退:
	git revert HEAD //撤销最近一次提交
	git revert HEAD~1 //撤销上上次的提交,注意:数字从0开始
	git revert 0ffaacc //撤销0ffaacc这次提交

4.前进到某个版本

git reset --hard aff8f0892

更多请移步这里: https://blog.csdn.net/qq_37210523/article/details/84856794

三. 保存/恢复进度

如果在写一个新功能的时候,突然接到一个紧急bug,必须马上解决, 但是这个bug不能在当前分支上解决, 其次新功能还没写完, 并不想现在提交, 怎么办?
git stash闪亮登场!

(1)git stash适用场景

1.发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时就可以考虑git stash

2.使用git的时候,我们往往使用分支(branch)解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码,如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个 紧急Bug,那么使用git stash就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修Bug,等到修完Bug,提交到服务器上后,再使用git stash apply 将以前一半的工作应用回来。

3.经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。储藏(stash)可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

(2)使用git stash

git stash //会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。
git stash pop // 重新应用缓存的stash
git stash list //查看现有stash
git stash drop //移除stash
git stash show //查看指定stash的diff
git stash branch //从stash创建分支

四.撤销merge操作

git revert -m 1 18d290169ac80120c4401f17719122c3500ecfaf

更多请查看这里: https://blog.csdn.net/qq_37210523/article/details/84857075

五. 修改commit信息

1.如果这是你最近一次提交并且没有push到远程分支,可用以下命令直接修改:
 git commit --amend -m "your new message"

其他情况请参考这篇文章: https://blog.csdn.net/sodaslay/article/details/72948722

六. push相关问题

**1.遇到如下错误:**

无法推送 refs 到远端。您可以试着运行“拉取”功能,整合您的更改。

问题描述:在远程分支已经有了一个a分支, 这时我本地也新建了一个a分支, 当我push时提醒了远程没有a分支, 原因是本地a分支没有和远程a分支建立关联, 于是我pull,就遇到上面这个提示。
解决:
在a分支执行 git pull origin a 让本地分支与远程分支相关联, 然后push上去即可。
扩展:
如果是想在本地新建分支并且远程并没有建立该分支,可以直接执行以下操作:

git checkout -b dev 新建并切换到本地dev分支
git pull origin dev 本地分支与远程分支相关联

2.Git推送遇到 Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., ‘git pull …’) before pushing again.

原因:
新推送的的分支与项目分支没有进行关联。
解决:
git branch --set-upstream-to=origin/ master  

如果在执行以上命令时出现:
在这里插入图片描述
请将–set-upstream 替换为 --track
扩展:
(1)查看分支:

git branch //查看本地分支
git branch -a //查看本地和远程分支

(2)删除分支

git branch -D test //删除本地分支
git push origin:test //删除远程分支, 需要有权限
注:删除时需要先切换到其他分支再操作

3.Git操作失败并提示Another git process seems to be running in this repository或者 Unable to create xxx/.git/index.lock’: File exists.

原因: 在于Git在使用过程中遭遇了奔溃,部分被上锁资源没有被释放导致的。

解决: 进入项目文件夹下的 .git文件中(显示隐藏文件夹或rm .git/index.lock)删除index.lock文件即可。


如果遇到git密钥问题, 请[移步这里](https://blog.csdn.net/qq_37210523/article/details/80994002).

参考链接:

Git高级教程(二)] 远程仓库版本回退方法

Git恢复之前版本的两种方法reset、revert(图文详解)

Git revert使用和例子

廖雪峰的官方网站-git版本回退

解决git提交敏感信息(回退git版本库到某一个commit)

git回退到某个版本并提交到远程仓库

git revert 实战

git reset revert 回退回滚取消提交返回上一版本

git stash用法小结

如何修改Git commit的信息

How to modify existing, unpushed commits?

git 本地分支与远程分支关联的一种方法

Git远程推送常见错误及解决方案:

你可能感兴趣的:(git的踩坑之旅)