Git特殊操作
1. Git回滚
Git强制回滚到某个版本
- 查看commit_id
git log
或
git log --oneline
- 回滚到指定的版本
如果是合并的 uat/ master分支 回滚的commit_id 必须为merge 的commit_id ;若为某个开发分支提交的commit_id 会导致 同一时间并行的代码丢失
语法: git reset --hard commit_id
例如:
git reset --hard 2f36123ea02777ec1dd1540dc8b0de5904452b81
或
git reset --hard 2f36123
- 强制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回滚某次或多次提交
- 查看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是直接删除指定的commit。
2. 在回滚这一操作上看,效果差不多。但是在日后继续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
- 假设你需要合并feature分支的commit 76cada ~62ecb3 到master分支
dd2e86 - 946992 -9143a9 - a6fd86 - 5a6057 [master]
76cada - 62ecb3 - b886a0 [feature]
- 首先需要基于feature创建一个新的分支,并指明新分支的最后一个commit:
切换到feature分支:
git checkout feature
基于feature创建一个新的分支:
git checkout -b newbranch 62ecb3
- rebase这个新分支的commit到master(--ontomaster)。76cada^ 指明你想从哪个特定的commit开始
git rebase --ontomaster 76cada^
4. git分支合并冲突示意图
5. Git修改分支名称
6. Git修改commit信息
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