git特殊操作

180 阅读4分钟

Git特殊操作

1. Git回滚

Git强制回滚到某个版本

  1. 查看commit_id
git log 
或
git log --oneline

image.png

image.png

  1. 回滚到指定的版本

如果是合并的 uat/ master分支 回滚的commit_id 必须为merge 的commit_id ;若为某个开发分支提交的commit_id 会导致 同一时间并行的代码丢失

语法: git reset --hard commit_id

例如:
git reset --hard 2f36123ea02777ec1dd1540dc8b0de5904452b81
或
git reset --hard 2f36123
  1. 强制push本地版本覆盖远程版本
git push -f origin {dev}(dev是要覆盖的分支)

备注

1.commit_id 可以是全的整个id, 也可以是前7位

问题

回滚时可能会出现如下报错:
You are not allowed to push code to protected branches on this project

原因:
gitlab对应的分支进行分支保护设置

解决方法:
1. 修改gitlab "Settings" -> "Repository" -> scroll down to "Protected branches" 改成unprotected就好

2. 使用revert

Git回滚某次或多次提交

  1. 查看commit_id
git log 
或
git log --oneline

2 ) 回滚某几次的提交记录

语法: 
git revert commit_id
git revert commit_id1 commit_id2 commit_id2

3 ) 推送到远程分支

git push

两种回滚方式的区别

git reset & git revert 区别:
1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit2. 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
3. git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
 
 
解决Git Revert操作后再次Merge代码被冲掉的问题:
要解决这个问题,需要把revert产生的提交再revert一次.

因为git revert是用新提交覆盖旧提交,因此,被覆盖的提交等于不会被采用了。如果两个分支(假设是master和A分支)先合并再用revert回滚,之后又合并(A合并到master),就会发现在master分支上,A分支第一次合并之前的修改大部分不见了。这是因为从时间的发生顺序来看,A分支第一次合并之前的修改发生在revert之前,revert发生在后,而 revert抛弃了A第一合并之前的修改,那么再合并Git就认为你永远抛弃了A第一次之前的修改。

2. Git 只合并某次提交到master

git checkout master  
git cherry-pick commitid  

3. 合并某个分支上的一系列commits

  1. 假设你需要合并feature分支的commit 76cada ~62ecb3 到master分支
dd2e86 - 946992 -9143a9 - a6fd86 - 5a6057 [master]

76cada - 62ecb3 - b886a0 [feature]
  1. 首先需要基于feature创建一个新的分支,并指明新分支的最后一个commit:
切换到feature分支:

git checkout feature

基于feature创建一个新的分支:

git checkout -b newbranch 62ecb3
  1. rebase这个新分支的commit到master(--ontomaster)。76cada^ 指明你想从哪个特定的commit开始
git rebase --ontomaster 76cada^

4. git分支合并冲突示意图

image.png image.png

5. Git修改分支名称

www.jianshu.com/p/cc740394f…

6. Git修改commit信息

www.jianshu.com/p/098d85a58…

7.Git合并时遇到冲突或错误后取消合并

git merge --abort

8.修改分支名称

重建分支时备份老分支

先checkout需要重命名的分支到本地

1). 重命名远程分支对应的本地分支
git branch -m oldName newName

2). 删除远程分支
git push --delete origin oldName

3). 上传新命名的本地分支
git push origin newName

4).把修改后的本地分支与远程分支关联
git branch --set-upstream-to origin/newName

9.项目同时在gitee和github管理

# 把本地库和远程的gitee关联
git remote add gitee xxxxx(gitee地址)

# 把本地库和远程的github关联
git remote add github xxxx(github地址)

# 查看关联库信息
git remote -v

# 推送到github
git push github master

# 推送到gitee
git push gitee master