1. 拉取最新主干代码,进行功能迭代或 bug 修复
- 首先切换到主干:
git checkout master
- 然后拉取最新代码:
git pull
- 基于 master 创建本地分支 xxx:
git checkout -b feature/xxx
- 将本地分支 xxx push 到远程 Git 库:
git push --set-upstream origin feature/xxx
2. 如何重命名远程分支
例如远程分支为:feature/xxx。
- 首先切换到该远程分支对应的本地分支:
git checkout feature/xxx
- 拉取下最新代码:
git pull
- 进行重命名:
git blame -m feature/xxx feature/login
- 将 feature/login 推动远程 Git 库:
git push --set-upstream origin feature/login
- 删除老旧远程分支:
git push origin --delete feature/xxx
3. 功能开发一半,临时修复线上紧急 bug
这个时候,新功能开发代码可能还没完成,我们需要把当前的工作进度保存下,等修复 bug 后再转过头来继续开发。
- 保存当前的工作进度,并附上注释:
git stash save "add login func"
- 获取 stash list:
git stash list
- 修复完 bug 后,还原之前的工作进度:
git stash pop stash@{
index}
4. 如何挑拣别人的 commit
对于同一功能的不同分支,可能其他开发对该功能进行 bugfix,这个时候我们也想用在自己的分支 fix 这个 bug,注意不要脑残贴代码呢,敲黑板!!!
- 获取其他开发者修复的 commitId:
git log 或 git reflog
- 挑拣别人的 commitId 到自己的分支:
git cherry-pick commitId
5. 如何回退版本
对于某一错误操作致使项目无法正常运行,我们需要对某一点进行还原,有点类似电脑操作系统的备份点或还原点;这个操作会使 git 指针往后退,所以在 push 的时候需要强制 push 才能成功!
- 获取还原点,还原点选择很重要,需要选择正确版本的最新:
commitId
- 回退版本:
git reset commitId
- 查看 reset 后的代码更改项:
git status
- 忽略更改项,直接强制 push:
git checkout .
git push -f
6. 如何撤销某一个 commit
撤销操作和回退操作唯一不同的是,撤销的操作指针是往前的,回退的操作指针是往后的;撤销相当于相互抵消,等于白干!
- 获取需要撤销的 commitId。
- 进行撤销:
git revert commitId
7. 如何合并分支
当功能分支测试完成,一切就绪后,需要同步下 master 分支,避免不必要的冲突;这个时候有两个选择:
git merge origin/master
git merge --no-ff origin/master
两者有什么区别呢?
-ff
默认情况是快进式(即 fast-forward),当合并两个分支时,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,叫做“快进”(fast-forward);这种情况如果删除分支,则会丢失 merge 分支信息。
--no-ff
关闭 fast-forward 模式,在提交的时候,会创建一个 merge 的 commit 信息,然后合并与 master 分支 merge 的不同行为,向后看,其实最终都会将代码合并到 master 分支,而区别仅仅只是分支上的简洁清晰的问题,然后,向前看,也就是我们使用 reset 的时候,就会发现,不同的行为就带来了不同的影响。
--squash
把一些不必要 commit 进行压缩,比如说,你的 feature 在开发的时候写的 commit 很乱,那么我们合并的时候不希望把这些历史 commit 带过来,于是使用 --squash
进行合并,此时文件已经同合并后一样了,但不移动 HEAD,不提交。需要进行一次额外的 commit 来“总结”一下,然后完成最终的合并。
这里笔者强烈推荐用 --on-ff
模式,这样合并上来的分支 commit 一目了然,便于后期的版本更迭。