从某个历史提交创建新的分支,并且切换到新分支:
#selected-branch 可为 hash值、分支名字 或者 tag名字 等
git checkout -b name-of-new-branch selected-branch
从某个tag创建新的分支,并且切换到新分支:
git checkout -b name-of-new-branch tag-name
新增一个 tag
git tag -a v1.0.1 -m "注释"
git push origin v1.0.1
删除 tag
#删除本地 tag
git tag -d v1.0.1
#删除远程 tag
git push origin --delete tag v1.0.1
#简写
git push origin :v1.0.1
创建分支:
#创建一个分支
git branch branchName
#创建并切换到新分支
git checkout -b branchName
#推送到远程
git push origin branchName
#查看本地分支
git branch
#查看远程分支
git branch -r
删除分支:
#删除本地分支
git branch -d branchName
#删除远程分支
git push origin --delete branchName
#简写
git push origin :branchName
分支合并:
# 假设当前在dev分支已经完成开发,并且已经将代码推送至远程仓库。现在要将dev分支的代码合并到main分支
# 1.从dev分支切换至main分支
git checkout main
# 2.更新本地main分支代码,保持与远程仓库main分支代码同步
git pull origin main
# 3.将本地dev分支代码合并至main分支
git merge dev
# 4.如果有冲突,认真修改冲突,修改完冲突,将本次修改及代码合并产生的变化推送至远程仓库
git add .
git commit -m "解决分支合并的冲突"
git push origin main
# 5.通知其他相关的开发人员,确认本次合并是否有功能丢失的问题(重要)
冲突解决方案:
# 分支合并或者多人共同开发工程中,经常会出现冲突。
# 为了避免因为冲突,造成的代码丢失问题,只能细心处理每一次冲突,熟悉git的操作原理。
# 一定不要强制提交(使用图形化工具的时候,看清楚每次弹框提示语)
# 冲突产生的原因:当前的分支和要合并的分支存在共同改变一个或多个文件的情况。
# 但机器并不知道要保留哪些更改,或者丢弃哪些更改,需要人工手动选择。
$ git merge dev
Auto-merging readme.md
CONFLICT (content): Merge conflict in readme.md
Automatic merge failed; fix conflicts and then commit the result.
解决冲突的方案:1.保留当前分支的修改 2.保留合并进来的分支的修改 3.都保留
具体情况,根据具体业务处理,如下图:
代码回退:
git reset 用于回退版本,可以遗弃不再使用的提交。
# 没有指定commit_id, 暂存区的内容会被当前commit_id版本号的内容覆盖,工作区不变
git reset
# 指定commit_id(git提交记录的hash值),暂存区的内容会被指定commit_id版本号的内容覆盖,工作区不变
git reset commit_id
# --mixed(默认):默认的时候,只有暂存区变化
# --hard参数:如果使用 --hard 参数,那么工作区也会变化
# --soft:如果使用 --soft 参数,那么暂存区和工作区都不会变化
# 一般的使用步骤
git reset --hard commit_id
git push origin HEAD --force #远程提交回退
# 重点 重点 重点
# 当你执行完 git reset 并且已经推送到远程后,
# 你本地的分支已经回到上图里的 B 位置,而其他开发同事还在 D 位置
# 通知其他开发同事,执行以下命令,同步代码
git reset --hard origin/master(所在的分支名字)
git revert 在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化,不会改变过去的历史,主要是用于安全地取消过去发布的提交。(目前 git 图形化工具默认使用的回退是 git revert)
git revert commit_id
# 撤销前一个提交
git revert HEAD
# 撤销前前一个提交
git revert HEAD^
区别:
- git revert 是用一次新的 commit 来回滚之前的 commit,git reset 是直接删除指定的 commit。
- git reset 是把 HEAD 向后移动了一下,而 git revert 是 HEAD 继续前进,只是新的 commit 的内容和要 revert 的内容正好相反,能够抵消要被 revert 的内容。
- 在回滚这一操作上看,效果差不多。但是在日后继续 merge 以前的老版本时有区别。
区别如下:
git revert 是用一次逆向的 commit “中和”之前的提交,因此后面再次合并老的 branch 时,之前提交合并的代码仍然存在,导致不能够重新合并。
但是 git reset 是之间把某些 commit 在某个 branch 上删除,因而和老的 branch 再次 merge 时,这些被回滚的 commit 应该还会被引入。
- 如果回退分支的代码以后还需要的情况则使用 git revert, 如果分支是提错了没用的代码并且不想留下提交记录,则使用 git reset 。